我用下面的代码测试几百条记录时没有问题,但是测试正式的达到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();
}不好意思我的分不多了,全部奉上,谢谢大家指教
{
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();
}不好意思我的分不多了,全部奉上,谢谢大家指教
解决方案 »
- 求助!添加ajax Toolkit.dll后运行报错!!
- 怎样调用另一个.cs文件的函数?
- select 下拉框 html控件 加上 runat = server 后 报错 高分求解决方法
- datatable.writexml 时缺少开头的<?xml这个格式,怎么才能加上去呢?
- wap遇到的问题?
- .NET面试题供参考
- TreeView控件的使用问题,常常莫名其妙的跳转到treeview.htc中,说是 textnode.subtree.all没有定义或不是对象,怎么办
- 请帮我,急,我在等,高分
- 关于TransactionOptions事务的应用,具体应该怎么用和注意事项
- 高手帮忙啊---关于软件验证问题
- 救命啊!访问出现 奇葩
- 求Sql语句:获取评论数量最多的10条新闻。
这个应该对,没注意lz去6w次,每次都去6w -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行数据.
Response.Write("现在读取第" + CStr(i) + "条记录<br>");
}这个与你欲显示的结果完全相同,速度快几百倍.
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();这样就很快了,如果想进一步优化,可以用上多线程
然后再for循环的时候直接调用方法! 这样速度比你每循环一次就跑一次数据库快了N倍!
1:首先,从id>1 然后循环到 id>60000 这里我们可以得到的是 知道id>1的集合 肯定会包含id>60000的集合
那么,我们只需要取读取数据库一次就能得到datatable,在代码中去处理程序,避免反复的读写数据库;
2:既然你明确的知道只要读取一个字段,显然*是不合理的,select [字段] from 表 where id>1
剩下的就是代码里面做逻辑分析了
如果楼主的需求是这样的话,那上面各位的回答都不满足要求,楼主应该学一下怎么写存储过程和使用游标,或者把id小于6w的值都取出来,在后台做判断;如果楼只是想取前6w个id值,那直接select top 60000 id from test,再通过循环while(reader.Read()){ }实现自己的逻辑就可以了