【问题标题】:TSQL ADO.NET Incorrect Row Count ReturnedTSQL ADO.NET 返回不正确的行数
【发布时间】:2012-10-24 01:34:23
【问题描述】:

在 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 引用。
在调试中,如果我停止回调(放慢速度),那么我不会收到此错误。
我想知道任务中的 BeginExecuteNonQuery 是否不是问题。
这个错误的 rowCount 与任何一个异步 rowCount 都不匹配,但在同一范围内。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      相关资源
      最近更新 更多