2012-01-31 82 views
2

有人可以帮我加快速度。 我有一个名为dsresult的数据集(来自csv文件),我想将它泵入火鸟表。 目前,我一次只做1行,但我更愿意以500行的批次执行此操作。 我使用firebird.net提供商火鸟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(); 
} 

需要aaaaaaaaaaages运行。在delphi中,我只是匆匆cachedupdates 。 柱500只记录在一个时间 ,并承诺在第500

感谢

+1

你有没有试过把它全部在交易? – 2012-01-31 13:50:58

+0

不,任何指针如何做到这一点? – Crudler 2012-01-31 15:16:22

回答

1

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

例如:

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

并执行此。

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

+0

可以为我解释一下执行块。谢谢 – Crudler 2012-02-04 07:44:26

+0

检查我添加到帖子的链接和示例。 – 2012-02-04 08:13:24

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

每个插入语句都获取自己的命令吗? – Crudler 2012-01-31 15:16:04

+0

是的!尝试在不同的方法上添加你的代码,该方法返回一个准备好执行的命令,并在循环中调用该方法。 – Diego 2012-01-31 16:42:31

1

只应添加的参数一次,并且只有在更改值了他们环路所以像:

一旦创建参数:

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

在循环做:

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

这确实应该加快速度。