我想沿着这些行创建一个多行插入语句:
insert into foo (
value1,
value2,
value3
) values
( "1", "2", "3"),
( "4", "5", "6"),
( "7", "8", "9");
其中要插入的行数是可变的。有没有办法使用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
一次向 a 提供可变数量的参数。您可以创建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();
}
}
特别是在事务中,如果您关心性能,这应该很快。有关事务中一个大的连接插入与多个 s 的性能的讨论,请参阅此线程。ExecuteNonQuery