配列 DML(FireDAC)

提供: RAD工作室
移動先:案内検索

コマンドの操作(FireDAC)への移動

概要

配列 DML公司実行手法では、パラメータの配列を持つ単一の 数据库管理系统コマンドを発行します。各コマンド パラメータには値の配列があり、その配列の長さはどのパラメータでも同じです。消防DACでは、配列内の行ごとにコマンドを 1回実行するように 数据库管理系统『』『』『』『』『』『』『』『』『』『』『』『』『』数据库管理系统とクライアントの間の通信量が減り、数据库管理系统がコマンド実行を効率化できます。その結果、実行速度が向上します。

次の図でこの処理を示します。

FDPhysCmdBatch.png文件

消防DACの用語では、"バッチ コマンド実行" "配列 DML公司実行" はよく同じ意味で使用されます。配列 DML公司は、ストアド プロシージャ呼び出しも含めて、ほとんどすべてのパラメータ化コマンドに使用できます。消防DACでは、ネイティブ 数据库管理系统APIDML公司を実を実数据库管理系统APIでサポートされていない場合は、配列 DML公司実行をエミュレートします。

数据库管理系统と配列 DML公司機能の対応関係を以下の一覧表に示します。

数据库管理系统 配列 DML公司の実装 配列 DML公司モード 配列 DML公司の限界の兆候
Advantage数据库 エミュレーション aeUpToFirst错误
数据快照サーバー エミュレーション aeUpToFirst错误
IBM DB2 ネイティブ aeCollectAllErrors(收集所有错误)
Informix公司 ネイティブ aeCollectAllErrors(收集所有错误)
InterBase XE3以前 エミュレーション aeUpToFirst错误
InterBase XE3以降 ネイティブU形マンバッチAPI) aeUpToFirst错误
火鸟2.1以前 エミュレーション aeUpToFirst错误
火鸟2.1以降 ネイティブ(执行块) aeOnErrorUndoAll(错误全部取消) “上下文太多”(コンテキストが多すぎます)エラー
Microsoft SQL Server ネイティブ aeCollectAllErrors(收集所有错误) "アクセス違反が発生しました。" エラー
Microsoft Accessデータベース エミュレーション aeUpToFirst错误
MySQL数据库サーバー ネイティブ(价值句が複数ある 插入) aeOnErrorUndoAll(错误全部取消)
甲骨文公司サーバー ネイティブ(国际奥委会の配列 DML) aeUpToFirst错误 アプリケーションのハングアップ。明示的な限界 - 6.5万個の配列項目
PostgreSQL 8.1以前 エミュレーション aeUpToFirst错误
PostgreSQL 8.1以降 ネイティブ(价值句が複数ある 插入/合并) aeOnErrorUndoAll(错误全部取消)
苏莱特データベース 3.7.11 以前 エミュレーション aeUpToFirst错误
苏莱特データベース 3.7.11 以降
  • 参数。绑定模式=pbByName物语場場場場場ミュレーション
  • 参数。绑定模式=pbByNumberの場合は、ネイティブ(价值句が複数ある 插入)
  • aeUpToFirst错误
  • aeOnErrorUndoAll(错误全部取消)
Sybase SQL Anywhere ネイティブ aeUpToFirst错误
Teradata数据库 ネイティブ aeOnErrorUndoAll(错误全部取消)
メモ:

コマンドの実行

アプリケーション コードでは、配列 DML公司の実行前に、パラメータ値配列をセットアップする必要があります。まず、参数。阵列大小に値を割り当てることで配列の長さをセットアップします。このプロパティ値を割り当てると、指定した配列長がすべてのパラメータの 阵列大小プロパティに暗黙に割り当てられます。そのため、参数。阵列大小に値を割り当てる前に、参数コレクション プロパティには値が設定されている必要があります。次に、パラメータ配列に値を割り当てます。TAD参数クラスには、作为XXXプロパティと似た一連の AsXXXs[AIndex:整数]プロパティ、その他のプロパティ、第 1パラメータとして配列インデックスを受け取るメソッドがあります。以下に例を示します。

FD查询1.SQL语言.文本 := '插入MyTab值(:p1,:p2,:p3)';
//此处FDQuery1.Params集合由3个参数填充
FD查询1.参数.阵列大小 := 100;
对于  := 0  100-1  开始
  FD查询1.参数[0].作为整数[] := ;
  FD查询1.参数[1].AsStrings(字符串)[] := “qwe”;
  FD查询1.参数[2].清除();
结束;

TFDCustomCommand、TFDQuery、TFDStoredProcには执行(A时间:整数=0;AOffset:整数=0)メソッドがあります。このうち、A时间は配列の長さを指定します。A偏移は配列内の先頭項目のインデックスです。そのため、コマンドは、A偏移行目から始めて、(A时间-A偏差)返回実ぃA时间参数。阵列大小以下でなければなりません。以下に例を示します。

FD查询1.执行(100, 0);

配列 DML公司物语実後、プロパティ行受影响には、すべての実行で影響を受けた行の総数ではなく、正常実行の回数が格納されています。以下に例を示します。

显示消息(国际贸易协定(FD查询1.行受影响));

エラー処理

TFDAdaptedDataSet、TFDQuery、TFDStoredProcでは、OnExecuteError(执行错误)イベント ハンドラを使ってエラーをトラップできます。エラー ハンドラが割り当てられていない状態でエラーが発生した場合は、执行で例外が発生し、行受影响が更新されます。

TFDAdaptedDataSet。OnExecuteError(执行错误)イベント ハンドラが割り当てられている場合は、このハンドラが元の例外オブジェクト、現在の回数、オフセットを受け取って、A操作値を返し、次に実行するアクションを指示します。A错误。错误[…]には、エラーが 1つつつつA错误。错误[i]。行索引は、エラーが発生した行のインデックスです。なお、OnExecuteError(执行错误)は、構文エラーや A时间=1の場合には呼び出されません。

