使用C#更新SQL表格并参考Datatable的最佳方法

4

我有一个包含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)按照下面所示,在一个事务中并行循环构建更新语句并执行会更快吗?
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)

哪种方法更快更安全,因为我需要在最短的时间内完成更新,并避免表格锁定,因为它是我的数据库中的主要交易表。或者还有其他方法可以实现这一点吗?


我会将数据表导入到临时表中,然后仅通过SQL进行更新。我不知道你的情况是否允许这样做。 - Sklivvz
如果我使用临时表,并使用In语句,那么会更快并且造成较少的锁定吗? - Kush
你可以将多线程的部分委托给SQL,当然所有的数据都会存储在SQL Server的内存中,所以速度更快,也不会出现死锁。 - Sklivvz
1个回答

0

相较于来自 select 的单个更新,逐行更新会更慢。为此,我建议:

  1. 在您的数据库中创建一个类似下面的 TicketTable 表 {TicketID,TargetID,SomePrecalculatedRes1,...,SomePrecalculatedResN}
  2. 使用与上述表相同的结构创建 C# DataTable 对象
  3. 使用将用于更新的数据填充表内容。每行 DataTable 必须具有相同的 TicketId。(并行处理可能会带来一些好处)
  4. 使用 SqlBulkCopy 批量插入 DataTable 的内容到 db.TicketTable
  5. 创建一个更新命令,考虑到您的 TicketId 并从您的 Ticket 表中选择更新目标表

批量复制是否有效,如果结构不同?由于数据属于另一家公司的应用程序,他们不愿意共享其结构,因此我无法访问源数据库的主表结构。 - Kush
批量复制应该在一个中间表中完成(即票据表,参见第2项)。 - Yaugen Vlasau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接