Странная проблема с обновлением базы данных из набора данных - PullRequest
1 голос
/ 21 декабря 2008

Операции:

Удалить в DataGridView выбранную строку из набора данных:

FuDataSet.FuRow row = (FuDataSet.FuRow) ((DataRowView)FuBindingSource.Current).Row;
row.Delete();

Чтобы добавить новую строку, я делаю:

FuDataSet.FuRow row = FuDataSet.Fus.NewFuRow();
row.Someting = "Some initial Content";
row.SomethingElse = "More Initial Content";
...
FuDataSet.Fus.AddFuRow(row);

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

FuDataSet.FuRow row = (FuDataSet.FuRow) (((DataRowView) FuBindingSource.Current).Row);
row.Someting = someTextBox.text;
...

Сохранить в базе данных:

Validate();
FuBindingSource.EndEdit();
FuTableAdapter.Update(FuDataSet.Fus); <-- Exception here

Я использую стандартные DatagridView, Dataset, TableAdapter, BindingSource Scheme VS автоматически устанавливает после определения структуры базы данных. Используется только одна таблица, и используется SQL Server compact 3.5.

Теперь моя проблема в том, что я получаю исключение параллелизма (DeletedRowInaccessibleException) каждый раз, когда я делаю это (начиная с пустой базы данных): Создание новой строки, удаление этой строки, сохранение в базе данных, новая строка, сохранение в базе данных, удаление этой строки, сохранение в базе данных <- исключение </p>

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

Если я перезагружаю базу данных после каждого сохранения через FuTableAdapter.Fill (FuDataSet.Fus), проблема исчезнет. Однако я не думаю, что это может быть намерением.

Я надеюсь, что кто-то может помочь мне и обнаружить ошибку в конструкции или объяснить, что может пойти не так.

Спасибо!

Ответы [ 2 ]

1 голос
/ 22 декабря 2008

Есть ли в вашей таблице столбец идентификатора с автоинкрементом в качестве первичного ключа? Если это так, возможно, он не обновляет таблицу набора данных новым значением после вставки, поэтому, когда вы его удаляете, она не может найти строку в базе данных. Это может объяснить, почему это работает, когда вы вызываете метод Fill ().

Вам нужно как-то вернуть первичный ключ на вставке, чтобы таблица набора данных синхронизировалась с базой данных. Если для вставки используется процедура сохранения, первичный ключ можно вернуть с помощью параметра out. Не уверен, что лучший способ, если вы используете в команде оператор вставки SQL, но затем вам нужно будет вернуть первичный ключ из таблицы базы данных и назначить его строке таблицы базы данных.

Не уверен, что вы делаете это после сохранения, но вызов FuDataSet.AcceptChanges () поможет набору данных отслеживать новые изменения после обновления базы данных.

0 голосов
/ 23 декабря 2008

То, что вы перечислили там, правильно. Когда новая строка создается в таблице набора данных, она создает свой собственный идентификатор. При сохранении в базе данных таблица базы данных также создает свой собственный идентификатор, который в большинстве случаев будет отличаться от идентификатора в наборе данных.

Когда вы создали адаптер таблицы для этой таблицы, вы должны были предоставить состояние sql для создания таблицы набора данных. На кнопке «Дополнительные параметры» есть флажок «Обновить таблицу данных». Убедитесь, что после вставки и обновления добавлен оператор SQL для извлечения столбца идентификаторов.

Если флажок снят, то я не уверен, что еще можно сделать, кроме перезагрузки данных после каждого сохранения, что не будет оптимальным.

Извините, я не могу больше помочь. Желаем удачи

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