SDACコンポーネントを使用して SQL Server 2008 データベースにクエリを実行しています。recordcount
すべてのデータセットと同様にプロパティがあり、プロパティもあります(これはonFetchAll
で呼び出されると思います)。そうは言っても、私はいくつかの質問を受けました:packedrecords
clientdatasets
1 - プロパティを設定FetchAll = True
すると、recordcount
OK が返されます。しかし、この場合、大規模なデータベースがあり、クエリが多くの行を返すと、メモリが大幅に増加することがあります (当然のことながら、すべてのデータを取得するため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