多行插入的 IDBCommand 参数

Posted

技术标签:

【中文标题】多行插入的 IDBCommand 参数【英文标题】:IDBCommand Parameters for multi-line insert 【发布时间】:2013-01-23 09:34:36 【问题描述】:

我想按照以下几行创建一个多行插入语句:

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(",;", ";");

【讨论】:

一个语句可以添加多少个参数有限制吗? 我认为SQL server有200-300范围的限制【参考方案2】:

据我所知,无法一次向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,讨论在事务中一个大的串联插入与多个ExecuteNonQuerys 的性能。

【讨论】:

那不是要求我每行进行一次查询吗?布莱赫。 我已经更新了我的答案,以显示每次只需要更新参数值,而不是整个命令。我还没有测试代码,可能包含一两个错字。

以上是关于多行插入的 IDBCommand 参数的主要内容,如果未能解决你的问题,请参考以下文章

向 IDbCommand 添加参数

验证 IDbcommand 参数的最佳方法

如何在mysql中将单行插入查询重构为多行插入查询?

使用 T-SQL 中的一个参数将多个值插入多行

为IDBCommand和SqlCommand.ExecuteNonQueryAsync实现异步ExecuteNonQuery()

2017.11.01 ExecuteNonQueryExecuteScalarExecuteDataSetFillDataSet 流程