人気ブログランキング | 話題のタグを見る
(.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 が作成されてるものとします。

/// <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側で振られた新しい値が入ってるはずです。
by jehoshaphat | 2009-03-22 23:35 | .Net開発


<< レンタルサーバ アイルでのMy... (.Net)MemoryStr... >>