- ベストアンサー
ODBCのデータソース登録内容の確認
VB6上で、ODBCのデータソースの自動登録を行おうと思っています。 その際、実際の登録処理を行う前に、 既にデータソースへ登録されているかどうかを チェックしたいのですが、どのようにすればいいのでしょうか? (チェックしたいのはシステムDSNの内容です・・・)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
多少ODBCを勉強しなおしましたので、報告いたします。 O S:WIN2KServer SP2 TOOL:VB6SP5 での検証報告です。 Cのヘッダファイル C:\Profram Files\Microsoft Visual Studio\Vc98\Inculude\ODBCINST.H に // SQLConfigDataSource request flags #define ODBC_ADD_DSN 1 // Add data source #define ODBC_CONFIG_DSN 2 // Configure (edit) data source #define ODBC_REMOVE_DSN 3 // Remove data source #if (ODBCVER >= 0x0250) #define ODBC_ADD_SYS_DSN 4 // add a system DSN #define ODBC_CONFIG_SYS_DSN 5 // Configure a system DSN #define ODBC_REMOVE_SYS_DSN 6 // remove a system DSN #if (ODBCVER >= 0x0300) #define ODBC_REMOVE_DEFAULT_DSN 7 // remove the default DSN #endif /* ODBCVER >= 0x0300 */ という宣言がありました。 SQLConfigDataSource関数に与える定数を変更することで、システムDSNへの登録が可能なようです。(未検証) さらにユーザDSNの情報は HKEY_CURRENT_USER\Software\ODBC\ODBC.INI システムDSNの情報は HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI 内部に設定されるようです。 システムDSNの情報はレジストリを読み取ることによって可能だと思います。 参考URLは二つあります。 http://www.galliver.co.jp/writing/msdn/msdn01/index.html(かなり下の方) http://www.vbvbvb.com/jp/gtips/index0251.html(レジストリ操作)
その他の回答 (1)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
>ODBCのデータソース登録内容の確認 これは無理かも? おそらくどこかのファイルに情報が書き込まれているのだと思いますが、わかりません。。。 しかし、エラー回避(On Error ・・・)を実行後に削除、そして追加を行ったら、すでにあろうと無かろうと関係なく、登録ができると思います。 参考URLにSQLとAccessへのODBCの登録方法を載せてあります。そちらを参考にしてみてください。 もしOracleなら、ちょっと改造するだけで登録できます。 ぼくはODBC接続をたまにしますが、データソースを使用しないでODBC接続を行っています。 必要であれば、そちらも公開しますよ。 (ODBCで接続するDBの種類も書くようにしてくださいね。)
お礼
早速の回答ありがとうございます。 ・・・実は、そのソース、過去ログからちょっと参考にさせていただいてたりします^^; 登録の作業そのものに関しては、TAGOSAKU7さんが公開しているそのソースでいけるということが確認できました。 登録をする前に、既に登録されていないかどうかをチェックして、登録されていない場合のみ処理を行いたかったのですが、どうも無理っぽいですね・・・。 でも、既にあっても無くても登録作業自体はできるようですね。
補足
DBの種類はAccess(95です)を使っています。 作業でAccessしか使っていなくてSQL-ServerとかOracleの存在を忘れてました。すみません。。。 他に、ご存知の方、いらっしゃいましたらまだ締め切らないでおこうと思いますので回答をお願い致します・・・。
お礼
詳しい調査結果の掲載、ありがとうございます。 システムDSNへの登録は、先週末に私も少し検証をしました。 どうやら「ODBC_ADD_SYS_DSN(=4)」で可能なようです。 ちなみに、削除についても「ODBC_REMOVE_SYS_DSN(=6)」でできました。 レジストリの話のところまでは私もまだ未確認ですので こちらでも、参考URL等を元にもう少し調査してみることにします。
補足
参考URLの2つ目をもとに、検証してみました。 システムDSNの情報、レジストリを問い合わせモードでオープンすることによって、存在の可否を確認することができました。 'レジストリOPEN関数 Declare Function RegOpenKeyEx Lib "advapi32.dll" _ Alias "RegOpenKeyExA" _ (ByVal hkey As Long, _ ByVal lpSubKey As String, _ ByVal ulOptions As Long, _ ByVal samDesired As Long, _ phkResult As Long) As Long ' レジストリの主キーの定義済みハンドルを示す定数の宣言 Public Const HKEY_LOCAL_MACHINE = &H80000002 ' セキュリティのアクセスマスクを示す定数の宣言 Public Const KEY_QUERY_VALUE = &H1 ------------------------------------------ RegOpenKeyEx(HKEY_LOCAL_MACHINE, _ 《レジストリのキー名》, _ 0, _ KEY_QUERY_VALUE, _ lngRegSubKeyHandle) (この関数の戻り値を見ることによって判断します・・・) これでシステムDSNに登録されていない時のみ 確認することができそうです。