Обновление Mono C # SQL "Нарушение параллелизма" - PullRequest
0 голосов
/ 10 июля 2009

Каждый раз, когда я пытаюсь обновить строку с помощью 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 для кого-то еще, или я просто делаю что-то глупое / неправильное?

1 Ответ

1 голос
/ 11 июля 2009

Если возможно, я бы предложил запустить код в .Net и записать его запрос в SQL Server. Если он отличается от того, что имеет Mono, то это звучит как ошибка в Mono.

Если это так, пожалуйста, отправьте его по адресу: http://www.mono -project.com / Bugs

с вашим тестовым набором, чтобы он мог исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...