2009-07-10 36 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 

データベースは、2つの列で構成されるこの問題をデバッグするための簡単なテストです:整数のidカラム(PK)と整数のtestInt列.Nullが許可されています。 testIntの値がNULLの場合を除き、コードは正常に動作します。この場合、例外がスローされます。

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

(私は値がNULLだった場合は失敗するだろうと考えている)= NULLチェックになりNULLとは反対に、NULLチェックIS適用すると、@ P4は、このシナリオでは1でなければなりません表示されます。

これは他の人にモノ問題のように見えるのですか、何かばかげている/間違っていますか?

答えて

1

可能であれば、.NETでコードを実行し、そのクエリをSQL Serverにキャプチャすることをお勧めします。 Monoとは異なる場合、Monoのバグのように聞こえます。それが固定できるように、テスト・ケースで http://www.mono-project.com/Bugs

:それがある場合

、でそれを提出してください。

+0

私は関連するバグを提出しました。https://bugzilla.novell.com/show_bug.cgi?id=522624 元のバグは全員が完全に再現できないようですが、それを考えると、他の誰かがそれに遭遇した場合や、回避策を知りたいと思ったのです。 – jxelam