在 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。