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

using System.Data;
using System.Data.OleDb;

namespace AdapterRowUpdated.TESTDataSetTableAdapters 
{
    public partial class TESTTableAdapter 
    {
        public void AddRowUpdatedEventHandler()
        {
            this.Adapter.RowUpdated += 
                new OleDbRowUpdatedEventHandler(Adapter_RowUpdated);
        }
        /// <summary>
        /// テーブルのRowUpdateイベント(TableAdapter.Update() 直後に走る)
        /// 新規挿入した行のIDを取得
        /// </summary>
        void Adapter_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
        {
            if (e.Status == UpdateStatus.Continue && 
                e.StatementType == StatementType.Insert)
            {
                OleDbDataAdapter da = (OleDbDataAdapter)sender;
                OleDbCommand cmd = 
                    new OleDbCommand("SELECT @@IDENTITY", 
                                    da.UpdateCommand.Connection);
                if (da.UpdateCommand.Transaction != null)
                {
                    cmd.Transaction = da.UpdateCommand.Transaction;
                }
                ((TESTDataSet.TESTRow)e.Row).ID = (int)cmd.ExecuteScalar();
            }
        }
    }
}

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

            var ta = new TESTDataSetTableAdapters.TESTTableAdapter();
            ta.AddRowUpdatedEventHandler();
            ta.Update(TESTDataTable);
            ta.Dispose();

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

コメントを残す

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