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

它需要 aaaaaaaaaaaages 才能运行。在 delphi 中,我会选择 cachedupdates。一次发布 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 的有线协议不支持在一批(和一次往返)中发送更多命令。可能最好的主意是使用EXECUTE BLOCK(又名匿名存储过程)并在那里发送插入。

例如:

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

并执行此。

顺便说一句,它FbBatchExecution也会一次发送一个命令。

于 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 回答