Как правильно зафиксировать изменения bindingSource в исходной БД? - PullRequest
3 голосов
/ 07 января 2012

Я настраиваю DataGridView и другие компоненты пользовательского интерфейса, чтобы пользователь мог редактировать данные из БД SQLite. Но эти изменения (даже если они правильно отображаются в приложении) не сохраняются в БД. Я пробовал этот код

aBindingSource.EndEdit();
dbDataSetA.GetChanges();
aTableAdapter.Update(dbDataSetA.Accounts);   

но есть исключение параллелизма:

System.Data.DBConcurrencyException не обработано. Сообщение = параллелизм. нарушение: команда UpdateCommand затронула 0 из ожидаемых 1 записей.

Итак, как мне зафиксировать изменения в bindingsource для БД, ребята?


РЕДАКТИРОВАНИЕ ПОЧТЫ Я получил это исключение, когда запускаю программу, затем нажимаю на вторую строку в DataGridView, а затем на третью, и на этот раз программа вызывает исключение параллелизма. Надеюсь, что он поможет разобраться в этом вопросе.

Заранее спасибо, ребята!

Ответы [ 4 ]

3 голосов
/ 06 февраля 2012

Была такая же проблема.Хитрость в том, что после обновления таблицы вы должны «очистить» GetChanges().Вы делаете это, вызывая метод AcceptChanges().Итак ...

aBindingSource.EndEdit();
dbDataSetA.GetChanges();
aTableAdapter.Update(dbDataSetA.Accounts); 
dbDataSetA.AcceptChanges();

Это должно работать при условии, что это та же проблема.

3 голосов
/ 13 января 2012

Как-то так?

try
{
   aBindingSource.EndEdit();
   dbDataSetA.GetChanges();
   aTableAdapter.Update(dbDataSetA.Accounts);   
}
catch (DBConcurrencyException exc)
{
   MessageBox.Show("original data changed, please redo updates");
   aTableAdapter.Fill(dbDataSetA);
}

Затем переназначьте dbDataSetA как DataSource, если необходимо, и пользователь должен будет снова ввести данные.

1 голос
/ 07 января 2012

Вы можете использовать адаптер в сочетании с компоновщиком команд, что-то вроде этого:

DataTable table = new DataTable();
var adapter = new SqlDataAdapter("SELECT * FROM ...", con)) 

//Load the dataTable and the bound datagridView
adapter.Fill(table);



    using (new SqlCommandBuilder(adapter))
    {
      //When done you can update the database using the Command builder
      adapter.Update(table);
    }
0 голосов
/ 17 января 2012

Возможно, слишком большой, но вы можете попробовать использовать Транзакция , просто прочитайте это сообщение, может быть полезно:

Транзакционный sqlite

...