2012-01-07 13 views
3

DataGridViewと他のUIコンポーネントをセットアップして、ユーザーがSQLite DBからデータを編集できるようにしました。しかし、これらの変更(アプリケーションでも正しく表示されていても)はDBに保存されません。私はこのコードbindingSourceの変更をソースDBに正しくコミットするにはどうすればよいですか?

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

を試してみましたが、並行処理の例外があります:UpdateCommandの予想1つのレコードで0に影響を与えた:

System.Data.DBConcurrencyExceptionは、未処理のメッセージ=同時実行 違反でした。

DBへのバインディングソースの変更はどのようにする必要がありますか?


POSTのEDIT 私は、プログラムを起動したときに、その後のDataGridViewの2行目をクリックし、第三に、今回のプログラムは、同時実行例外を発生させ、この例外が発生しました。彼の助けを借りて、この問題をより詳細に理解してほしい。

ありがとうございます、皆さん!

+1

並行処理例外とは、読んだ人と更新しようとするときの間に、誰か他の人があなたのデータを変更したことを意味します。基本的に、この場合、再度データをロードして新しいデータをユーザーに表示して、変更を再度行うか、または新しい変更をデータベースにマージするための競合解決戦略が必要になります。 –

+0

@marc_sありがとう、マーク!では、データを再度ロードして使用の変更を表示するにはどうすればよいですか? – kseen

答えて

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

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をDataSourceとして再度割り当て、ユーザーがデータを再度入力する必要があります。

0

たぶん、オーバーサイズが、あなたはこの記事を読んトランザクションを使用しようとすることができ、役に立つことができます

Transactional sqlite

2

は同じ問題を抱えていました。トリックは、一度テーブルを更新すると、 "空"のGetChanges()になるはずです。あなたはメソッドAcceptChanges()を呼び出すことによってそれを行います。だから...

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

同じ問題があれば、問題なく動作するはずです。

関連する問題