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

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

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

要插入的行数是可变的。有没有办法使用IDBCommand 参数化构造这个查询?

【问题讨论】:

    标签: c# postgresql npgsql idbconnection


    【解决方案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 的性能。

    【讨论】:

    • 那不是要求我每行进行一次查询吗?布莱赫。
    • 我已经更新了我的答案,以显示每次只需要更新参数值,而不是整个命令。我还没有测试代码,可能包含一两个错字。
    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 2018-01-15
    • 2013-08-18
    • 2012-08-19
    • 2011-06-03
    • 2014-02-01
    • 2013-04-02
    • 2015-07-22
    相关资源
    最近更新 更多