Каждый раз, когда я пытаюсь обновить строку с помощью SqlDataAdapter.Update () в Mono, я получаю:
Необработанное исключение: 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
База данных - это простой тест для отладки этой проблемы, состоящий из двух столбцов: столбца целочисленного идентификатора (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 для кого-то еще, или я просто делаю что-то глупое / неправильное?