首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于多行插入的IDBCommand参数

用于多行插入的IDBCommand参数
EN

Stack Overflow用户
提问于 2013-02-08 02:49:12
回答 2查看 2.7K关注 0票数 2

我想沿着以下几行创建一条多行insert语句:

代码语言:javascript
复制
insert into foo (
    value1,
    value2,
    value3
) values 
( "1", "2", "3"),
( "4", "5", "6"),
( "7", "8", "9");

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-08 04:19:17

像这样的东西应该可以很好地工作。

代码语言:javascript
复制
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(",;", ";");
票数 1
EN

Stack Overflow用户

发布于 2013-02-08 04:06:01

据我所知,没有办法一次为IDbCommand提供可变数量的参数。您可以只创建一次IDbCommand,然后将其重用于每组参数值:

代码语言:javascript
复制
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();
    }
}

特别是在事务中,如果性能是您关心的问题,那么这应该更快。有关一个大的串联插入与多个ExecuteNonQuery在一个事务中的性能的讨论,请参见this thread

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14758680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档