В обновлении Ado.Net winth транзакция "Нарушение параллелизма" - PullRequest
0 голосов
/ 02 декабря 2011

Я пишу на MySQL 5.5, C #, ADO.NET, DataSet.У меня есть DataSet и DataAdapter.В DataAdapter я переопределяю команды INSERT, UPDATE, DELETE.Когда я использую хранимые процедуры, как эти команды, все хорошо.Однако, когда я использую транзакции в этих хранимых процедурах, я получаю исключение:

Нарушение параллелизма: команда DeleteCommand затронула 0 из ожидаемых 1 записей.

Что я могуделать с этой ошибкой?

Пример: http://dl.dropbox.com/u/46828938/DataGridSample.zip

Чтобы воспроизвести проблему: удалите строку из таблицы данных и нажмите кнопку «Обновить».

DBConcurrencyException («Нарушение параллелизма: команда DeleteCommand»затронут 0 из ожидаемых 1 записей. ") воспроизвести на:" productDataAdapter.Update (dataSet, "Products"); "строка.

Ответы [ 2 ]

1 голос
/ 13 октября 2012

Я изучил множество документов об этой проблеме (msdn, форум mysql, stackoverflow и т. Д.) И вижу:

Проверка реального параллелизма или невозможности выполнения дополнительных запросов:

  1. insert: получить последнюю вставленную строку и сравнение со вставленной строкой.
  2. update: получить обновленную строку (например, по ключу) и сравнение с обновленной строкой.
  3. delete: попытатьсяполучить строку (например, по ключу) и получить значение NULL.

Конечно, все описанные выше сравнения необходимо выполнять в одной логической ванне / соединении и т. д. К сожалению, другой способ проверить «Нарушение параллелизма» или нетMySql 'не существует. (В отличие от других серверов БД).

Я надеюсь, что эта информация кому-то поможет.

0 голосов
/ 18 февраля 2015
SqlCommand com = new SqlCommand("insert into student_info values(@id,@name,@batch)",con);
        com.Parameters.Add(new SqlParameter("@id", dataGridView1.CurrentRow.Cells[0].Value));
        com.Parameters.Add(new SqlParameter("@name", dataGridView1.CurrentRow.Cells[1].Value) );
        com.Parameters.Add(new SqlParameter("@batch", dataGridView1.CurrentRow.Cells[2].Value));
        da.InsertCommand = com;


        com = new SqlCommand("update student_info set name = @name, batch = @batch where s_id = @id", con);
        com.Parameters.Add(new SqlParameter("@id", dataGridView1.CurrentRow.Cells[0].Value));
        com.Parameters.Add(new SqlParameter("@name", dataGridView1.CurrentRow.Cells[1].Value));
        com.Parameters.Add(new SqlParameter("@batch", dataGridView1.CurrentRow.Cells[2].Value));
        da.UpdateCommand = com;

        com = new SqlCommand("delete from student_info where s_id = @id", con);
        com.Parameters.Add(new SqlParameter("@id", dataGridView1.Rows[(dataGridView1.CurrentRow.Index -1)].Cells[0].Value));

Используете ли вы вышеуказанный подход?К счастью, я выяснил причину этого исключения, но все еще ищу ответ.Ошибка возникает, потому что мы используем свойство CurrentRow dataGridView.Он отлично работает с командой вставки и обновления.Но когда мы выбираем cuurentRow для команды удаления, datagridview фактически выбирает следующую строку.Если следующая запись существует, она удаляется, в противном случае выдает ошибку, подобную этой.Я все еще ищу ответ .. К тому времени, когда вы можете использовать CommandBuilder, он отлично работает.

...