MDB でオートナンバー型の列を用意し、ADO.Net から TableAdapter を使って新規行を挿入します。
このとき、TableAdapter.Update() 前は DataTable でオートナンバーに対応する列の値は -1 です。
しかし、TableAdapter.Update() 後も値は -1 のままで、DB側でどの新しい値が振られたのかプログラム側はわかりません。
このDB側で振られた新しい値を.Net側から取得する方法です。
参考にしたのは、
MSDN:@@IDENTITY クライシスを管理するです。
上記MSDNの記事では、JETのほかに、SQLサーバで取得する方法も取り上げられています。
JETでは新規IDの取得に
SELECT @@IDENTITYが使えるようなので、これを用います。
このクエリを使うタイミングは、対象 TableAdpter の RowUpdated イベント時です。
DataSet で Table1TableAdapter が作成されてるものとします。
/// <summary>メンバ変数 TableAdapter</summary>
private DataSetTableAdapters.Table1TableAdapter tblAdp = new DataSetTableAdapters.Table1TableAdapter();
private void frmMain_Load(object sender, EventArgs e)
{
//Diaryテーブルのアダプターのイベントハンドラ定義
tblAdp.Adapter.RowUpdated += new OleDbRowUpdatedEventHandler(Adapter_RowUpdated);
}
private void button1_Click(object sender, EventArgs e)
{
DataSet.Table1DiaryDataTable tbl = new DataSet.Table1DiaryDataTable();
DataRow row = tbl.NewRow();
row["field1"] = "test";
tbl.Rows.Add(row);
//DBに保存(このとき新規行のID列の値は -1 )
tblAdp.Update(tbl);
}
/// <summary>
/// [イベントハンドラ]テーブルのRowUpdateイベント( tblAdp.Update(tbl) 直後に走る)
/// 新規挿入した行のIDを取得する
/// </summary>
void Adapter_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
{
if (e.Status == UpdateStatus.Continue && e.StatementType == StatementType.Insert)
{
OleDbDataAdapter adp = (OleDbDataAdapter)sender ;
//DBが割り当てたIDの値を取得するクエリ
OleDbCommand cmdNewID = new OleDbCommand("SELECT @@IDENTITY", adp.SelectCommand.Connection);
//取得した新規IDをDataTableのID列に入れる。
e.Row["ID"] = (int)cmdNewID.ExecuteScalar();
}
}
これで、DataTable の ID 列にDB側で振られた新しい値が入ってるはずです。