8

私は Delphi プログラマーではありませんが、ADO を使用している古い Delphi 7 アプリケーションを修正する必要があります。

データベース テーブル (MS Accesss) には +100,000 行が含まれており、ADOTable.Active=true を設定すると、テーブル全体が RAM にロードされ始め、多くのメモリと時間がかかります。

ADO がテーブル全体をロードしないようにするにはどうすればよいですか? MaxRecords を設定しようとしましたが、役に立ちません。

基本的には att プログラムを起動するだけです:

// Connect to database
DataModule.MyADOConnection.Connected:=true;

DataModule.MeasurementsADOTable.MaxRecords:=1;

// Open datatables
DataModule.MeasurementsADOTable.Active:=true;                  

Active=true に設定すると、測定値全体が RAM にロードされ始めますが、これには時間がかかります。

MSDASQL.1 プロバイダーを使用しています。おそらく、MaxRecords プロパティをサポートしていないのでしょうか?

このデータオブジェクトに制限クエリを追加して、「測定から TOP 1 * をロードする」だけにするにはどうすればよいですか?

4

7 に答える 7

10

TADOQuery を使用して、SQL クエリで結果セットを制限できます。または、TADOTable を使用してCursorLocationをサーバー側のカーソルに設定し、クライアントが完全な結果セットをメモリにロードしないようにすることもできます。

于 2008-12-05T12:00:27.787 に答える
5

Server OpenForwardOnly カーソルでその adoTable を使用し、PacketRecords をゼロ以外の値に設定して TCLientDataset を使用できます。数百万のレコードを持つテーブルを使用して、カスタマイズされた方法で MSSQL から Oracle にデータをポンプするアプリを作成する必要があったとき、素晴らしく機能しました。

編集->これは次の行にあるものです:

procedure ConfigCDSFromAdoQuery(p_ADOQ: TADOQuery; p_CDS: TClientDataset; p_Prov: TDatasetProvider);
begin
  If p_ADOQ.Active then p_ADOQ.Close;
  p_ADOQ.CursorLocation := clServer;
  p_ADOQ.CursorType := ctOpenForwardOnly;
  p_Prov.Dataset := p_ADOQ;
  p_CDS.SetProvider(p_Prov);
  p_CDS.PacketRecords := 100;
  p_CDS.Open; 
end ;

これはすべてコードで行いましたが、そのほとんどは設計時に行うことができます。

于 2008-12-10T16:34:36.000 に答える
1

この記事は BDE 固有のものですが、ADO またはほとんどのクライアント データ アクセス ライブラリに適用されます。

http://dn.codegear.com/article/28160

TADODataSet (TADOQuery よりも ADO レイヤーに「近い」) を使用し、カスタム検索フォーム (日付範囲、特定のアイテムのリストなど) を提供して、クライアントが必要とするデータのみを選択することをお勧めします。

幸運を

于 2008-12-13T10:58:27.257 に答える
0
  1. 「MeasurementsADOTable」が現在存在するデータモジュールで、TADOQueryを削除し、「MeasurementsADOQuery」という名前を付けます。
  2. MeasurementsADOQueryのConnectionプロパティをMyADOConnectionに設定します(これは、提供されている小さなコードスニペットに基づく場合であると想定しています)。
  3. また、グリッドを表示しているか、データソースを使用していることも前提としています。データソースコンポーネントの「DataSet」プロパティをMeasurementsADOTableからMeasurementsADOQueryに変更します。
  4. MeasurementsADOQueryのSQLプロパティを設定して、実行する実際のクエリを編集します。(開く前の実行時:Measurements.SQL.Text:='測定順序から上位10*を選択します')
  5. コード内のすべての参照をMeasurementsADOTableからMeasurementsADOQueryに分析/変更します
于 2008-12-07T22:00:12.007 に答える
0

起動時にadotableをアクティブにしないでください。後でそれをtrueにすることは一方向ですが、それでも実際には役に立ちません。adodatasetを使用し、実行時に必要に応じて接続テキストを入力します。関連するデータのみが取得されるため、はるかに高速になります。

于 2012-10-25T18:05:06.810 に答える
-1

Delphiを使用したADO + Accessは、多くのことで非常に遅いことがわかりました(大きなテーブルは、あなたが説明しているように読み取りますが、挿入も同様です)。私の答えは、「ADO と Access の使用を完全にやめる」というものでした。

特に以前の技術ではそうではないように見えたとき、なぜそれがそれほどうまくいかなかったのか理解できませんでした.

于 2008-12-13T10:06:33.133 に答える