参考Datatable C#更新SQL表的最佳方法

时间:2013-06-11 12:21:38

标签: c# .net sql sql-server

我有一个包含Id列的数据表。 Id列与我的表ID列匹配。我需要使用此ID为我的sql表设置单个值。但数据表结构与我的表结构不同,即

  Data Table                        Sql Table
____________      _______________________________________________
ID                ID    | col 1 | col2 | col3 | col4 |final value
1                 1     | a     | b    |c     |d     |N
2                 2     | x     | y    |z     |a     |N

在任何给定时间的数据表将具有超过 500,000 条目。

我的问题是:

1)如何在一个事务中的并行循环中构建Update语句并执行它们会更快,如下所示:

Sqltrn = Sqlconn.BeginTransaction();
Parallel.For (0; Datatable.Rows.Count; i =>
    {
       SqlCmd.CommandText = BuildStatemet;
       SqlCmd.ExecuteNonQuery();
    });
SqlTrn.Commit();

以上方法会导致我的桌子死锁吗?

2)通过从dt表构建一个联系的字符串来执行单个语句:

Update MyTable set  FinalValue = 'Y' WHERE ID in (CreateConcactedStringHere)

哪种方法更快更安全,因为我需要在尽可能短的时间内完成更新,并避免表锁定,因为它是我数据库中的主要事务表。或者还有其他方法可以达到这个目的吗?

1 个答案:

答案 0 :(得分:0)

单个行更新速度较慢,而不是来自select的单个更新。 为此,我会建议

  1. 在您的数据库中创建一个类似于TicketTable的表{TicketID,TargetID,SomePrecalculatedRes1,...,SomePrecalculatedResN}
  2. 在C#中创建一个与表格结构相同的DataTable对象 上述
  3. 按照您将用于更新的数据填写表格内容。 DataTable的每一行都具有相同的ticketId。 (并行处理可能会给你一些好处)
  4. 批量将DataTable内容插入db.TicketTable(请参阅SqlBulkCopy
  5. 创建一个更新命令,该命令会考虑您的ticketId和更新 来自故障单表中的选择的目标表
相关问题