3

誰かがこれをスピードアップするのを手伝ってくれますか。dsresult という名前のデータセット (csv ファイルから) があり、それを firebird テーブルに送り込みたいと考えています。現在、一度に 1 行ずつ実行していますが、これを 500 行のバッチで実行することをお勧めします。firebird.net プロバイダーを使用しています

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();
 }

実行するには aaaaaaaaaaages かかります。デルファイでは、キャッシュされた更新を使用しただけです。一度に 500 レコードを投稿し、500 番目にコミットする

ありがとう

4

3 に答える 3

5

次のようなものを試してください:

using(FbConnection c = new FbConnection(csb.ToString()))
{
    FbBatchExecution fbe = new FbBatchExecution(c);
    //loop through your commands here
    {
        fbe.SqlStatements.Add(cmd);
    }
    fbe.Execute();
}
于 2012-01-31T14:02:14.070 に答える
2

Firebirdのワイヤープロトコルは、1つのバッチ(および1つのラウンドトリップ)でより多くのコマンドを送信することをサポートしていません。おそらく最良のアイデアは、EXECUTE BLOCK(別名匿名ストアドプロシージャ)を使用して、そこに挿入を送信することです。

例えば:

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

これを実行します。

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

于 2012-02-02T12:57:07.293 に答える
1

パラメータを一度だけ追加し、ループ内で値を変更するだけで、次のようになります。

パラメータを一度作成します。

command.Parameters.Add("@NUMID", FbDbType.Int)
....

ループで次のことを行います。

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

これは本当にスピードアップするはずです。

于 2012-02-01T21:36:30.527 に答える