2009-07-10 108 views
0

每当我试着通过SqlDataAdapter.Update()以单声道更新行,我得到:单C#SQL更新 “并发冲突”

未处理的异常:System.Data.DBConcurrencyException:并发冲突: UpdateCommand影响了0条记录。 在System.Data.Common.DbDataAdapter.Update(的System.Data.DataRow []数据行,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,在这种情况下,该exeption被抛出。

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会失败)。

这是否看起来像一个单声道的问题给其他人,还是我只是在做一些愚蠢/错了吗?

回答

1

如果可能,我会建议在.Net上运行代码并将其查询捕获到SQL Server。如果它与Mono有所不同,那么这听起来像是Mono中的一个bug。 http://www.mono-project.com/Bugs

与你的测试用例,因此它可以固定:

如果是,请备案。

+0

我已经提交了一个相关的错误https://bugzilla.novell.com/show_bug.cgi?id=522624 虽然原始的错误似乎对每个人都不是完全可重复的。鉴于此,我更希望是否有其他人遇到过它,或者知道解决方法。 – jxelam 2009-07-17 09:22:33