LoginSignup
7
7

More than 5 years have passed since last update.

PowerShellでODBC接続してトランザクション管理してみた

Posted at

次のようにして、トランザクション管理ができました。

ポイントは、次です。
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()
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7