首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataReader和SQLCommand

DataReader和SQLCommand
EN

Stack Overflow用户
提问于 2010-12-15 09:39:19
回答 3查看 1.4K关注 0票数 1

就像他们在收音机里说的那样--长时间的听众第一次打电话……

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

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

这是问题所在。在处理了X条记录之后--其中X看起来大约是60条--更新超时。

在写这篇文章的时候--有趣的是这是怎么发生的,不是吗--我的大脑告诉我这与事务隔离和/或锁定有关……我正在使用datareader读取源记录,但更改了这些记录...我可以看到这会导致不同事务隔离的问题,所以我将对此进行研究……

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

干杯

皮特

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-15 10:16:12

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

如果您必须在数据库之外执行此操作,则可以在没有任何锁的情况下执行源查询,前提是这样做对您来说是安全的。您可以通过设置隔离级别或只需在查询中将with (nolock)附加到表名/别名之后来完成此操作。

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

票数 2
EN

Stack Overflow用户

发布于 2010-12-15 09:44:26

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

票数 0
EN

Stack Overflow用户

发布于 2010-12-15 09:51:35

有没有什么原因不能让游标中的select/updates返回给应用程序的最终结果呢?如果进程属于数据库,最好将其保留在数据库中。

或者,像John提到的那样更新命令超时是您唯一的另一种选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4445988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档