大神救救我

weixin_44978462 2019-08-01 12:42:36
我从数据库里读表,存到DataGrid里,然后对每一行进行操作,提取里面的值去数据库里做条件查需要的值,然后根据这个值判断,去赋值 a,b,c等等我用for循环会卡死
...全文
1904 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuzhaowei 2019-08-05
  • 打赏
  • 举报
回复
代码和具体的场景不贴出来,很难对症下药。
qq_33878851 2019-08-04
  • 打赏
  • 举报
回复
weixin_42171260 2019-08-04
  • 打赏
  • 举报
回复
个型号多的,伪问题的
weixin_45465140 2019-08-04
  • 打赏
  • 举报
回复
daimane,代码呢?。。。。。。。111111
知增 2019-08-03
  • 打赏
  • 举报
回复
CPoet 2019-08-03
  • 打赏
  • 举报
回复
引用 4 楼 weixin_44978462 的回复:
[quote=引用 3 楼 ManBOyyy的回复:]是不是一直循環一個方法,所以沒有退出循環所以?
有的但是要循环90000多次,数据有点多[/quote]这也不行,每次循环你都有读一次表,这对数据库压力很大。建议你重新设计表结构,把关键数据通过join或者视图方式一次性读取,然后尽量用空间换取时间,你这90000多次的循环
jeasehhhhh 2019-08-03
  • 打赏
  • 举报
回复
这个问题很典型啊,我也想值得这么解决
han1525 2019-08-03
  • 打赏
  • 举报
回复
厉害的大神快来救救这位兄弟
weixin_44978462 2019-08-02
  • 打赏
  • 举报
回复
next fetch和row number代码差那么多?
XBodhi. 2019-08-02
  • 打赏
  • 举报
回复
引用 10 楼 weixin_44978462 的回复:
[quote=引用 9 楼 XBodhi.的回复:]分页 分页 分页 分页

能教我一下怎么分页吗?[/quote]


2种方法, 一个 是 row number(SQL SERVER 2005+) ,另一种是 next fetch (SQL SERVER 2012 +)

row number 的代码如下:


USE #_$_DBNAME_$_#
GO
/*
功能描述:公共分页存储过程
编写人:乔虎跃
创建日期:2013年06月27日
版  权:Copyright © QiaoHY(乔虎跃)。
*/
IF OBJECT_ID('PROCEDURE_COMMONPAGING') IS NOT NULL
DROP PROCEDURE PROCEDURE_COMMONPAGING
GO
CREATE PROCEDURE PROCEDURE_COMMONPAGING
(
@TOTALRECORDCOUNT INT OUTPUT,--总记录数
@TOTALPAGECOUNT INT OUTPUT, --总页数
@PAGEINDEX INT,--页索引
@PAGESIZE INT,--每页的数量
@INPUTSQLSTRING NVARCHAR(MAX),--输入的SQL语句字符串
@ORDERBY NVARCHAR(256)--要排序的字段名。格式:{Field1 [SortMode(DESC | ASC)]......,n [SortMode(DESC | ASC)]}
)
AS
BEGIN
BEGIN TRY
DECLARE @TRCSQL NVARCHAR(MAX)
DECLARE @RSQL NVARCHAR(MAX)
DECLARE @BEGINPAGEINDEX INT
DECLARE @ENDPAGEINDEX INT

SET @TRCSQL = 'SELECT @TOTALRECORDCOUNT = COUNT(*) FROM ('+@INPUTSQLSTRING+') AS TEMP'
EXECUTE SP_EXECUTESQL @TRCSQL,N'@TOTALRECORDCOUNT INT OUTPUT',@TOTALRECORDCOUNT OUTPUT
--设置分页总页数。
SET @TOTALPAGECOUNT = CEILING((@TOTALRECORDCOUNT+0.0)/@PAGESIZE)


IF (@PAGEINDEX > 1)
BEGIN
IF(@PAGEINDEX > @TOTALPAGECOUNT)
BEGIN
SET @BEGINPAGEINDEX=(@TOTALPAGECOUNT -1) * @PAGESIZE
END
ELSE
BEGIN
SET @BEGINPAGEINDEX=(@PAGEINDEX-1) * @PAGESIZE
END
SET @ENDPAGEINDEX= (@BEGINPAGEINDEX+ @PAGESIZE)
END
ELSE
BEGIN
SET @BEGINPAGEINDEX = 0
SET @ENDPAGEINDEX = @PAGESIZE
END
SET @RSQL ='
SELECT * FROM
(
SELECT TEMP.*,ROW_NUMBER() OVER(ORDER BY '+@ORDERBY+') AS SID
FROM ('+@INPUTSQLSTRING+') TEMP
) T
WHERE T.SID > '+CAST(@BEGINPAGEINDEX AS NVARCHAR)+' AND T.SID <= '+CAST(@ENDPAGEINDEX AS NVARCHAR)+''
EXECUTE sys.SP_EXECUTESQL @RSQL
END TRY
BEGIN CATCH
RETURN SELECT text FROM sys.messages WHERE message_id = @@ERROR AND sys.messages.language_id =2052
END CATCH
END


next fetch 如下:


select [Id]
,[Name]
,[StudentId]
,[MajorId]
from T_Student
order by [Id]
offset 4 rows
fetch next 2 rows only



hztltgg 2019-08-02
  • 打赏
  • 举报
回复
有io堵塞,用后台线程慢慢执行,别卡UI线程就可以了吧。简单加个Async关键字就成
weixin_44978462 2019-08-02
  • 打赏
  • 举报
回复
引用 9 楼 XBodhi.的回复:
分页 分页 分页 分页
能教我一下怎么分页吗?
XBodhi. 2019-08-02
  • 打赏
  • 举报
