以下のようなテーブルアダプターのpartialクラスを作成する。
※テーブルにはオートナンバーのID列が存在する。

1using System.Data;
2using System.Data.OleDb;
3 
4namespace AdapterRowUpdated.TESTDataSetTableAdapters
5{
6    public partial class TESTTableAdapter
7    {
8        public void AddRowUpdatedEventHandler()
9        {
10            this.Adapter.RowUpdated +=
11                new OleDbRowUpdatedEventHandler(Adapter_RowUpdated);
12        }
13        /// <summary>
14        /// テーブルのRowUpdateイベント(TableAdapter.Update() 直後に走る)
15        /// 新規挿入した行のIDを取得
16        /// </summary>
17        void Adapter_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
18        {
19            if (e.Status == UpdateStatus.Continue &&
20                e.StatementType == StatementType.Insert)
21            {
22                OleDbDataAdapter da = (OleDbDataAdapter)sender;
23                OleDbCommand cmd =
24                    new OleDbCommand("SELECT @@IDENTITY",
25                                    da.UpdateCommand.Connection);
26                if (da.UpdateCommand.Transaction != null)
27                {
28                    cmd.Transaction = da.UpdateCommand.Transaction;
29                }
30                ((TESTDataSet.TESTRow)e.Row).ID = (int)cmd.ExecuteScalar();
31            }
32        }
33    }
34}

実際にUPDATEを実行する側では、テーブルアダプターのUPDATE実行前にAddRowUpdatedEventHandlerメソッドを呼び出す。

1var ta = new TESTDataSetTableAdapters.TESTTableAdapter();
2ta.AddRowUpdatedEventHandler();
3ta.Update(TESTDataTable);
4ta.Dispose();

こうすることにより、Updateの引数で渡したTESTDataTableのID列にオートナンバーの値が入った状態になる。

コメントを残す

メールアドレスが公開されることはありません。