我正在使用SDAC组件查询SQL Server 2008数据库。它具有所有数据集一样的recordcount属性,并且还具有FetchAll属性(我认为在packedrecords上称为clientdatasets)。话虽如此,我有几个问题:

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

2-如果设置FetchAll = False,则recordcount返回-1,并且内存不增加。但是我真的需要记录数。而且我也想为此创建一个通用函数,因此我不必更改所有现有查询。

在这种情况下,如何使recordcount工作并使应用程序的内存使用率降低?

请不要发布我不需要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

最佳答案

正常运行查询,而不是关闭查询

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


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

然后立即运行以下查询:

SELECT @@rowcount AS num_of_rows


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

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

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

关于sql-server - SDAC -RecordCount和FetchAll,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6284893/

10-10 18:44