我正在使用SDAC组件来查询 SQL Server 2008 数据库。它具有recordcount
所有数据集的属性,并且还具有FetchAll
属性(我认为它被称为packedrecords
on clientdatasets
)。说了这么多,我有几个问题:
1 - 如果我设置FetchAll = True
属性recordcount
返回正常。但是在这种情况下,当我有一个大型数据库并且我的查询返回很多行时,有时内存会增长很多(因为它正在获取所有数据以获取recordcount
当然)。
2 - 如果我设置FetchAll = False
,recordcount
返回 -1 并且内存不会增长。但我真的需要记录数。而且我还想为此创建一个通用函数,所以我不必更改所有现有的查询。
在这种情况下,我能做些什么来recordcount
降低应用程序的工作和内存使用率?
请不要发布我不需要记录计数(或者我应该使用 EOF 和 BOF),因为我确实需要,这不是问题。
我考虑过使用查询来确定记录计数,但由于我的查询将被执行两次(记录计数为 1,数据为 1),因此存在一些问题
编辑
@Johan 指出了一个很好的解决方案,它似乎有效。有人可以证实这一点吗?我TMSCconnection
对每个都使用 1 TMSQuery
(因为我正在使用线程),所以我认为这不会是一个问题,对吗?
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
。这是为什么?
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