2012-01-07 27 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(); 

它應該工作,只要它是同樣的問題。