S-JIS[2025-08-07/2025-08-09]
|
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関数(または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以外なら)ダイアログを表示して設定値をユーザーに入力させる。
ダイアログの各設定項目の初期値は以下のデータを元にする。
ダイアログからの入力が完了したら、ダイアログの入力値を元に、以下の手順でレジストリーに登録する。
ODBC.INI/ODBC Data Sources
」の中にDSN定義を書き込む。ODBC.INI/データソース名
」の中に設定値を書き込む。DSNの削除の場合は、SQLRemoveDSNFromIni関数を呼んで、データソース定義を削除する。
(削除だけなら『ODBC データソース アドミニストレーター』が勝手にやってくれてもいい気はするが、ConfigDSN関数内に自分で実装する必要がある)
SQLWriteDSNToIni関数(またはUnicode版のSQLWriteDSNToIniW関数)は、データソースの基本情報をレジストリーに書き込む関数。
この関数は以下の書き込みを行う。
ODBC.INI/ODBC Data Sources
」の中に、データソース名をキーとしてODBCドライバーの名前を登録する。ODBC.INI/データソース名
」の中の「Driver」にdllファイルのパスを登録する。データソース名が不正な文字を使っていたり長すぎたりする場合はエラーになる。
エラーになった場合、自分でエラーメッセージ用のダイアログを出さなくても、そのままConfigDSN関数を終われば、『ODBC データソース
アドミニストレーター』の方でエラーメッセージのダイアログを出してくれる。
レジストリーにはユーザーDSNとシステムDSNがあるが、どちらを対象とするのかはSQLWriteDSNToIni関数内部で勝手に判別してくれるので、SQLWriteDSNToIni関数を呼び出す側は気にする必要は無い。
SQLWritePrivateProfileString関数やSQLRemoveDSNFromIni関数も同様。
SQLWritePrivateProfileString関数(またはUnicode版のSQLWritePrivateProfileStringW関数)は、 レジストリーに設定値を書き込む関数。
引数の意味はSQLGetPrivateProfileString関数と同様。 (読み書きが逆なだけなので)
SQLRemoveDSNFromIni関数(またはUnicode版のSQLRemoveDSNFromIniW関数)は、データソースの情報を削除する関数。
該当DSNのデータ(SQLWriteDSNToIni関数やSQLWritePrivateProfileString関数で書き込んだデータ)がレジストリーから全て削除される。