How to properly commit bindingSource changes to source DB?

孤街浪徒 提交于 2019-12-13 13:38:23

问题


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!


回答1:


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.




回答2:


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.




回答3:


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);
    }



回答4:


Maybe oversize but can you try to use Transaction just read this Post, could be helpful :

Transactional sqlite



来源:https://stackoverflow.com/questions/8769005/how-to-properly-commit-bindingsource-changes-to-source-db

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!