0

在C#.NET 4.0有一个从TSQL ADO.NET不正确的行数返回

BlockingCollection

样品BC_AddTakeCompleteAdding

我的问题是,在.NET中SQLCommand.ExecuteNonQuery是采取了BlockingCollection返回错误的行数。
更新在主键上,所以应该得到一行。
有时会得到正确的数字。
通常在.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。
这些表确实有FK参考docSVsys。
在调试中,如果我停在回调(慢下来),那么我不会得到这个错误。
我想知道如果BeginExecuteNonQuery任务不是问题。
这个错误的rowCount与任何异步rowCounts不匹配,但在相同的范围内。

此基本代码已处理了数百万行。
未更改任何TSQL。
转换为生产者消费者时,它变得很糟糕。

要将文档标记为正在处理中,请在生产者端使用非常类似的TSQL,并且不存在任何问题。该循环也有一个BeginExecuteNonQuery。

回答

0

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

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