【问题标题】:SqlDataAdapter optimize foreachSqlDataAdapter 优化 foreach
【发布时间】:2021-01-10 04:02:03
【问题描述】:

此 C# 代码经过测试可以正常工作,但对我来说似乎效率低下。如何避免每个 foreach 交互中的所有开销,比如 1,000 行?

SqlConnection con = new SqlConnection(strConn);  // strConn is set elsewhere in the code
string strSQL = "select pkCustomer from Customer where YearEndDeactivateInd = 1";
SqlDataAdapter adap = new SqlDataAdapter(strSQL, con);
DataTable dt = new DataTable();
con.Open();
adap.Fill(dt);

foreach (DataRow row in dt.Rows)
{
    string strSQL1 = "update Ticket set activeInd = 0 where fkCustomer = " + row["pkCustomer"].ToString();
    SqlDataAdapter adap1 = new SqlDataAdapter(strSQL1, con);
    DataTable dt1 = new DataTable();
    adap1.Fill(dt1);
}

con.Close();

我正在根据另一个表的结果更新一个表。我应该改用批量更新吗?

【问题讨论】:

    标签: c# sql-server sqldataadapter


    【解决方案1】:

    使用这样的查询

    update Ticket
    set activeInd = 0
    where fkCustomer in (
        select pkCustomer
        from Customer
        where YearEndDeactivateInd = 1
    )
    

    不使用适配器

    using (var con = new SqlConnection(strConn))
    {
        string sql = "here query above";
        con.Open();
    
        using (var cmd = new SqlCommand(sql, con))
        {
            int rowsAffected = cmd.ExecuteNonQuery();
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以在一个查询中完成所有操作。

      例如

      UPDATE Ticket 
        SET activeInd = 0 
      WHERE 
        fkCustomer IN 
          (SELECT pkCustomer 
           FROM Customer 
           WHERE YearEndDeactivateInd = 1
          )  
      

      或者更好:

      UPDATE T 
        SET activeInd = 0 
      FROM 
        Ticket T 
        INNER JOIN Customer C 
          ON T.fkCustomer = C.pkCustomer 
      WHERE 
        C.YearEndDeactivateInd = 1
      

      不管怎样,SQL 本身在这方面的效率要高得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-30
        • 2012-06-12
        • 2011-04-06
        • 2014-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多