我想沿着這些線路創建多行插入語句:多行IDbCommand的參數插入
insert into foo (
value1,
value2,
value3
) values
("1", "2", "3"),
("4", "5", "6"),
("7", "8", "9");
其中要插入的行數是可變的。有沒有一種方法可以使用IDBCommand
參數化構造這個查詢?
我想沿着這些線路創建多行插入語句:多行IDbCommand的參數插入
insert into foo (
value1,
value2,
value3
) values
("1", "2", "3"),
("4", "5", "6"),
("7", "8", "9");
其中要插入的行數是可變的。有沒有一種方法可以使用IDBCommand
參數化構造這個查詢?
這樣的事情應該可以正常工作。
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(",;", ";");
據我所知,沒有辦法一次向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
的性能的討論。
這不需要我每行都做一個查詢嗎?布萊什。 –
我已經更新了我的答案,以顯示每次只更新參數值的方式,而不是整個命令。我沒有測試過代碼,可能包含一個或兩個錯字。 –
可以將多少個參數添加到語句中是否有限制? –
我相信SQL服務器在200-300範圍內有一個限制 – iamkrillin