次のようにして、トランザクション管理ができました。
ポイントは、次です。
1.System.Data.Odbc.OdbcConnectionクラスのBeginTransactionメソッドでトランザクションを開始し、トランザクションオブジェクトを取得する。
2.上記1で取得したトランザクションオブジェクトのCommitメソッドでコミット。
3.上記1で取得したトランザクションオブジェクトのRollbackメソッドでロールバック。
OdbcCommand002.ps1
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"
$DebugPreference = "Continue"
# ライブラリ読み込み
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data")
######################################################################
### 関数定義
######################################################################
# トランザクション管理して、コミットするテスト。
function U-Test-Commit() {
# トランザクション開始
$odbcTran = $odbcCon.BeginTransaction()
$odbcCmd.Transaction = $odbcTran
Write-Debug "トランザクション開始"
# コマンド実行(INSERT)
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (100, 'りんご')"
$odbcCmd.ExecuteNonQuery() | Out-Null
# コミット
$odbcTran.Commit()
Write-Debug "コミット"
}
# トランザクション管理して、ロールバックするテスト。
function U-Test-Rollback() {
# トランザクション開始
$odbcTran = $odbcCon.BeginTransaction()
$odbcCmd.Transaction = $odbcTran
Write-Debug "トランザクション開始"
# コマンド実行(INSERT)
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (101, 'みかん?')"
$odbcCmd.ExecuteNonQuery() | Out-Null
# ロールバック
$odbcTran.Rollback()
Write-Debug "ロールバック"
}
######################################################################
### 処理実行
######################################################################
# DB接続
$connectionString = "DSN=H2TestDsn;uid=sa;pwd=sa;"
$odbcCon = New-Object System.Data.Odbc.OdbcConnection($connectionString)
$odbcCon.Open()
# コマンドオブジェクト作成
$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon
# コマンド実行(テーブル作成)
$odbcCmd.CommandText = "CREATE TABLE TEST (ID INT PRIMARY KEY, NAME VARCHAR(255))"
$odbcCmd.ExecuteNonQuery() | Out-Null
# テスト
U-Test-Commit
U-Test-Rollback
# コマンド実行(SELECT)
$odbcCmd.CommandText = "SELECT * FROM TEST ORDER BY ID"
$odbcReader = $odbcCmd.ExecuteReader()
while ($odbcReader.Read()) {
$odbcReader["ID"].ToString() + " " + $odbcReader["NAME"].ToString()
}
$odbcReader.Dispose()
# コマンド実行(テーブル削除)
$odbcCmd.CommandText = "DROP TABLE TEST"
$odbcCmd.ExecuteNonQuery() | Out-Null
# コマンドオブジェクト破棄
$odbcCmd.Dispose()
# DB切断
$odbcCon.Close()
$odbcCon.Dispose()