以下に例を示します。

程序 T形1.FDQuery1执行错误(A投标人: TObject(目标); A时间,
  A偏移: 整数; A错误: EFDDB发动机异常; 无功功率,无功功率 A操作: TFD错误操作);
开始
  如果 A错误.错误[0].种类 = 违反ekUK 然后
    A操作 := eaSkip公司
  其他的
    A操作 := eaFail(ea失败);
结束;

詳しい動作は、以下のように、数据库管理系统とそれに対応する配列 DML公司モードによって異なります。


配列 DML公司モード 説明
aeOnErrorUndoAll(错误全部取消) 実行は最初のエラーで停止します。正常に適用された配列項目はすべて取り消されます。その後、消防DAC(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)(笑声)aeUpToFirst错误aeUpToFirst错误を参照してください。
aeUpToFirst错误 実行は最初のエラーで停止します。正常に適用された配列項目はすべて保存されます。数据库管理系统は、最初にエラーが発生した配列項目のインデックスを返します。行受影响は、正常に適用された配列項目の数です。エラー コレクション A错误。错误[…]にはエラーが 1つ以上格納されており、それぞれは、実行に失敗した単一の行を参照しています。A错误。错误[i]。行索引は、エラーが発生した行のインデックスです。
aeCollectAllErrors(收集所有错误) すべての配列項目が実行されます。正常に適用された配列項目はすべて保存されます。数据库管理系统は、エラーが発生した各配列項目のインデックスを 1つずつ返します。行受影响は、正常に適用された配列項目の数です。エラー コレクション A错误。错误[…]には、実行に失敗した行ごとにエラーが 1つ格納されています。A错误。错误[i]。行索引は、エラーが発生した行のインデックスです。
メモ: 资源选项。阵列DML大小1に設定すると、配列実行モードが暗黙に aeUpToFirst错误に設定されます。 現在接続している 数据库管理系统の配列 DML公司モードを取得するには、次のようなコードを使用します。
如果 FD连接1.连接元数据Intf.阵列执行模式 = aeOnErrorUndoAll(错误全部取消) 然后
  。。。。


トラブルシューティング

文字列パラメータのプロパティ 大小の設定など、パラメータを適切にセットアップすることが大切です。たとえば、甲骨文公司の使用時に 尺寸が明示的に指定されていない場合、消防DAC毁灭性的ftString/ftWideString(宽字符串)パラメータごとに 4,000 バイトを割り当てます。そのため、値が 10,000 個ある場合は、40 MBのバッファが割り当てられます。パラメータが多い場合、アプリケーションでシステム メモリが全部消費されるおそれがあります。

ほとんどの 数据库管理系统个体化DML公司のサイズについて暗黙の上限があります。 それは、数据库管理系统クライアント ライブラリのバッファ サイズやネットワーク パケット サイズの最大許容値によって異なります。 上限に達したら、资源选项。阵列DML大小オプションを使用して、大きい配列 DML公司をより小さいいくつかのスライスに透過的に分割します。


1

IFDPhys命令DML:

无功功率,无功功率
  o命令: IFDPhysCommand(IFDPhysCommand);
……
  具有 o命令  开始
    命令文本 := '插入客户(ID,Name)值(:ID,:Name)';
    //设置参数类型
    参数[0].数据类型 := 英尺整数;
    参数[1].数据类型 := ftString(英尺字符串);
    参数[1].大小 := 40;
    //设置参数的数组大小
    参数.阵列大小 := 10000;
    //设置参数值
    对于  := 0  10000 - 1  开始
      参数[0].作为整数[] := ;
      参数[1].AsStrings(字符串)[] := “某人” + 国际贸易协定();
    结束;
    //执行批处理
    执行(10000, 0);
  结束;


2

TFD查询とエラー処理を使用した場合の配列 DML:

程序 T形1.FDQuery1执行错误(A投标人: TObject(目标); A时间,
  A偏移: 整数; A异常: EFDDB发动机异常; 无功功率,无功功率 A操作: TFD错误操作);
开始
  案例 A异常.错误[0].种类 属于
  ekPK违规:
    开始
      //修复ID唯一
      FD查询1.参数[0].作为整数[A异常.错误[0].行索引] := A异常.错误[0].行索引;
      A操作 := ea重试;
    结束;
  ekFK违规:
    //如果找不到RegionID为的Region,则跳过行
    A操作 := eaSkip公司;
  其他的
    A操作 := eaFail(ea失败);
  结束;
结束;

程序 T形1.按钮1单击(A投标人: TObject(目标));
开始
  具有 FD查询1  开始
    SQL语言.文本 := '插入客户(ID,RegionID,Name,Note)值(:ID,:RegionID、:Name、:Note)';
    //设置参数类型
    参数[0].数据类型 := 英尺整数;
    参数[1].数据类型 := 英尺整数;
    参数[2].数据类型 := ftString(英尺字符串);
    参数[2].大小 := 40;
    参数[].数据类型 := 英尺备忘录;
    //设置参数的数组大小
    参数.阵列大小 := 10000;
    //设置参数值
    对于  := 0  10000 - 1  开始
      如果  模块 100 = 0 然后
        //强制PK冲突
        参数[0].作为整数[] :=  - 1
      其他的
        参数[0].作为整数[] := ;
      参数[1].作为整数[] := 为客户获取区域ID();
      参数[2].AsStrings(字符串)[] := “某人” + 国际贸易协定();
      参数[].清除();
    结束;
    //执行批处理
    执行(10000, 0);
  结束;
结束;

関連項目

サンプル