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
にパイプすれば良い。
別のやり方。