日期:2014-05-17  浏览次数:20449 次

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行数据.
------解决方案--------------------