就像他们在收音机里说的那样--长时间的听众第一次打电话……
这是我的问题。VS 2005 SQL Server 2005数据库。Windows窗体应用程序。C#。大表- 780K条记录。我称它为源表。需要遍历源表,并针对每个记录对另一个表做一些操作,然后写回到源表,说明它已经完成。我还没有更新第二个表...
我使用连接对象A使用datareader遍历源表的所有记录。对于每条记录,我构建一条update语句来更新源表,以指示该记录已被处理-并对connection对象B使用SQL命令来执行此uodate。所以不同的连接对象,因为我知道dataReader需要独占。
这是问题所在。在处理了X条记录之后--其中X看起来大约是60条--更新超时。
在写这篇文章的时候--有趣的是这是怎么发生的,不是吗--我的大脑告诉我这与事务隔离和/或锁定有关……我正在使用datareader读取源记录,但更改了这些记录...我可以看到这会导致不同事务隔离的问题,所以我将对此进行研究……
有人看过这个并知道如何解决它吗?
干杯
皮特
发布于 2010-12-15 10:16:12
如果没有更多的细节,解决方案的可能性是非常多的。正如iivel所指出的,您可以在数据库本身内执行所有活动--如果您必须执行的操作类型可行的话。我要补充的是,使用基于集合的操作而不是游标来做这样的事情很可能是最好的。
如果您必须在数据库之外执行此操作,则可以在没有任何锁的情况下执行源查询,前提是这样做对您来说是安全的。您可以通过设置隔离级别或只需在查询中将with (nolock)附加到表名/别名之后来完成此操作。
还有其他几种选择。例如,您可以进行批量操作,例如一次将1000条记录从源表拉入内存,断开连接,然后执行所需的任何操作和更新。处理完所有1000条记录后,再处理另一组1000条记录,依此类推,直到处理完队列中的所有记录。
发布于 2010-12-15 09:44:26
听起来您需要在命令对象上设置命令超时属性。http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout(v=vs.80).aspx
发布于 2010-12-15 09:51:35
有没有什么原因不能让游标中的select/updates返回给应用程序的最终结果呢?如果进程属于数据库,最好将其保留在数据库中。
或者,像John提到的那样更新命令超时是您唯一的另一种选择。
https://stackoverflow.com/questions/4445988
复制相似问题