PowerShellからODBC接続してSQL実行してみました
Windows環境で、SQLクライアントソフトを使って、定型的なSQL文を実行することがあり、手間に感じていました。Windows環境で、コマンドラインから、手軽にSQL実行することができることを知りましたので、試してみました。
ポイントは、PowerShellから、.NET FrameworkのODBCライブラリを使用することにあります。
まずは、ライブラリを読み込みます。
[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()
参考
- PowerShell から MySQL を操作する - 64 Blog
- PowerShell – ODBC を使用して Access データを読み込む | ITLAB51.COM
- FILE] ODBC、OLEDB、ADO、RDS での接続文字列の使用方法を説明するための MDACCON.EXE ファイル
- 接続文字列一覧 - ふなWiki