Mono C# SQL 更新“并发冲突”

Posted

技术标签:

【中文标题】Mono C# SQL 更新“并发冲突”【英文标题】:Mono C# SQL Update "Concurrency violation" 【发布时间】:2009-07-10 15:24:22 【问题描述】:

每次我尝试通过 Mono 中的 SqlDataAdapter.Update() 更新一行时,我都会得到:

未处理的异常:System.Data.DBConcurrencyException:并发冲突: UpdateCommand 影响了 0 条记录。 在 System.Data.Common.DbDataAdapter.Update (System.Data.DataRow[] dataRows, Sy stem.Data.Common.DataTableMapping tableMapping) [0x00000]

相关C#代码为:

IDbConnection conn = new SqlConnection(DB_CONN);
DataSet ds = new DataSet();

conn.Open();

IDbCommand command  = conn.CreateCommand();
command.CommandText = "SELECT * FROM TestTable";

SqlDataAdapter    adapter = new SqlDataAdapter((SqlCommand)command);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

adapter.Fill(ds);
ds.Tables[0].TableName = "TestTable";
ds.Tables[0].Rows[0]["testInt"] = 5;

adapter.Update(ds, "TestTable");

在查询到 SQL Server 2008 时记录查询后,它显示:

exec sp_executesql N'UPDATE [TestUpdate] SET [id] = @p1, [testInt] = @p2 WHERE (([id] = @p3) AND ((@p4 = 1 AND [testInt] IS NULL) OR ([testInt] = @p5)))', N'@p1 int, @p2 int, @p3 int, @p4 int, @p5 int',  @p1=1, @p2=5, @p3=1, @p4=NULL, @p5=NULL

数据库是调试此问题的简单测试,由两列组成:整数 id 列 (pk) 和整数 testInt 列,允许为空。除非 testInt 值为 NULL,否则代码工作正常,在这种情况下会抛出异常。

UPDATE [TestUpdate]
   SET [id]      = 1,
       [testInt] = 5
 WHERE (([id] = 1) 
        AND ((NULL = 1 AND [testInt] IS NULL)
             OR ([testInt] = NULL))) 

在这种情况下,@p4 似乎应该为 1,以应用 IS NULL 检查,而不是 NULL,它会导致 = NULL 检查(我相信如果值为 NULL,它会失败)。

这对其他人来说是否像是 Mono 问题,还是我只是在做一些愚蠢/错误的事情?

【问题讨论】:

【参考方案1】:

如果可能,我建议在 .Net 上运行代码并将其查询捕获到 SQL Server。如果它与 Mono 的不同,那么它听起来像是 Mono 中的一个错误。

如果是,请将其归档在: http://www.mono-project.com/Bugs

使用您的测试用例,以便修复。

【讨论】:

我已经提交了一个相关的错误bugzilla.novell.com/show_bug.cgi?id=522624 虽然最初的错误似乎并不是每个人都可以完全重现。鉴于此,我更希望其他人是否遇到过它或知道解决方法。

以上是关于Mono C# SQL 更新“并发冲突”的主要内容,如果未能解决你的问题,请参考以下文章

在带有事务“并发冲突”的 Ado.Net 更新中

并发冲突:更新了预期的 1 条记录中的 0 条

Elasticsearch并发冲突问题

LINQ to SQL语句(13)之开放式并发控制和事务

Devart.Data.MySql:并发冲突:UpdateCommand 影响了预期的 1 条记录中的 0 条

Nacos注册表是怎么解决读写并发冲突的