2012-01-07 65 views
3

我设置DataGridView和其他UI组件,以允许用户编辑SQLite数据库中的数据。但是这些更改(即使它们在应用程序中正确显示)不会保存到数据库。我曾尝试这个代码如何正确提交bindingSource更改到源数据库?

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

但也有并发异常:

System.Data.DBConcurrencyException了未处理消息=并发 冲突:在更新命令影响的预期1条记录0。

那么我应该如何提交绑定到数据库的更改,家伙?


帖子编辑 我得到这个异常,当我启动该程序,然后单击在DataGridView的第二行,然后在第三,这一次程序提高并发异常。希望他的帮助能更详细地解决这个问题。

在此先感谢,伙计们!

+1

Concurrencyexception意味着:在您阅读它和尝试更新它之间的时间内,某人或其他人已经更改了您的数据。基本上,在这种情况下,您需要再次加载数据并向用户显示新数据,以便他可以再次执行更改,或者需要一些冲突解决策略将新更改合并到数据库中。 – 2012-01-07 10:35:10

+0

@marc_s好的,谢谢,Marc!那么如何再次加载数据以显示使用更改? – kseen 2012-01-07 10:37:40

回答

1

你可以结合使用的适配器中的命令生成器,像这样:

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

请参阅我上面的修改。我认为解决方案比您提出的要容易得多。希望这个编辑能帮助你更详细地理解它。谢谢! – kseen 2012-01-07 12:24:01

3

像这样的事情?

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

,如果需要和用户必须再次输入数据并重新分配dbDataSetA作为数据源。

2

有同样的问题。诀窍是,一旦你更新表格,你应该“清空”GetChanges()。你通过调用方法AcceptChanges()来做到这一点。所以...

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

它应该工作,只要它是同样的问题。

相关问题