スポンサーリンク

バッチで,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/q1415038544

Windowsの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を削除できることになっている。

ただ,手元の環境では動作しなかった。


ということで,削除は手動で。