首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

FOR循环SQL读取6万条记录时不会动了,小弟我这代码怎么改?多谢

2013-10-16 
FOR循环SQL读取6万条记录时不会动了,我这代码如何改?谢谢我用下面的代码测试几百条记录时没有问题,但是测

FOR循环SQL读取6万条记录时不会动了,我这代码如何改?谢谢
我用下面的代码测试几百条记录时没有问题,但是测试正式的达到6万条记录时,就死在那里不动了,请问应该如何写代码才是最优化的?我只要循环读出表中6万条记录的一个字段。非常感谢大家的指教。

for (int i = 0; i < 60000; i++)
    {    
       strSQL = "select * from test where id > " + i; 
       OleDbCommand Cmd = new OleDbCommand(strSQL, MyConn); 
       OleDbDataReader Dr; 
       Dr = Cmd.ExecuteReader();
       Dr.Read();
       int intId = (int)Dr["id"];
       Response.Write("现在读取第" + intId + "条记录<br>");
       Dr.Close();
    }

不好意思我的分不多了,全部奉上,谢谢大家指教
[解决办法]
这样写效率很低 为什么不一次把数据全取出来在内存中操作呢
[解决办法]
这样 只取id

 strSQL = "select id from test where id > " + i; 
[解决办法]
另外,一般取6万肯定不是用于显示,可以把一些逻辑放到sql语句中。

如果用于显示,可以分页。每次取一点。
[解决办法]
select top 60000 id from test order by id asc 
[解决办法]
楼主疯了吧  这是要做什么啊 
[解决办法]

引用:
select top 60000 id from test order by id asc 


这个应该对,没注意lz去6w次,每次都去6w -i条记录
[解决办法]
for (int i = 0; i < 60000; i++)
     {    
        strSQL = "select * from test where id > " + i; 
        OleDbCommand Cmd = new OleDbCommand(strSQL, MyConn); 
        OleDbDataReader Dr; 
        Dr = Cmd.ExecuteReader();
        Dr.Read();
        int intId = (int)Dr["id"];
        Response.Write("现在读取第" + intId + "条记录<br>");
        Dr.Close();
     }
 这样做确实效率低下,首先*应该换成整个字段名,其次都是60000条一起读取,然后做个do until rs.eof之类的,当然这是ado的方法,你这个能失败我怀疑可能是因为太慢,并不是真死,因为如果网页要返回6万行记录需要的时间相当久,而且不能保证浏览器不卡死,你可以在respsonse.Write后加个flush试试,看看你的硬件能跑到多少行,当然这么做会更卡,可以直接优化下Response.Write(intId)就完了,自己做测试用,但是要知道实际操作中不可能需要这样的,这么多数据一般就用分页来做了.哪个用户也不会一下看60000行数据.
[解决办法]
又看了一遍楼上的,他们这些方法都是治标不治本.试试我说的办法.先确定你是不是真的需要6万个id显示在一个页面上,如果不需要,就分页,一定行的.
[解决办法]
for (int i = 0; i < 60000; i++){
    Response.Write("现在读取第" + CStr(i) + "条记录<br>");
}

这个与你欲显示的结果完全相同,速度快几百倍.
[解决办法]
Reader是独占连接的,循环怎么搞到外面去了?
  
strSQL = "select id from test where id > " + i; 
OleDbCommand Cmd = new OleDbCommand(strSQL, MyConn); 
OleDbDataReader Dr; 
Dr = Cmd.ExecuteReader();
while(Dr.Read())
{
    int intId = (int)Dr["id"];
    Response.Write("现在读取第" + intId + "条记录<br>");
}
Dr.Close();

这样就很快了,如果想进一步优化,可以用上多线程
    
[解决办法]
同意楼上所言,你的编程思路是有问题的
[解决办法]
  你先写一个方法   把  top 60000 id全部存到一个datatable里面;
然后再for循环的时候直接调用方法!  这样速度比你每循环一次就跑一次数据库快了N倍!
[解决办法]
6W条数据分6W次去读取数据,楼主觉得这样合理吗?你可以连接一次数据库,把6W条数据取出来,放到内存中。让后再处理的你想要的东西。不比你现在这样好多了
[解决办法]
先得到6W条数据,在循环
------解决方案--------------------


引用:
Reader是独占连接的,循环怎么搞到外面去了?
  
strSQL = "select id from test where id > " + i; 
OleDbCommand Cmd = new OleDbCommand(strSQL, MyConn); 
OleDbDataReader Dr; 
Dr = Cmd.ExecuteReader();
while(Dr.Read())
{
    int intId = (int)Dr["id"];
    Response.Write("现在读取第" + intId + "条记录<br>");
}
Dr.Close();

这样就很快了,如果想进一步优化,可以用上多线程
    


这个应该就不错

[解决办法]
你循环就只有6W次,当然6W次完了以后界面就不动了。如果6W条以后还动,那才是见鬼了
[解决办法]
暂且先不管代码  从逻辑上来分析下
1:首先,从id>1 然后循环到 id>60000  这里我们可以得到的是 知道id>1的集合 肯定会包含id>60000的集合
    那么,我们只需要取读取数据库一次就能得到datatable,在代码中去处理程序,避免反复的读写数据库;
2:既然你明确的知道只要读取一个字段,显然*是不合理的,select [字段] from 表 where id>1 
剩下的就是代码里面做逻辑分析了
[解决办法]
楼主要实现什么效果啊,按你的代码,如果表中的id值为 1、3、4....,当i等于1时,取出的值是3,当i等于2时,取出的值还是3。
如果楼主的需求是这样的话,那上面各位的回答都不满足要求,楼主应该学一下怎么写存储过程和使用游标,或者把id小于6w的值都取出来,在后台做判断;如果楼只是想取前6w个id值,那直接select top 60000 id from test,再通过循环while(reader.Read()){ }实现自己的逻辑就可以了
[解决办法]
要么分页,要么一次性加载到内存中
[解决办法]
引用:
Reader是独占连接的,循环怎么搞到外面去了?
  
strSQL = "select id from test where id > " + i; 
OleDbCommand Cmd = new OleDbCommand(strSQL, MyConn); 
OleDbDataReader Dr; 
Dr = Cmd.ExecuteReader();
while(Dr.Read())
{
    int intId = (int)Dr["id"];
    Response.Write("现在读取第" + intId + "条记录<br>");
}
Dr.Close();

这样就很快了,如果想进一步优化,可以用上多线程
    

+1,楼主看看这个,可以将上面的strSql语句换成这样:“select top 60000 id from test order by id asc”这是查询数据库前6万条记录。
[解决办法]
楼主加油 我之前也写过这样的方法。。这些太消耗资源了。

热点排行