あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、取り上げたりしています。

PowerShell, Access データベースに ADO.NET のトランザクションを使用してデータ追加する

PowerShell を使って Access のデータベースにアクセスするには、実行環境や接続文字列に注意点があります。この点の詳しい内容は以下の記事を参照してください。

.NET Framework の ADO.NET で、Access データベースにトランザクションを使用してテーブルにデータを追加するサンプルを提示します。ADO.NET なので、SQL Server でも同様に動作すると思います。

当然、SQL の可変項目には名前付きパラメータを使用します。名前付きパラメータはパラメータクエリやプリペアードステートメントとも呼ばれますね。

詳細はコメントを付けてあるので分かると思いますが、スクリプトと同じディレクトリにある Access のデータベースファイル (test.mdb or test.accdb) にアクセスし、以下のテーブルをトランザクションを使用してデータ追加します。

  • テーブル名:tblUsers
  • フィールド情報
    • USER_ID (varchar (255))
    • USER_NAME (varchar (255))

トランザクションを使用している以外は特段説明することはありません。

サンプルスクリプトは以下のようになります。

#
#  PowerShell から ADO.NET でトランザクションを使用してデータ追加する
#

# スクリプトのカレントディレクトリを取得
$path = Split-Path $MyInvocation.MyCommand.Path -Parent

# スクリプトのカレントディレクトリのデータベースパスを作成
$path = Join-Path $path "test.mdb" # test.accdb も可


# 拡張子によって接続文字列を切り替える

# MDB 形式の場合
if (([System.IO.Path]::GetExtension($path)) -eq ".mdb") {
  $connectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = $path"

# ACCDB 形式の場合
} elseif(([System.IO.Path]::GetExtension($path)) -eq ".accdb") {
  $connectionString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = $path"

# 上記以外は例外をスロー
} else {
  throw New-Object System.Exception("Access 拡張子エラー")
}

# データベース接続を宣言
$con = New-Object -TypeName System.Data.OleDb.OleDbConnection $connectionString

try {
  # 接続をオープン
  $con.Open()

  # トランザクションを開始する
  $transaction = $con.BeginTransaction()

  # 名前付きパラメータの SQL を宣言する
  $sql = "INSERT INTO tblUsers (USER_ID, USER_NAME) VALUES (@USER_ID, @USER_NAME)"

  # コマンドオブジェクトを宣言
  $command = New-Object -TypeName System.Data.OleDb.OleDbCommand
  $command.Connection = $con
  $command.Transaction = $transaction
  $command.CommandText = $sql
  
  # 名前付きパラメータに値をセット  
  [void]$command.Parameters.AddWithValue("@USER_ID", "005") 
  [void]$command.Parameters.AddWithValue("@USER_NAME", "田中太郎")

  # SQL を実行する
  [void]$command.ExecuteNonQuery()
  
  # コミットしてトランザクションを終了する
  $transaction.Commit()

} catch {  
  # エラー内容を出力する
  Write-Host $Error[0].Exception.Message

  # ロールバックしてトランザクションを終了する
  $transaction.Rollback()    

} finally {
  # 接続を閉じる
  $con.Close()
}