2

我正在使用SDAC组件来查询 SQL Server 2008 数据库。它具有recordcount所有数据集的属性,并且还具有FetchAll属性(我认为它被称为packedrecordson clientdatasets)。说了这么多,我有几个问题:

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

2 - 如果我设置FetchAll = Falserecordcount返回 -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
4

2 回答 2

2

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

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

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

于 2011-06-08T21:56:40.710 回答
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

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

于 2011-06-08T22:16:51.857 回答