0

在 C# .NET 4.0 中有一个 BlockingCollection 取自

阻塞集合

示例 BC_AddTakeCompleteAdding

我的问题是 .NET 中的 SQLCommand.ExecuteNonQuery 返回错误的行数。
更新在主键上,所以应该得到一行。
有时会得到正确的数字。
在 .NET 中经常得到大于 1 (100-10000) 的数字。
即使针对相同的 PK 运行完全相同的 TSQL,它也不总是相同的错误数字。
每次都可以将TSQL复制粘贴到SSMS并得到正确答案(1)。

update [docSVsys]  set [FTSstatus] = '1', [FTSdate] = '10/23/2012 8:51:32 AM' , 
textHash = '5b4d553360fbe733a66eebf36fa666f7', [textSize] = '39504' 
where [sID] = '1525850'

声明使用的变量并且没有其他变量被命名为 rowsRet5

int rowsRet5 = sqlCmdUpate.ExecuteNonQuery();

检查了该 textHash 值,仅更新了一行。
它似乎执行了正确的更新,但报告了错误的计数。
鉴于计数是错误的,不愿意在生产数据上使用它。

该命令位于消费者端的末尾。
在此更新之上有两个 .BeginExecuteNonQuery。
这些更新针对不同的表,不引用 docSVsys。
这些表确实有对 docSVsys 的 FK 引用。
在调试中,如果我停止回调(减慢速度),那么我不会收到此错误。
我想知道任务中的 BeginExecuteNonQuery 是否不是问题。
这个错误的 rowCount 与任何一个异步 rowCount 都不匹配,但在同一范围内。

此基本代码已处理数百万行。
没有改变任何TSQL。
转换为生产者消费者时它变坏了。

要将文档标记为正在进行中,请在生产者端使用非常相似的 TSQL,它没有问题。该循环也有一个 BeginExecuteNonQuery。

4

1 回答 1

0

问题似乎是在生产者和消费者端共享连接和命令。

是的,我意识到这显然是一件坏事。
当它是一个单循环(没有生产者消费者端)时,可以共享该命令。
当我转换为消费者生产者时,我没有考虑拆分命令。

于 2012-10-23T17:25:26.240 回答