【问题标题】:How to perform batch update in Sql through C# code如何通过 C# 代码在 Sql 中执行批量更新
【发布时间】:2010-02-24 15:23:19
【问题描述】:

我想像下面这样更新多行

update mytable set s_id = {0} where id = {1}

(这里s_id是根据一些复杂的逻辑进行评估的)。
出于性能原因,更新应该分批进行。有没有办法批量更新语句并通过单个执行语句执行批处理?我知道在 JAVA 中我们可以通过 JDBC 做到这一点。 C#中是否有类似的方法?

提前致谢

【问题讨论】:

    标签: c# sql


    【解决方案1】:

    使用StringBuilder(System.Text.StringBuilder)来构建你的Sql,如:

    StringBuilder sql = new StringBuilder();
    int batchSize = 10;
    int currentBatchCount = 0;
    SqlCommand cmd = null; // The SqlCommand object to use for executing the sql.
    for(int i = 0; i < numberOfUpdatesToMake; i++)
    {
      int sid = 0; // Set the s_id here
      int id = 0; // Set id here
      sql.AppendFormat("update mytable set s_id = {0} where id = {1}; ", sid, id);
    
      currentBatchCount++;
      if (currentBatchCount >= batchSize)
      {
        cmd.CommandText = sql.ToString();
        cmd.ExecuteNonQuery();
        sql = new StringBuilder();
        currentBatchCount = 0;
      }
    }
    

    【讨论】:

    • 可能是因为您的代码可能会受到 SQL 注入攻击
    • 如果它只是整数值则不是
    • @GvS SQL 注入在没有不受信任的输入时不相关。任何能够更改int id = 0 的人都可以轻松更改整个查询。
    • 在这种情况下并不是真正的 SQL 注入问题,而是一种不好的做法。使用参数确保安全。
    【解决方案2】:

    是的,您可以构建一个纯文本 SQL 命令(为安全起见进行了参数化),如下所示:

    SqlCommand command = new SqlCommand();
    // Set connection, etc.
    for(int i=0; i< items.length; i++) {
        command.CommandText += string.Format("update mytable set s_id=@s_id{0} where id = @id{0};", i);
        command.Parameters.Add("@s_id" + i, items[i].SId);
        command.Parameters.Add("@id" + i, items[i].Id);
    }
    command.ExecuteNonQuery();
    

    【讨论】:

    • 我喜欢这种方法。就我的目的而言,比 SqlDataAdapter 更容易实现/调试。
    • @Arvand 你如何解决这个问题?
    • @Arvayne 取决于你在做什么,但交易通常是一个不错的选择。
    【解决方案3】:

    是的,您可以使用SqlDataAdapter

    SqlDataAdapter 具有InsertCommandUpdateCommand 属性,允许您指定用于将新行插入数据库的SQLCommand 和用于分别更新数据库中的行的SqlCommand。

    然后您可以将 DataTable 传递给 dataadapter 的 Update 方法,它会将语句批量发送到服务器 - 对于 DataTable 中的行是新行,它执行 INSERT 命令,对于修改过的行它执行 UPDATE 命令。

    您可以使用UpdateBatchSize 属性定义批量大小。

    这种方法允许您处理大量数据,并允许您以不同的方式很好地处理错误,即如果在特定更新中遇到错误,您可以告诉它不要抛出异常而是继续通过设置ContinueUpdateOnError 属性来进行剩余更新。

    【讨论】:

      【解决方案4】:

      创建一组这些更新(填充 id),用分号将它们分隔在一个字符串中,将结果字符串设置为 SqlCommand 的 CommandText 属性,然后调用 ExecuteNonQuery()。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        • 2011-01-08
        • 2022-07-12
        • 1970-01-01
        • 2012-05-05
        相关资源
        最近更新 更多