4

Firebird データベースに接続された DB Express TSimpleDataset があります。データセットに数千行のデータを追加したところで、今度は ApplyUpdates を呼び出します。

INSERT残念ながら、これにより、各行を個別に試行するため、数千のデータベース ヒットが発生します。それは少しがっかりです。私が本当に見たいのは、データセットが数千のINSERTステートメントを含む単一のトランザクションを生成し、すべてを一度に送信することです。必要に応じて自分で設定することもできますが、まず、データセットまたは DBX フレームワークに組み込まれている方法があるかどうかを知りたいです。

4

1 に答える 1

1

TSimpleDataset で可能かどうかはわかりませんが (使用したことはありません)、TClientDataset + TDatasetProvider + <db データセットをここに配置> を使用すれば可能です。BeforeUpdateRecordを記述して、適用プロセスを自分で処理できます。基本的に、標準の適用プロセスをバイパスし、レコードに変更が加えられたデータセットデルタにアクセスし、独自のコードとコンポーネントを使用してデータベースに変更を適用できます。たとえば、ストアド プロシージャを呼び出してデータを変更することができます。

ただし、「配列DML」や「一括挿入」などと呼ばれるものとトランザクションには違いがあります。単一のトランザクションを使用する場合でも(そして「適用」AFAIKが単一のトランザクションで発生します)、トランザクション内で「n」個のINSERTを送信する必要がある場合があります。一部のデータベースは、挿入するパラメーターの配列を使用して単一の INSERT (または更新、削除) を送信する方法をサポートし、使用する単一ステートメントの数を減らしますが、これは非常にデータベース固有であり、AFAIK dbExpress/Datasnap はサポートしていませんつまり、BeforeUpdateRecord イベントを使用して、特定のデータベース機能を利用することができます。

于 2011-06-07T08:36:30.150 に答える