Сложная ошибка с синхронизацией столбцов автоинкремента DataTable / Datasource при удалении строк - PullRequest
0 голосов
/ 10 декабря 2011

Я опубликовал этот вопрос несколько дней назад, но попытался правильно объяснить проблему, поэтому, надеюсь, эта попытка будет более понятной.Я столкнулся с ошибкой DBConcurrency при попытке использовать функцию C # MySQLDataAdapter.Update () на моем источнике данных, который является базой данных MYSQL.

Источник таблицы данных, которой я манипулирую в моей программе на C #, представляет собой таблицув базе данных, которую я извлек, используя MySQLDataAdapter.Я хочу манипулировать строками, а затем использовать функцию Update () адаптера данных, чтобы сохранить изменения в базе данных.По большей части это работает хорошо, но я обнаружил одну трудную для решения проблему, связанную с автоинкрементными столбцами.

Допустим, в таблице базы данных есть список записей, например:

1 Apple
2 Orange
3 Banana
4 Pear

Гдепервый столбец идентификатора автоинкрементно.Я могу очень хорошо заполнить DataTable и выполнить автоинкремент с помощью MissingSchemaAction.AddWithKey () и т. Д., И если я добавлю новую запись "Grapes" в DataTable, столбец идентификатора автоинкремента будет равен 5, и база данных примет его, когда язапустите Update () для него.

Однако, если я добавлю запись Grapes в DataTable, затем удалю ее, а затем добавлю снова (неправдоподобно, но это случается), автоинкремент DataTable просто продолжает тикатьвверх, теперь это выглядит так:

1 Apple
2 Orange
3 Banana
4 Pear
6 Grapes

И если я сейчас запусту Update (), автоидентификатор записи "Grapes" будет сохранен в таблице DATABASE как 5, потому что там происходит автоинкремент базы данных.в, но в DataTable он указан как 6, поэтому они теперь не синхронизированы, и если я удаляю строку Grapes из DataTable и снова запускаю Update (), я получаю ошибку:

"Concurrency violation: the DeleteCommand affected 0 of the expected 1 records."

в строке Update () моей программы.

Я посмотрел вокруг, и кажется, что такого рода рассинхронизация может происходить довольно регулярно, но на этом этапе мне интересноg если я могу что-то сделать, не возвращаясь назад и не разрывая большую часть написанного мною кода.

1 Ответ

1 голос
/ 02 мая 2012

Единственный способ, которым я смог обойти это, это сделать следующее:

DataTable copyTable = Table.Copy();
Table.Clear();

for( int i = 0; i < copyTable.Rows.Count; i++ )
 {
      DataRow r = copyTable.Rows[i];
      r[0] = i;
      Table.ImportRow( r );
 }

По сути, после удаления строки я копирую таблицу во временную таблицу, затем перебираю оставшиеся строки, устанавливаю свой столбец «ID» (r [0]), используя количество строк.

...