首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDAC -RecordCount和FetchAll

SDAC -RecordCount和FetchAll
EN

Stack Overflow用户
提问于 2011-06-08 20:32:52
回答 2查看 3.6K关注 0票数 2

我使用SDAC组件查询Server 2008数据库。与所有数据集一样,它具有recordcount属性,也具有FetchAll属性(我认为它被称为clientdatasets上的packedrecords )。说过,我有几个问题:

1-如果设置FetchAll = True,则recordcount属性返回ok。但是在这种情况下,当我有一个大型数据库,并且我的查询返回了很多行时,有时内存会增长很多(当然是因为它正在获取所有数据以获得recordcount )。

2-如果设置FetchAll = False,则recordcount返回-1,内存不会增长。但我真的需要记录。我还想为此创建一个通用函数,所以我不需要更改所有存在的查询。

在这种情况下,如何降低应用程序的recordcount工作时间和内存利用率?

请不要张贴我不需要记录计数(或我应该使用EOF和BOF),因为我真的这么做,这不是问题。

我考虑过使用查询来确定记录计数,但它有一些问题,因为我的查询将执行两次(记录计数1次,数据1次)。

编辑

@Johan指出了一个很好的解决方案,而且似乎奏效了。有人能证实这一点吗?我为每一个TMSCconnection使用一个TMSQuery (因为我使用线程),所以我不认为这会是一个问题,对吗?

代码语言:javascript
复制
  MSQuery1.FetchAll := False;
  MSQuery1.FetchRows := 10;
  MSQuery1.SQL.Text := 'select * from cidade';
  MSQuery1.Open;
  ShowMessage(IntToStr(MSQuery1.RecordCount)); //returns 10
  MSQuery1.Close;

  MSQuery2.SQL.Text := 'SELECT @@rowcount AS num_of_rows';
  MSQuery2.Open;
  ShowMessage(MSQuery2.FieldByName('num_of_rows').AsString); //returns 289

编辑2*

MSQuery1必须关闭,否则MSQuery2将不返回num_of_rows。为什么会这样呢?

代码语言:javascript
复制
  MSQuery1.FetchAll := False;
  MSQuery1.FetchRows := 10;
  MSQuery1.SQL.Text := 'select * from cidade';
  MSQuery1.Open;
  ShowMessage(IntToStr(MSQuery1.RecordCount)); //returns 10
  //MSQuery1.Close; <<commented

  MSQuery2.SQL.Text := 'SELECT @@rowcount AS num_of_rows';
  MSQuery2.Open;
  ShowMessage(MSQuery2.FieldByName('num_of_rows').AsString); //returns 0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-08 22:16:51

按常规运行查询,而不是关闭查询

代码语言:javascript
复制
MSQuery1.SQL.Text := 'select * from cidade';     
MSQuery1.Open;     
MSQuery1.Close;  

您需要close,否则SQL-server尚未关闭游标,并且不会将查询注册为“已完成”。

,然后直接运行以下查询:

代码语言:javascript
复制
SELECT @@rowcount AS num_of_rows

这将选择上次select读取的行总数。

它还将选择受影响的update/delete/insert语句的行数。

请参阅:http://technet.microsoft.com/en-us/library/ms187316.aspx

请注意,此变量是每个连接的,因此其他连接中的查询不会影响您。

票数 2
EN

Stack Overflow用户

发布于 2011-06-08 21:56:40

我使用ODAC,我相信SDAC继承于相同的基类,并以与ODAC相同的方式工作。在ODAC中,查询组件中的选项下面有一个名为QueryRecCount的选项。在帮助文件中查找TCustomDADataSet.Options.QueryRecCount。

设置QueryRecCount = True和FetchAll = False将减少内存使用并给出记录计数。但是SDAC将在后台运行第二个查询,以获取记录计数,因此它确实为查询增加了一些额外的时间。

看看http://www.devart.com/forums/viewtopic.php?t=8143的Devart论坛条目。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6284893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档