DataReader和SQLCommand

时间:2010-12-15 01:39:19

标签: c# .net connection datareader sqlcommand

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

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

我使用连接对象A的datareader遍历源表的所有记录。对于每个记录,我构建一个更新语句来更新源表以指示此记录已被处理 - 并对连接对象B使用SQL命令做这个uodate。所以不同的连接对象,因为我知道dataReader想要一个独占。

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

写这篇文章时 - 有趣的是这不会发生 - 我的大脑告诉我这与交易隔离和/或锁定有关......即。我正在使用datareader读取源记录,但更改了这些记录......我可以看到这会导致不同的事务隔离问题,所以我会调查...

有人看过这个并知道如何解决它吗?

干杯

皮特

3 个答案:

答案 0 :(得分:1)

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

如果您必须在数据库之外执行此操作,那么您的源查询可以在没有任何锁定的情况下执行,如果在您的情况下这是安全的事情。您可以通过设置隔离级别或在查询中的表名/别名之后添加with (nolock)来实现此目的。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

如John提到的那样,交替更新命令timout是你唯一的另一个赌注。