回复
引用 19 楼 weixin_44978462 的回复:
[quote=引用 18 楼 XBodhi.的回复:]不是都写给你了吗

select [Id]

,[Name]

,[StudentId]

,[MajorId]

from T_Student

order by [Id]

offset 4 rows

fetch next 2 rows only
这不是查询语句吗?[/quote]

对,这个就是最新版的分页。
weixin_44978462 2019-08-02
  • 打赏
  • 举报
回复
引用 18 楼 XBodhi.的回复:
不是都写给你了吗
select [Id] ,[Name] ,[StudentId] ,[MajorId] from T_Student order by [Id] offset 4 rows fetch next 2 rows only 这不是查询语句吗?
XBodhi. 2019-08-02
  • 打赏
  • 举报
回复
不是都写给你了吗
weixin_44978462 2019-08-02
  • 打赏
  • 举报
回复
引用 15 楼 XBodhi.的回复:
是的,因为对版本有要求
怎么可以分页?小白不会
weixin_44978462 2019-08-02
  • 打赏
  • 举报
回复
我试了一下,这是查询语句啊。。。
XBodhi. 2019-08-02
  • 打赏
  • 举报
回复
是的,因为对版本有要求
weixin_44978462 2019-08-02
  • 打赏
  • 举报
回复
引用 12 楼 XBodhi.的回复:
[quote=引用 10 楼 weixin_44978462 的回复:]
[quote=引用 9 楼 XBodhi.的回复:]分页 分页 分页 分页

能教我一下怎么分页吗?[/quote]


2种方法, 一个 是 row number(SQL SERVER 2005+) ,另一种是 next fetch (SQL SERVER 2012 +)

row number 的代码如下:


USE #_$_DBNAME_$_#
GO
/*
功能描述:公共分页存储过程
编写人:乔虎跃
创建日期:2013年06月27日
版  权:Copyright © QiaoHY(乔虎跃)。
*/
IF OBJECT_ID('PROCEDURE_COMMONPAGING') IS NOT NULL
DROP PROCEDURE PROCEDURE_COMMONPAGING
GO
CREATE PROCEDURE PROCEDURE_COMMONPAGING
(
@TOTALRECORDCOUNT INT OUTPUT,--总记录数
@TOTALPAGECOUNT INT OUTPUT, --总页数
@PAGEINDEX INT,--页索引
@PAGESIZE INT,--每页的数量
@INPUTSQLSTRING NVARCHAR(MAX),--输入的SQL语句字符串
@ORDERBY NVARCHAR(256)--要排序的字段名。格式:{Field1 [SortMode(DESC | ASC)]......,n [SortMode(DESC | ASC)]}
)
AS
BEGIN
BEGIN TRY
DECLARE @TRCSQL NVARCHAR(MAX)
DECLARE @RSQL NVARCHAR(MAX)
DECLARE @BEGINPAGEINDEX INT
DECLARE @ENDPAGEINDEX INT

SET @TRCSQL = 'SELECT @TOTALRECORDCOUNT = COUNT(*) FROM ('+@INPUTSQLSTRING+') AS TEMP'
EXECUTE SP_EXECUTESQL @TRCSQL,N'@TOTALRECORDCOUNT INT OUTPUT',@TOTALRECORDCOUNT OUTPUT
--设置分页总页数。
SET @TOTALPAGECOUNT = CEILING((@TOTALRECORDCOUNT+0.0)/@PAGESIZE)


IF (@PAGEINDEX > 1)
BEGIN
IF(@PAGEINDEX > @TOTALPAGECOUNT)
BEGIN
SET @BEGINPAGEINDEX=(@TOTALPAGECOUNT -1) * @PAGESIZE
END
ELSE
BEGIN
SET @BEGINPAGEINDEX=(@PAGEINDEX-1) * @PAGESIZE
END
SET @ENDPAGEINDEX= (@BEGINPAGEINDEX+ @PAGESIZE)
END
ELSE
BEGIN
SET @BEGINPAGEINDEX = 0
SET @ENDPAGEINDEX = @PAGESIZE
END
SET @RSQL ='
SELECT * FROM
(
SELECT TEMP.*,ROW_NUMBER() OVER(ORDER BY '+@ORDERBY+') AS SID
FROM ('+@INPUTSQLSTRING+') TEMP
) T
WHERE T.SID > '+CAST(@BEGINPAGEINDEX AS NVARCHAR)+' AND T.SID <= '+CAST(@ENDPAGEINDEX AS NVARCHAR)+''
EXECUTE sys.SP_EXECUTESQL @RSQL
END TRY
BEGIN CATCH
RETURN SELECT text FROM sys.messages WHERE message_id = @@ERROR AND sys.messages.language_id =2052
END CATCH
END


next fetch 如下:


select [Id]
,[Name]
,[StudentId]
,[MajorId]
from T_Student
order by [Id]
offset 4 rows
fetch next 2 rows only



[/quote] next fetch和row number代码差那么多?
weixin_44978462 2019-08-01
  • 打赏
  • 举报
回复
引用 7 楼 ManBOyyy的回复:
[quote=引用 6 楼 weixin_44978462 的回复:]
[quote=引用 5 楼 ManBOyyy的回复:][quote=引用 4 楼 weixin_44978462 的回复:]
[quote=引用 3 楼 ManBOyyy的回复:]是不是一直循環一個方法,所以沒有退出循環所以?

有的但是要循环90000多次,数据有点多[/quote]
才九萬,你的意思是經常循環9萬次?[/quote]
主要是他每次都要做判断和赋值,查询的操作[/quote]
那沒事的吧,判斷一下和賦值而已[/quote] 现在我是运行后要好久才好,我在想有没有更快的遍历方法
加载更多回复(8)

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