自動インクリメント整数である ID と呼ばれる 1 つのフィールドを持つデータベース テーブルがあります。TableAdapter を使用すると、既存の行を読み取って変更したり、新しい行を作成したりできます。
ただし、新しく挿入された行を変更しようとすると、DBConcurrencyException が発生します。
OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Shift.mdb;Persist Security Info=True");
ShiftDataSetTableAdapters.ShiftTableAdapter shiftTA = new ShiftDataSetTableAdapters.ShiftTableAdapter();
shiftTA.Connection = conn;
ShiftDataSet.ShiftDataTable table = new ShiftDataSet.ShiftDataTable();
ShiftDataSet.ShiftRow row = table.NewShiftRow();
row.Name = "life";
table.Rows.Add(row);
shiftTA.Update(row); // row.ID == -1
row.Name = "answer"; // <-- all fine up to here
shiftTA.Update(row); // DBConcurrencyException: 0 rows affected
別の質問ですが、新しい行を挿入するたびにテーブルを作成する必要がないように、使用できる NewShiftRow() メソッドの静的タイプはありますか。
コードの問題は、最初の Update() 呼び出しの後でも -1 である row.ID に起因すると思います。挿入は成功し、データベース内の行には ID の有効な値があります。
2 番目の Update 呼び出しを続行できるように、その ID を取得するにはどうすればよいですか?
アップデート:
これは、この設定を使用して自動的に実行できたようです。ただし、msdn socialの回答によると、OLEDB ドライバーはこの機能をサポートしていません。
ここからどこへ行けばよいかわからない場合は、oledb 以外のものを使用しますか?
アップデート:
SQLCompact を試してみましたが、同じ制限があることがわかりました。複数のステートメントはサポートされていません。
最後の質問: 挿入された行の値を取得できる単純な (単一ファイル ベースの) データベースはありますか。