有人可以帮助我加快速度。 我有一个名为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日提交
由于
答案 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
也会发送一个命令。