我正在使用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}}
答案 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
请注意,此变量每个连接,因此其他连接中的查询不会影响您。