返回TSQL ADO.NET错误的行数

时间:2012-10-23 15:25:45

标签: .net tsql ado.net sql-server-2008-r2 concurrent-collections

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

的BlockingCollection

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。

1 个答案:

答案 0 :(得分:0)

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

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