バッチで,ODBC接続の設定を追加・更新・表示しよう(odbcconf.exeの使い方:PostgreSQLでの使用例)
コマンドプロンプトのバッチから,ODBC設定を
- 新規作成
- 更新
- 一覧表示
する方法。
接続先のDBMSの例としては,PostgreSQLの場合を取り上げる。
GUIだと,DSNを追加するためには
- コントロールパネル→管理ツール→データソース(ODBC)
のダイアログを操作する必要があり,面倒。
これをCUIで自動化すれば,一括設定もできて便利。
また,応用として,
- DB接続の前に,接続に必要なDSNも自動で作ってしまう
というサンプルコード(JScript)を掲載。
システムDSNの追加・更新
- データソース名:hoge_dsn
- データベース名:hoge_db
- 接続先サーバ:192.168.0.hoge
- 接続先サーバのポート番号:5432
- DB認証情報:hoge_user/hoge_pass
の場合,DOS窓上で
odbcconf /A {CONFIGSYSDSN "PostgreSQL Unicode" "DSN=hoge_dsn|DATABASE=hoge_db|SERVER=192.168.0.hoge|PORT=5432|UID=hoge_user|PWD=hoge_pass"}
とする。
- /A は,アクションを実行するという意味。
- CONFIGSYSDSN は,システムDSNの設定情報を操作するという意味。新規DS/既存DSの別を問わない。
- その次に,ODBCドライバ名を指定。
- その次に,データソースの属性情報を「|」区切りで指定。
DSN=〜に現在存在しないデータソース名を指定すると,DSN設定情報の新規作成になる。
DSN=〜に既存のデータソース名を指定すると,DSN設定情報の上書きになる。
DBのバージョンなどをもう少し詳しく指定することもできる。
odbcconf /A {CONFIGSYSDSN "PostgreSQL Unicode" "DSN=hoge_dsn|DATABASE=hoge_db|SERVER=192.168.0.hoge|PORT=5432|UID=hoge_user|PWD=hoge_pass|SSLmode=disable|ReadOnly=0|Protocol=8.2;"}
実行結果をログに出力することもできる。
odbcconf /Ld hoge_log.txt /A {CONFIGSYSDSN "PostgreSQL Unicode" "DSN=hoge_dsn|DATABASE=hoge_db|SERVER=192.168.0.hoge|PORT=5432|UID=hoge_user|PWD=hoge_pass"}
odbcconfの使い方の説明はヘルプダイアログに少し載っている。
odbcconf /?
ODBCデータソース - システムDSN にドライバSQL Serverをバッチ(スクリプト)で登録する
http://slashdot.jp/~patagon/journal/399075
ODBCデータソースの一覧表示・確認方法
ODBC関連のレジストリの登録値を見ればよい。
そのためのコマンド:
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources"
ODBCのシステムDSN の一覧を抽出することはできませんか?
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1415038544WindowsのODBCの設定内容は下記レジストリにあるので,それをエクスポートすればよい
- HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI
- HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources
コマンドラインからプロセスを起動・終了する方法 (環境変数とレジストリについて)
http://d.hatena.ne.jp/language_and_engineering/20081028/1225160338
- レジストリの内容は reg query で読める
あるいは,設定ファイルを閲覧する。
type C:\windows\odbc.ini
プログラムからODBCデータソースの一覧を取得したい
http://oshiete.goo.ne.jp/qa/2481134.htmlシステムDSNはWINDOWSフォルダのODBC.INIを見ればよい
応用:WSHバッチに組みこむ
「DSN作成」が自動化できるので,「プログラム中でのDB接続の前提条件」を1つ減らすことができる。
下記のWSHのサンプルコードのように,
- 専用のDSNを作成してから
- そのDSNを利用してDB接続
という流れのコードが可能。
show_table.js
// ---------- ODBCのシステムDSNを作成する ---------- // 設定情報 var dsn = "hoge_dsn"; var db_name = "hoge_db"; var server_name = "192.168.0.hoge"; var db_username = "hoge_user"; var db_password = "hoge_pass"; // odbcconfのコマンド文字列 var odbcconf_command = 'odbcconf /A {CONFIGSYSDSN "PostgreSQL Unicode" "DSN=' + dsn + '|DATABASE=' + db_name + '|SERVER=' + server_name + '|PORT=5432|UID=' + db_username + '|PWD=' + db_password '"}' ; // odbcconfを呼び出してDSN作成実行(同名のDSNが既にある場合は上書き) var ws = WScript.CreateObject("WScript.Shell"); ws.Exec( odbcconf_command ); WScript.Sleep( 1000 ); // ---------- DBに接続する ---------- // 上記で作成したDSNを利用して接続 var connection_string = "ODBC" + ";Driver={PostgreSQL Unicode}" + ";DSN=" + dsn + ";DATABASE=" + db_name + ";UID=" + db_username + ";PWD=" + db_password + ";" ; var con = WScript.CreateObject("ADODB.Connection"); con.Open( connection_string ); // SQL実行 var record_set = con.Exucute( "SELECT * FROM hoge_table;" ); // 取得したレコードを全行読み出し while( ! record_set.EOF ) { // 特定のカラムの値を表示 var column_value = record_set( "hoge_column" ).Value; WScript.Echo( column_value ); // 次の行へ record_set.MoveNext(); } // 後処理 con.Close();
PostgreSQLのバッチを,パスワードを聞かれずに実行する方法 (psqlも設定ファイル編集も不要)
http://d.hatena.ne.jp/language_and_engineering/20090513/p1
ADO で SELECT 文の結果を取得する
http://jeanne.wankuma.com/tips/vb6/sqlserver/executereader.html
実行環境付きのSQL例文集 (ExcelのドキュメントからDBにアクセス)
http://d.hatena.ne.jp/language_and_engineering/20090127/1233067389
補足:DSNの自動削除について
データソースの削除は,一応,下記にソースコードが載っている。
ODBCの自動登録について
http://questionbox.jp.msn.com/qa108207.html
ODBCCP32.DLL の SQLConfigDataSource 関数を呼び出し,引数に ODBC_REMOVE_DSN を渡せば,DSNを削除できることになっている。
ただ,手元の環境では動作しなかった。
ということで,削除は手動で。