kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

PowerShellからODBC接続してSQL実行してみました

Windows環境で、SQLクライアントソフトを使って、定型的なSQL文を実行することがあり、手間に感じていました。Windows環境で、コマンドラインから、手軽にSQL実行することができることを知りましたので、試してみました。

ポイントは、PowerShellから、.NET FrameworkODBCライブラリを使用することにあります。

まずは、ライブラリを読み込みます。

[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data")

次のようにしてDB接続出来ました。

$connectionString = "DSN=H2TestDsn;uid=sa;pwd=sa;"
$odbcCon = New-Object System.Data.Odbc.OdbcConnection($connectionString)
$odbcCon.Open()

DB切断は次のように行いました。

$odbcCon.Close()
$odbcCon.Dispose()

SQLを実行するためには、コマンドオブジェクトを作成します。

$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon

次のようにしてSQLを実行出来ました。

$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (100, 'りんご')"
$odbcCmd.ExecuteNonQuery() | Out-Null

SELECT文は次のように実行出来ました。

$odbcCmd.CommandText = "SELECT * FROM TEST ORDER BY ID"
$odbcReader = $odbcCmd.ExecuteReader()
while ($odbcReader.Read()) {
    $odbcReader["ID"].ToString() + " " + $odbcReader["NAME"].ToString()
}
$odbcReader.Dispose()

コマンドオブジェクトの破棄は次のように行いました。

$odbcCmd.Dispose()

動作確認したサンプルプログラム

動作確認したサンプルプログラムの全文は、次になります。

Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"
$DebugPreference = "Continue"

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

# 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

# コマンド実行(INSERT)
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (100, 'りんご')"
$odbcCmd.ExecuteNonQuery() | Out-Null
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (101, 'みかん?')"
$odbcCmd.ExecuteNonQuery() | Out-Null
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (102, 'すいか')"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンド実行(UPDATE)
$odbcCmd.CommandText = "UPDATE TEST SET NAME='みかん' WHERE ID=101"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンド実行(DELETE)
$odbcCmd.CommandText = "DELETE TEST WHERE ID=102"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンド実行(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()

参考