I setup DataGridView and other UI components to allow user to edit data from SQLite DB. But these changes (even they are properly shows in application) doesn't saves to DB. I have tried this code
aBindingSource.EndEdit();
dbDataSetA.GetChanges();
aTableAdapter.Update(dbDataSetA.Accounts);
but there are concurrency exception:
System.Data.DBConcurrencyException was unhandled Message=Concurrency
violation: the UpdateCommand affected 0 of the expected 1 records.
So how should I commit bindingsource changes to DB, guys?
POST EDIT
I got this exception when I start the program, then click on second row in DataGridView and then on third and this time program raise a concurrency exception. Hope his help get this issue more detailed.
Thanks in advance, guys!
Something like this?
try
{
aBindingSource.EndEdit();
dbDataSetA.GetChanges();
aTableAdapter.Update(dbDataSetA.Accounts);
}
catch (DBConcurrencyException exc)
{
MessageBox.Show("original data changed, please redo updates");
aTableAdapter.Fill(dbDataSetA);
}
Then reassign dbDataSetA as DataSource if needed and user has to enter data again.
Had the same problem. Trick is, once you update table, you should "empty" GetChanges()
. You do that by calling method AcceptChanges()
. So...
aBindingSource.EndEdit();
dbDataSetA.GetChanges();
aTableAdapter.Update(dbDataSetA.Accounts);
dbDataSetA.AcceptChanges();
It should work, provided it is the same problem.
You could use an Adapter in combination with a command builder, something like this :
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);
}
Maybe oversize but can you try to use Transaction just read this Post, could be helpful :
Transactional sqlite