3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net,SQL)JET(MDB)でINSERT直後のオートナンバー型IDを取得する

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 が作成されてるものとします。

///

メンバ変数 TableAdapter

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);

}

 

///

/// [イベントハンドラ]テーブルのRowUpdateイベント( tblAdp.Update(tbl) 直後に走る)

/// 新規挿入した行のIDを取得する

///

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側で振られた新しい値が入ってるはずです。