Firebird dotnet批量插入

时间:2012-01-31 13:47:04

标签: c# sql firebird

有人可以帮助我加快速度。 我有一个名为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();
 }

需要aaaaaaaaaaage才能运行。 在delphi我会刚刚使用cachedupdates。 一次发布500条记录 并在500日提交

由于

3 个答案:

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

答案 1 :(得分:1)

您应该只添加一次参数,并且只在循环中更改它们的值,如下所示:

创建一次参数:

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

在循环中执行:

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

这应该可以加快速度。

答案 2 :(得分:1)

Firebird的有线协议不支持在一个批处理中(以及在一次往返中)发送更多命令。可能最好的想法是使用EXECUTE BLOCK(也称为匿名存储过程)并在那里发送插入。

例如:

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

并执行此操作。

BTW FbBatchExecution也会发送一个命令。