首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlDataAdapter优化森林

SqlDataAdapter优化森林
EN

Stack Overflow用户
提问于 2020-09-24 05:41:41
回答 2查看 50关注 0票数 0

这段C#代码经过测试可以正常工作,但在我看来效率很低。例如,对于1000行,如何避免每次foreach迭代的所有开销?

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-24 05:53:25

像这样使用查询

代码语言:javascript
复制
update Ticket
set activeInd = 0
where fkCustomer in (
    select pkCustomer
    from Customer
    where YearEndDeactivateInd = 1
)

在没有适配器的情况下完成

代码语言:javascript
复制
using (var con = new SqlConnection(strConn))
{
    string sql = "here query above";
    con.Open();

    using (var cmd = new SqlCommand(sql, con))
    {
        int rowsAffected = cmd.ExecuteNonQuery();
    }
}
票数 3
EN

Stack Overflow用户

发布于 2020-09-24 05:53:32

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

例如:

代码语言:javascript
复制
UPDATE Ticket 
  SET activeInd = 0 
WHERE 
  fkCustomer IN 
    (SELECT pkCustomer 
     FROM Customer 
     WHERE YearEndDeactivateInd = 1
    )  

或者更好:

代码语言:javascript
复制
UPDATE T 
  SET activeInd = 0 
FROM 
  Ticket T 
  INNER JOIN Customer C 
    ON T.fkCustomer = C.pkCustomer 
WHERE 
  C.YearEndDeactivateInd = 1

无论哪种方式,SQL本身在这方面的效率都要高得多。

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

https://stackoverflow.com/questions/64036650

复制
相关文章

相似问题

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