2012-01-31 13 views
2

誰かがこれをスピードアップするのに役立ちますか? 私はdsresultという名前のデータセット(csvファイルから)を持っています。私はそれをfirebirdテーブルにポンプします。 現在、私は一度に1行ずつ行っていますが、これを500行のバッチで行うことをお勧めします。 私はそれを実行するためにaaaaaaaaaaagesを取るfirebird.netプロバイダにFirebirdのdotnetバッチインサート

string connectionString = "ServerType=1;User=SYSDBA;Password=masterkey;Dialect=3;Database=MYDB.FDB"; 
string sql = "INSERT INTO POSTIN (NUMID, CHANGE, PLACENAME, BOXCODE, STRCODE, TOWN) VALUES (@NUMID, @CHANGE, @PLACENAME, @BOXCODE, @STRCODE, @TOWN)"; 
FbConnection conn = new FbConnection(connectionString) 
FbCommand command = new FbCommand(sql, conn);     
foreach (DataRow r in dsResult.Tables[0].Rows) 
{ 
    command.Parameters.AddWithValue("@NUMID", r["NUMID"]); 
    command.Parameters.AddWithValue("@CHANGE", r["CHANGE"]); 
    command.Parameters.AddWithValue("@PLACENAME", r["PLACENAME"]); 
    command.Parameters.AddWithValue("@BOXCODE", r["BOXCODE"]); 
    command.Parameters.AddWithValue("@STRCODE", r["STRCODE"]); 
    command.Parameters.AddWithValue("@TOWN", r["TOWN"]);   
    command.ExecuteNonQuery(); 
} 

を使用しています。デルファイで 私はちょうどcachedupdatesを使用していただろう。 時間 のポスト500回の記録をし、500番目

おかげ

+1

これをすべてトランザクションに入れてみましたか? –

+0

いいえ、どのようにこれを行うためのポインターですか? – Crudler

答えて

1

Firebirdのワイヤプロトコルでは、複数のコマンドを1回のバッチで(および1回の往復で)送信することはできません。おそらく最良の考えは、EXECUTE BLOCK(別名匿名ストアドプロシージャ)を使用してそこにインサートを送ることです。例えば

execute block 
as 
begin 
    insert into ...; 
    insert into ...; 
    ... 
end 

及びこれを実行します。

ところで、FbBatchExecutionは1つのコマンドも送信します。

+0

実行ブロックをもう少し説明してください。ありがとう – Crudler

+0

リンクを確認し、投稿した例を投稿してください。 –

4

にコミットするには、このような何かを試してみてください。

using(FbConnection c = new FbConnection(csb.ToString())) 
{ 
    FbBatchExecution fbe = new FbBatchExecution(c); 
    //loop through your commands here 
    { 
     fbe.SqlStatements.Add(cmd); 
    } 
    fbe.Execute(); 
} 
+0

各insertステートメントは独自のコマンドを取得しますか? – Crudler

+0

はい!実行の準備が整ったコマンドを返す別のメソッドにコードを追加しようとし、そのメソッドをループで呼び出すようにしてください。 – Diego

1

あなたは一度だけパラメータを追加し、のみでそれらオフ値を変更する必要があります

一度パラメータを作成します:ような何かをしてループ

command.Parameters.Add("@NUMID", FbDbType.Int) 
.... 
ループ内

が行います。これは本当に物事をスピードアップする必要があり

foreach (DataRow r in dsResult.Tables[0].Rows) 
{ 
    command.Parameters["@NUMID"].Value = r["NUMID"]; 
    .... 
}