在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引用 在调试中,如果我在回调中停止(减慢它),那么我不会得到这个错误 我想知道Task中的BeginExecuteNonQuery是不是问题 这个错误的rowCount与asynch rowCounts不匹配,但是在相同的范围内。
此基本代码处理了数百万行 没有改变任何TSQL 转换为生产者消费者时,它变坏了。
要将文档标记为正在进行中,请在生产者端使用非常相似的TSQL,它没有任何问题。该循环还有一个BeginExecuteNonQuery。
答案 0 :(得分:0)
问题似乎是在生产者和消费者方面共享连接和命令。
是的,我意识到这显然是一件坏事 当它是一个单循环(没有生产者消费者方面)时,可以分享该命令 当我转换为消费者生产者时,我没想到要拆分命令。