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 更新“并发冲突”的主要内容,如果未能解决你的问题,请参考以下文章