PowerShell で ODBC 接続してみる

PowerShell から ODBC を利用して DB に接続し、任意の SQL を実行してみようと思う。

ODBC の設定は、「スタート」メニュー → 「コントロールパネル」 → 「管理ツール」 → 「ODBC データソース」より適宜設定しておくこと。

# ODBC 接続サンプル
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"
$DebugPreference = "Continue"

# ライブラリを読み込む
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data")

# 接続情報 : ODBC データソースの情報を設定する
$connectionString = "DSN=MYDSN;uid=MYUID;pwd=MYPASSWORD;"

# DB 接続
$odbcCon = New-Object System.Data.Odbc.OdbcConnection($connectionString)
$odbcCon.open()

# コマンドオブジェクトを生成する
$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon

# SQL : SELECT
$odbcCmd.CommandText = "SELECT * FROM my_table WHERE id = '1'"
$odbcReader = $odbcCmd.ExecuteReader()
while($odbcReader.Read()) {
  $odbcReader["id"].ToString() + " … " + $odbcReader["user_name"].ToString()
}
$odbcReader.Dispose()

# コマンドオブジェクトを破棄する
$odbcCmd.Dispose()

# DB 切断
$odbcCon.Close()
$odbcCon.Dispose()

こんな感じ。

上述のサンプルでは SELECT を実行したが、それ以外のクエリは以下のように実行できる。

# Create Table : 戻り値は 0 か -1
$odbcCmd.CommandText = "CREATE TABLE test ( id INT PRIMARY KEY, name VARCHAR(255) )"
$odbcCmd.ExecuteNonQuery() | Out-Null

# Insert
$odbcCmd.CommandText = "INSERT INTO test (id, name) VALUES (100, 'なまえ')"
$odbcCmd.ExecuteNonQuery() | Out-Null

# Update
$odbcCmd.CommandText = "UPDATE test SET name = 'おなまえ' WHERE id 100"
$odbcCmd.ExecuteNonQuery() | Out-Null

# Update 件数取得版
function Update-Test() {
  $odbcCmd.CommandText = "UPDATE test SET name = 'おなまえ' WHERE id 100"
  $count = $odbcCmd.ExecuteNonQuery()
  Write-Debug "Update 件数 : $count"
}
Update-Test  # 関数呼び出し

# Delete
$odbcCmd.CommandText = "DELETE test WHERE id = 100"
$odbcCmd.ExecuteNonQuery() | Out-Null

# Delete 件数取得版
function Delete-Test() {
  $odbcCmd.CommandText = "DELETE test WHERE id = 100"
  $count = $odbcCmd.ExecuteNonQuery()
  Write-Debug "Delete 件数 : $count"
}
Delete-Test  # 関数呼び出し

# Drop Table
$odbcCmd.CommandText = "DROP TABLE test"
$odbcCmd.ExecuteNonQuery() | Out-Null

基本は ExecuteNonQuery() で、結果を受け取る必要がなければ Out-Null にパイプすれば良い。


別のやり方。