1

正如他们在广播中所说的那样 - 长时间的听众第一次来电......

这是我的问题。VS 2005 SQL Server 2005 数据库。Windows 窗体应用程序。C#。大表 - 780K 记录。我将其称为源表。需要循环遍历源表,并为每条记录对另一个表做一些事情,然后写回源表它已完成。我还没有更新第二张表...

我使用数据读取器使用连接对象 A 循环遍历源表的所有记录。对于每条记录,我构建一个更新语句来更新源表以指示该记录已被处理 - 并针对连接对象 B 使用 SQL 命令来执行此操作乌达泰。如此不同的连接对象,因为我知道 dataReader 想要独占。

这就是问题所在。在处理 X 记录后 - X 似乎约为 60 - 更新超时。

在写这篇文章时——这很有趣,不是吗——我的大脑告诉我这与事务隔离和/或锁定有关……即我正在使用数据读取器读取源记录,但更改了这些记录……我可以看到这会导致不同事务隔离的问题,所以我会调查一下......

任何人都看过这个并且知道如何解决它?

干杯

皮特

4

3 回答 3

2

没有更多细节,解决方案的可能性非常多。正如iivel 所指出的,您可以在数据库本身内执行所有活动——如果这对于您必须执行的操作类型是可能的。我只想补充一点,最好使用基于集合的操作而不是游标来做这样的事情。

如果您必须在数据库之外执行此操作,那么您的源查询可以在没有任何锁的情况下执行,如果在您的情况下这样做是安全的。您可以通过设置隔离级别或简单地with (nolock)在查询中的表名/别名后附加来做到这一点。

还有其他几个选项。例如,您可以分批操作,例如一次将 1000 条记录从源表中拉入内存,断开连接,然后执行您需要的任何操作和更新。处理完所有 1000 条记录后,处理另一组 1000 条记录,依此类推,直到处理完队列中的所有记录。

于 2010-12-15T02:16:11.963 回答
0

听起来您需要在命令对象上设置命令超时属性。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout(v=vs.80).aspx

于 2010-12-15T01:44:26.007 回答
0

是否有任何原因您不能在游标中进行选择/更新并将最终结果计数返回给应用程序?如果该进程属于数据库,最好将其保留在那里。

正如约翰提到的那样,交替更新命令 timout 是您唯一的选择。

于 2010-12-15T01:51:35.123 回答