SDAC -RecordCount和FetchAll

时间:2011-06-08 20:32:53

标签: sql-server delphi dataset memory-management record-count

我正在使用SDAC组件来查询SQL Server 2008数据库。它具有recordcount属性,因为它具有FetchAll属性,并且还具有packedrecords属性(我认为它在clientdatasets上称为FetchAll = True)。说,我有几个问题:

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

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

在这种情况下,如何让TMSCconnection正常工作并且应用程序的内存使用率较低?

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

我考虑使用查询来确定记录计数,但是由于我的查询将被执行两次(记录数量为1,数据为1),因此存在一些问题

修改

@Johan指出了一个很好的解决方案,它似乎有效。任何人都可以证实吗?我每TMSQuery使用1 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 (因为我使用线程),所以我不认为这会是一个问题,是吗?

MSQuery1

编辑2 *

必须关闭

MSQuery2,否则num_of_rows将不会返回 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 。那是为什么?

{{1}}

2 个答案:

答案 0 :(得分:2)

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

设置QueryRecCount = True和FetchAll = False将减少内存使用量并为您提供记录计数。但SDAC将在后台运行第二个查询以获取记录数,因此它会为您的查询添加一些额外的时间。

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

答案 1 :(得分:2)

正常运行您的查询,而关闭查询

MSQuery1.SQL.Text := 'select * from cidade';     
MSQuery1.Open;     
MSQuery1.Close;  

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

然后立即运行以下查询:

SELECT @@rowcount AS num_of_rows

这将选择您上一次select读取的总行数 它还将选择更新/删除/插入语句影响的行数。

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

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