Access データベース更新時に OleDbDataAdapter.RowUpdated イベントを利用した自動インクリメント値の取得&設定方法

  Access データベースに OleDbDataAdapter を使って新規のレコードを追加する時、OleDbDataAdapte の RowUpdated イベントを利用して、自動インクリメント列の値を取得することができます。
 このイベントを利用することで、自動インクリメント列の値をリレーションキーに設定している場合、連結する子 DataTable の値を自動設定することができます。
 【非接続型のリレーション関係にある DataTable を更新する場合】
 非接続型のリレーション関係にある DataTable に新規にレコードを追加する場合、「リレーション関係にあるDataTableによるデータベース更新する場合の注意点」 を参考にして、新規生成時に、仮のユニークな番号を設定し、リレーションを確立する必要があります。 この時、設定した仮番号は、下記のイベントを利用した更新時に、データベースが自動的に生成した値で、親子の値を置換えられます。。
【使い方】

 OleDbDataAdapte の RowUpdated イベントを利用して、自動インクリメント列の値を取得します。

  //データ登録時
  //cn
 //myOleDbAd         Access 更新用 DataAdapter
  //myIncKeyName     自動インクリメント列名
  //myCmdGetIdentity  自動インクリメント値取得 OleDbCommand



  // 自動インクリメント値を取得するコマンドを生成します。
  myCmdGetIdentity = CreateGetIdentityCommand( cn );

  // トランザクションが設定されている場合、コマンドに設定します。
  myCmdGetIdentity.Transaction = tr;

  // 新たに生成されたレコードの自動インクリメント値を取得するイベントを設定します。
  myOleDbAd.RowUpdated += new OleDbRowUpdatedEventHandler(HandleRowUpdated);


  <必要な追加更新ロジック>



        
/// <summary>
/// 新たに生成されたレコードの自動インクリメント値を取得するイベント
/// </summary>
/// <param name="sender">イベントのソース</param>
/// <param name="e">イベントデータ</param>
private void HandleRowUpdated(object sender, OleDbRowUpdatedEventArgs e)
{
    //Debug.WriteLine("HandleRowUpdated Start ");

    //正常に追加された場合、列の自動インクリメント値を取得します。
    if ((e.Status == UpdateStatus.Continue) && 
        (e.StatementType == StatementType.Insert)) 
    {
        e.Row[myIncKeyName] = (int) myCmdGetIdentity.ExecuteScalar();
        e.Row.AcceptChanges();
    }
}

/// <summary>
/// 自動インクリメント値を取得するコマンドを生成します。
/// </summary>
/// <returns>生成したコマンド</returns>
private OleDbCommand CreateGetIdentityCommand( OleDbConnection cn )
{
    return new OleDbCommand("SELECT @@IDENTITY", cn);
}
【参考】
HOW TO: Visual Basic .NET を使って、 Access データベースにレコードを挿入するうちに、 ID 値を取得します。
戻る