-4

私は、Delphi で直接 SQL を使用した経験がないことを認めます。しかし、私は今小さなプロジェクトで試しました。このSQLを実行します

SELECT [Type], [Sum] = Count(*) 
FROM   exceptionrow 
WHERE LogDate >= :FromDate
AND LOGDATE <= :ToDate
GROUP  BY [type] 
ORDER  BY [sum] DESC

FromDate と ToDate は、TDateTime としてのパラメーターです。実行するイベントは次のとおりです。

procedure TLogsStats.CollectTopExceptions(aFromDate, aToDate: TDateTime);
begin
  qryTopExceptions.ParamByName('FromDate').AsDate := aFromDate;
  qryTopExceptions.ParamByName('ToDate').AsDate   := aToDate;

  cdsTopExceptions.Close;
  cdsTopExceptions.Open;
end;

DBGrid で結果が得られますが、静的な日付を使用して SQL Studio で直接実行した場合とは異なります。行が少なすぎます。このプロジェクトからセットアップをコピーしました。SQLクエリを実行するだけで5つのコンポーネントが必要なのは奇妙だと思います。画像を参照してください。

SQL クエリ

単純化できますか?これが私のコンポーネントの宣言です。

SQLConnection: TSQLConnection;
qryTopExceptions: TSQLDataSet;
dspTopExceptions: TDataSetProvider;
cdsTopExceptions: TClientDataSet;
dsTopExceptions: TDataSource;

EDIT: 最後に、うまくいかなかった理由を見つけました。ドライバーなどの不具合が疑われますが、単純なばかげたエラーでした。大きなデータベースではなく、小さなテスト データベースに接続していました。これで、3 つのコンポーネントとパラメーターで問題なく動作します。お時間をいただき申し訳ありません:)

SQLConnection: TSQLConnection;
qryTopExceptions: TSQLDataSet;
dsTopExceptions: TDataSource;

よろしく

4

1 に答える 1

8

簡単な回答: いいえ、5 つのコンポーネントは必要ありません。

Delphi からデータベースに対してクエリを実行するには、通常、次の 2 つのコンポーネントが必要です。

  • データベース接続の確立を担当する接続コンポーネント、および
  • クエリを実行して結果をフェッチするクエリ対応コンポーネント。

一部のデータ レイヤーでは、明示的な接続コンポーネントなしでクエリ対応コンポーネントを直接使用できますが、接続コンポーネントは常にバックグラウンドで作成されます。これらの 1 つが ADO​​ です。

したがって、ADO を使用する場合はTADOQuery、フォーム/データモジュールに を配置するだけで、サポートされているデータベース (SQL Server など) に対して選択 (またはその他の) クエリを実行できます。

ConnectionStringそれを行うには、プロパティADOQuerySQLプロパティを設定し、Openクエリを実行するとデータがそこにあります。

さらに詳しい情報

データアクセス

利用可能なさまざまなデータ アクセスから選択することもできます。DBGo (ADO) や DBExpress (DBX) など、複数のデータベースへの接続をサポートするものもあれば、Interbase Express (IBX) や Direct Oracle Access (DOA) など、1 つのデータベースのみへの接続をサポートするものもあります。

ご覧のとおり、利用可能なさまざまなオプションによって、さまざまな機能セットと独自の特性が提供されます。

では、なぜ 5 つのコンポーネントを使用するのでしょうか。

おそらく、他の誰かが書いたアプリケーションを調べたり、チュートリアルに従っているのでしょう。

これらのコンポーネントは、より高度で洗練されたデータ アクセス機能を追加するために使用されます。

  • TClientDataSet/TDataSetProvider: TClientDataSet を使用すると、完全にナビゲート可能なデータ セット内のデータのメモリ内コピーを保持できます。これにより、データベースから切断された状態で作業することも可能になり、変更と共にデータをディスクに保存および取得することもできます (デルタ) を作成し、後でその変更を適用します (数日後または数か月後でも)。

    また、データの並べ替え、インメモリ インデックスの作成、集計の計算などを行うこともできます。

    TDataSetProvider は、ソース DataSet (TSQLQuery など) と TClientDataSet の間の接着剤であり、ソース データ セットからデータをプルするためにコーディングなしで両方を接続する機能を提供しますが、変更のデルタをデータ セットに一度に適用する機能も提供します後で。

    TClientDataSets と TDataSetProviders について詳しく知りたい場合は、Cary Jensen による ClientDataSets の本をご覧ください。

  • TDataSource: これは Delphi データベース アーキテクチャの一部であり、TDBEdit、TDBGrid、TDBLabel などのデータ認識コンポーネントを使用できます。DataSource は、マスター/詳細関係の作成にも使用されます。そのコンポーネントまたは関係を使用したくない場合は、必要ありません。

于 2013-01-25T22:10:01.457 に答える