2016-07-01 26 views
4

配列DML操作を使用して、多数のレコードをSQLデータベースに高速に挿入しようとしています。原則はhereと記載されています。この機能を使用する方法サンプルコード:配列DML操作のメモリー解放

TFDQuery *FDQuery1; 
... 
FDQuery1->SQL->Text = "insert into MyTab values (:p1, :p2, :p3)"; 
// here FDQuery1->Params collection is filled by 3 parameters 
const int array_size = 100; 
FDQuery1->Params->ArraySize = array_size; 
FDQuery->Prepared = true; 
for(int i = 0; i < array_size; i++) 
{ 
    FDQuery1->Params[0]->AsIntegers[i] = i; 
    FDQuery1->Params[1]->AsStrings[i] = "qwe"; 
    FDQuery1->Params[2]->Clear(i); 
} 
FDQuery1->Execute(array_size); 

本質的ではなく、挿入された行ごとにデータベースエンジンクライアント機能を呼び出す、私が最初に私は配列として挿入する必要があるデータを準備することを意味します。配列の典型的なサイズは1000項目です。次に、クライアント関数をarrayをパラメータとして呼び出します。残念ながら、パラメータの配列のメモリが解放されているときはどこにも書かれていません。それは私が質問をunprepareときに行われますか?

TFDQuery *query; 
... 
query->Prepared = false; 

質問を閉じると終了しますか?

query->Close(); 

または、配列サイズを1に設定すると終了しますか?それは手動で読み込まコレクション(;コマンド作成で補正コマンドが割り当てられ、ParamCreateが有効になっている場合、それが自動的にプリプロセッサによって事前に入力されます)ですので、デザインにより、クエリをunpreparingまたは閉じるとき

query->Params->ArraySize = 1 
+0

は、あなたが配列パラメータを記述する方法コードを表示することができますか? –

+0

あなたのqに直接負担はしませんが、どのSql Serverタイプを使用していますか? – MartynA

+0

私はFirebird 2.5.4を使用しています。 – truthseeker

答えて

0

パラメータコレクションは私見変わらないはずです。しかし、同じコレクションを設定することなく、後で同じコマンドを実行することができます。

あなたはもう一度同じコマンドを実行しないであろうことがわかっている場合、あなたはClearメソッドを呼び出すことができます:あなたは、パラメータの設定を保持する場合

query->Params->Clear(); 

を、そして値記憶が消費するリソースだけを解放し、あなたはArraySizeプロパティを介して、パラメータの数を減らすことができます

query->Params->ArraySize = 1