2013-02-07 26 views
2

我想沿着這些線路創建多行插入語句:多行IDbCommand的參數插入

insert into foo (
    value1, 
    value2, 
    value3 
) values 
("1", "2", "3"), 
("4", "5", "6"), 
("7", "8", "9"); 

其中要插入的行數是可變的。有沒有一種方法可以使用IDBCommand參數化構造這個查詢?

回答

1

這樣的事情應該可以正常工作。

IDbCommand cmd = new SqlCommand(); 
StringBuilder sb = new StringBuilder(); 
sb.Append("insert into foo(col, col2, col3), values"); 
int parms = 0; 

for(int i = 0 ; i<3; i++) 
{ 
    sb.AppendFormat("(@{0}, @{1}, @{2}),", parms, parms + 1, parms + 2); 
    cmd.Parameters.Add(new SqlParameter((parms++).ToString(), "")); 
    cmd.Parameters.Add(new SqlParameter((parms++).ToString(), "")); 
    cmd.Parameters.Add(new SqlParameter((parms++).ToString(), "")); 
} 
sb.Append(";"); 
cmd.Parameters; 
cmd.CommandText = sb.ToString().Replace(",;", ";"); 
+0

可以將多少個參數添加到語句中是否有限制? –

+0

我相信SQL服務器在200-300範圍內有一個限制 – iamkrillin

0

據我所知,沒有辦法一次向IDbCommand提供可變數量的參數。您可以一次創建IDbCommand和重用它對於每一組參數值,但:

using (IDbCommand command = myConn.CreateCommand()) 
{ 
    command.CommandText = "insert into foo (value1, value2, value3) values (@v1, @v2, @v3)"; 
    IDbDataParameter param1 = command.CreateParameter() { ParameterName = "@v1" }; 
    // param2, param3 
    foreach (string[] row in records) 
    { 
     param1.Value = row[0]; 
     // param2, param3 
     command.ExecuteNonQuery(); 
    } 
} 

特別是在一個事務中這應該快,如果性能是你的關心。請參閱this thread,以獲取關於交易中一個大型連接插入與多個ExecuteNonQuery的性能的討論。

+0

這不需要我每行都做一個查詢嗎?布萊什。 –

+0

我已經更新了我的答案,以顯示每次只更新參數值的方式,而不是整個命令。我沒有測試過代碼,可能包含一個或兩個錯字。 –