2

SDACコンポーネントを使用して SQL Server 2008 データベースにクエリを実行しています。recordcountすべてのデータセットと同様にプロパティがあり、プロパティもあります(これはonFetchAllで呼び出されると思います)。そうは言っても、私はいくつかの質問を受けました:packedrecordsclientdatasets

1 - プロパティを設定FetchAll = Trueすると、recordcountOK が返されます。しかし、この場合、大規模なデータベースがあり、クエリが多くの行を返すと、メモリが大幅に増加することがあります (当然のことながら、すべてのデータを取得するためrecordcount)。

2 - を設定FetchAll = Falseすると、recordcount-1 が返され、メモリは増加しません。しかし、私は本当にrecordcountが必要です。また、このための汎用関数も作成したいので、既存のクエリをすべて変更する必要はありません。

recordcountこの場合、アプリケーションの動作とメモリ使用量を低くするにはどうすればよいですか?

recordcount が必要ない (または EOF と BOF を使用する必要がある) と投稿しないでください。

クエリを使用してレコード数を決定することを考えましたが、クエリが 2 回実行されるため (レコード数に対して 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はバックグラウンドで2番目のクエリを実行してレコード数を取得するため、クエリに少し余分な時間が追加されます。

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これにより、最後に読み取った行の総数が選択されます。
また、update/delete/insert ステートメントが影響する行数も選択されます。

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

この変数は接続ごとであるため、他の接続のクエリは影響しないことに注意してください。

于 2011-06-08T22:16:51.857 に答える