ピースペース

Master-DetailなデータをTableAdapterでMDBに一括Insertする

leave a comment »

久しぶりにACCESSを触った。
2013で新しいDB形式になったらしい。
が、その.accdbでテーブルのデザインが何やら不穏な動きをする(列定義の削除がうまくできないことがある)
mdb形式にすると直った? →あんまり使われていないのかな>ACCESS

CSVで提供されたデータをそのMDBのMaster/Detailなテーブルに一括インポートするプログラムが必要。
SQL Serverであれば、これはTableAdapterManager.UpdateAllで簡単に一発でトランザクション処理できる。
MDBの場合、レコードのInsert時にAutoIncrementなPkeyが自動更新されない!
ので、そのままではDetailレコードの挿入に失敗する。

MaterテーブルのAdapterのOnUpdatedにキー更新処理の追加が必要になるらしい。
DataSetのリレーションにカスケード更新を定義しておき、

void MasterAdapter_RowUpdated(object sender, System.Data.OleDb.OleDbRowUpdatedEventArgs e)
{
    if (e.Status == UpdateStatus.Continue && e.StatementType == StatementType.Insert)
    {
        var pk = e.Row.Table.PrimaryKey;
        pk[0].ReadOnly = false;

        OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY", e.Command.Connection, e.Command.Transaction);
        int id = (int)cmd.ExecuteScalar();
        e.Row[pk[0]] = id;
        e.Row.AcceptChanges();
    }
}

で、無事子レコードのInsertもうまくできた。
最後のAcceptChanges()は親レコードへの操作だが、これが無いと何故か子レコードはInsertされない。
という辺りが、ちょっと??でトリッキー

Written by nasu38yen

2014年7月4日 @ 11:26 AM

カテゴリー: 未分類

Tagged with

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。