S-JIS[2025-08-07/2025-08-09]

ODBCドライバーDSNセットアップ実装メモ

ODBCドライバーのDSNセットアップの実装方法について。


概要

ODBCのデータソース(DSN)は、Windowsの場合、『ODBC データソース アドミニストレーター』というツールから追加・編集・削除できる。

実体としては、ConfigDSN関数(またはUnicode版のConfigDSNW関数)が呼ばれる。
つまり、ODBCドライバーの提供者は、この関数を実装しておく。

この関数が実装されたdllファイルは、Windowsレジストリー内のODBCドライバーの「Setup」サブキーに指定する。
通常は、ODBCドライバー本体のdllファイルの中にConfigDSN関数を実装しておき、Setupにはドライバー本体と同一のdllファイルを指定する。


WindowsでDSNを追加・編集する際は、DSN設定用のダイアログが表示されて、そこに設定値を入力する。
このダイアログもODBCドライバーが提供する必要がある。

ちなみに、DialogParamBox関数でダイアログを表示する場合、第1引数のハンドルには「ODBCドライバーのdllファイルのモジュールハンドル」を渡す必要がある。(GetModuleHandleEx関数で取得できる)
通常のexeファイルからDialogParamBox関数を呼ぶ場合はハンドルはNULLでも構わないのだが、
dllファイルはexeファイル本体とは別モジュールという扱いになっている模様。


Windowsレジストリーに設定を書き込むには、インストーラーDLL APIに用意されている関数を使用する。
ConfigDSN関数からこれらの関数を呼び出すことになる。

インストーラーDLL APIの関数は、Windowsの場合はodbccp32.dllに含まれている。
unixODBCの場合は(通常のODBC関数と同じく)libodbc.soに含まれているらしい。


ConfigDSN

ConfigDSN関数(またはUnicode版のConfigDSNW関数)は、DSNを追加・編集・削除するために呼ばれる関数。

引数名 無印関数の型 W関数の型 説明
hwndParent HWND HWND 『ODBC データソース アドミニストレーター』のウィンドウハンドル
request WORD WORD 追加・編集・削除を表す値
ODBC_ADD_DSN(1), ODBC_CONFIG_DSN(2), ODBC_REMOVE_DSN(3)
driver LPCSTR LPCWSTR ODBCドライバー名
attributes LPCSTR LPCWSTR 設定値が並んだ文字列

hwndParentは『ODBC データソース アドミニストレーター』のウィンドウハンドル。
『ODBC データソース アドミニストレーター』経由でなく、アプリケーションからConfigDSN関数が直接呼ばれる場合は、NULLになることもあるようだ。

attributesは、DSNに登録するデータ。
SQLDriverConnect()に渡される接続文字列と似ているが、形式は異なる。
接続文字列は「キー=;」が連なっているが、ConfigDSN()のattributesは「キー=\0」が並んでいて、さらに全体の終了を意味する「\0」が最後に付いている。

attributesは、DSN追加の場合は基本的に空。
編集や削除の場合は「DSN=データソース名」という値が渡ってくるので、そのDSNを対象にする。

DSNの追加・編集・削除をアプリケーションから行う場合は、アプリケーションはSQLConfigDataSource関数を呼ぶ。
SQLConfigDataSource関数が内部でConfigDSN関数を呼び出す。
この場合はattributesにその他の設定値も入ってくる可能性があり、その値を設定の初期値として使用する。


DSNの追加・編集の場合は、(hwndParentがNULL以外なら)ダイアログを表示して設定値をユーザーに入力させる。

ダイアログの各設定項目の初期値は以下のデータを元にする。

ダイアログからの入力が完了したら、ダイアログの入力値を元に、以下の手順でレジストリーに登録する。

  1. SQLWriteDSNToIni関数を呼んで、レジストリーの「ODBC.INI/ODBC Data Sources」の中にDSN定義を書き込む。
  2. 設定値毎にSQLWritePrivateProfileString関数を呼んで、レジストリーの「ODBC.INI/データソース名」の中に設定値を書き込む。
  3. データソース名が変更された場合は、古いデータソース定義を削除する。(SQLRemoveDSNFromIni関数を呼ぶ)

DSNの削除の場合は、SQLRemoveDSNFromIni関数を呼んで、データソース定義を削除する。

(削除だけなら『ODBC データソース アドミニストレーター』が勝手にやってくれてもいい気はするが、ConfigDSN関数内に自分で実装する必要がある)


SQLWriteDSNToIni

SQLWriteDSNToIni関数(またはUnicode版のSQLWriteDSNToIniW関数)は、データソースの基本情報をレジストリーに書き込む関数。

この関数は以下の書き込みを行う。

データソース名が不正な文字を使っていたり長すぎたりする場合はエラーになる。
エラーになった場合、自分でエラーメッセージ用のダイアログを出さなくても、そのままConfigDSN関数を終われば、『ODBC データソース アドミニストレーター』の方でエラーメッセージのダイアログを出してくれる。


レジストリーにはユーザーDSNとシステムDSNがあるが、どちらを対象とするのかはSQLWriteDSNToIni関数内部で勝手に判別してくれるので、SQLWriteDSNToIni関数を呼び出す側は気にする必要は無い。

SQLWritePrivateProfileString関数SQLRemoveDSNFromIni関数も同様。


SQLWritePrivateProfileString

SQLWritePrivateProfileString関数(またはUnicode版のSQLWritePrivateProfileStringW関数)は、 レジストリーに設定値を書き込む関数。

引数の意味はSQLGetPrivateProfileString関数と同様。 (読み書きが逆なだけなので)


SQLRemoveDSNFromIni

SQLRemoveDSNFromIni関数(またはUnicode版のSQLRemoveDSNFromIniW関数)は、データソースの情報を削除する関数。

該当DSNのデータ(SQLWriteDSNToIni関数SQLWritePrivateProfileString関数で書き込んだデータ)がレジストリーから全て削除される。


ODBCドライバーへ戻る / ODBCへ戻る / 技術メモへ戻る
メールの送信先:ひしだま