作者blue (A Joke From God)
看板C_Sharp
标题Re: [问题] 处理资料库时系统错误
时间Tue Sep 12 20:41:21 2006
※ 引述《sunflier (叮当)》之铭言:
: ※ 引述《blue (A Joke From God)》之铭言:
: : 但在DataAdapter要fill dataset的时候,
: 因为dataset是属於offline操作
: 在资料抓取时,会将所有资料先抓到你的memory里面
: 所以你的记忆体才会爆增
: 你可以用DataReader,用online方式来去操作资料
: 就不会让你的记忆体爆掉
: (取而代之的是,抓回来的资料是唯读且为sequential operation
: 不能随机存取某个row)
: 建议可看一下ADO.NET架构
请问sunflier大大,我如下这样使用DataReader对吗?
(connection与command如前文所述)
SqlConnection myConnection = new SqlConnection(connection);
SqlCommand myCommand = new SqlCommand(command, myConnection);
myConnection.Open();
SqlDataReader myReader;
myReader = myCommand.ExecuteReader();
接下来再用while(myReader.Read())将资料一笔笔读出来计算
但是,问题还是发生了!
myReader = myCommand.ExecuteReader();
这里一样跳出了「系统错误」的讯息。
刚刚前文忘记仔细交代发生的情况
由於我一次是query 100个项目出来计算(约三万笔资料)
不论我是用SqlDataAdapter或是SqlDataReader,
查询第一个一百项目就会让记忆体使用量到接近1GB,
往往前三四百个项目执行都OK,计算结果有输出,
不过每一百个项目查询计算之後,记忆体的使用量就会略往上加
我在每一百个项目查询结果计算完之後,
前文中我有把myDA, myDS给dispose()掉,
上面使用的myReader跟connection也一样close()掉
但计算总数不到五百个项目之後还是会出现错误讯息
另外,我也试了:一次只查询一个项目(约三百笔资料),
记忆体使用量也一样:第一个项目就会直线上升到1GB记忆体使用量,然後慢慢增加!
另外,实际上我如果在SQL Query Analyzer上面查询一个项目的话,
select * from T1 where Name = 'A1'
记忆体使用量也试一样的,请问会是我database设定上的问题吗?
这个database当初是我从很多csv档汇入资料来的,
里头只有一个table就是T1,也没有设定索引!不知道是不是这原因?
再次谢谢各位大大的指导!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.37.137
1F:推 tomex:希望你的loop里没有new啥物件,详细的语法贴出来比较稳 09/12 21:40
2F:推 tomex:另外若是ADO.Net 1.1的话,DataTable存放大资料有致命效能低 09/12 21:41
3F:推 sunflier:您要不要试试把跑程式的电脑和SQL切开? 09/13 08:22
4F:→ sunflier:再不然把整段程式码移殖到.net 2.0上面 09/13 08:22
5F:推 blue:谢谢各位大大的指导,我後来对资料库的第一栏位建立索引 09/13 09:10
6F:→ blue:然後程式码改用一次query十个项目出来计算 09/13 09:11
7F:→ blue:记忆体使用量就大大减少了,谢谢您们! :) 09/13 09:11