locked
Office2013 環境における ODBC登録(SQLConfigDataSource の動作)について RRS feed

  • 質問

  • お世話になります、yanazakiと申します。

    下記のExcel_VBAプログラムを使用して、Access(mdb)のODBCの設定を
    行っています。

    この度、Officeのバージョンアップ 2007 -> 2013 を実施したところ、
    以下の現象となり、難儀しております。

      ・ODBC 画面で確認しても、登録されていない。
      ・SQLConfigDataSource としては正常復帰する。
       「データソースが登録されました。」のメッセージが出力

    SQLConfigDataSource で、ODBC設定を登録する際、
    Office (Excel)2013移行時の注意点等はございますでしょうか。

    お心当たりのある方、ご教授をお願い致します。


    【環境・補足】
     □ OS : WindowsServer2008R2
     □ Office : 2013 Professional 32bit

     □ 32bit のODBCに登録するため、
        C:\Windows\SysWOW64\odbcad32.exe で確認

      □ WindowsServer2008R2 + Office2007 の組合わせは正常登録
      □ 本環境はオフライン(インターネットとは未接続)

    ---
    【実行プログラム抜粋】

    strParam = ""
        strParam = "DSN=XXX" & vbNullChar
        strParam = strParam & "Description=YYY" & vbNullChar
        strParam = strParam & "DBQ=" & strPath & "ZZZ.mdb" & vbNullChar
        
        ' データソースの登録
        intRet = SQLConfigDataSource(0&, ODBC_ADD_SYS_DSN, strDriver, strParam)
        ' 登録の成功・失敗の判断
        If intRet = 0 Then
            GoTo ERRMSG
        End If


    ERRMSG:
        
        ' 登録の成功・失敗の判断
        If intRet Then
            MsgBox "データソースが登録されました。"
        Else
            MsgBox "登録されませんでした。"
        End If
        
    End Sub


    以上

    2014年8月20日 8:44

回答

  • 質問者の柳崎です。

    Officeバージョンにより、現象の発生有無が確認できます。

     ・Office Pro 2013 (以降2013) :発生する

     ・Office Pro 2013 Pro (以降2013Pro) :発生しない。

    【原因】

    2013は、これまでのDVD提供からダウンロード提供となり、

    Click-to-Runというインストール形態になります。

    これは、App-Vという「仮想」テクノロジに基づいた実装です。

    つまり、ローカルマシンの「システム」のレジストリに登録しようとしてもできません。

    仮想化されたシステムのレジストリ、即ち以下に登録されてしまいます。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\ClickToRun\REGISTRY\MACHINE

    【対応】

    Office(Excel)から直接APIを呼び出すのではなく、

    別のODBC登録アプリを作成し、Officeからはそれを外部実行するようにします。

    (同現象にお悩みの方:2013Proに変更する、という選択肢もあります。)

    藤森様

    今回は、サポートいただき、ありがとうございました。

    今後ともよろしくお願い致します。

    以上


    • 編集済み yanazaki 2014年9月4日 0:14
    • 回答としてマーク yanazaki 2014年9月4日 0:14
    2014年9月4日 0:13

すべての返信

  • 接続文字列の構文はセミコロンで区切るのでは?
    • 回答の候補に設定 佐伯玲 2014年8月22日 4:57
    • 回答の候補の設定解除 佐伯玲 2014年8月25日 1:31
    2014年8月21日 2:09
  • 藤森幸治様

    質問をしましたyanazakiです。ご返信をありがとうございます。

    大変恐縮ですが、もう少し詳しくご教授いただけませんでしょうか。

    strParamの文字列作成時に、&の部分を、セミコロンで置き換える、ということでしょうか。

    --

    ※現象としましては、関数の実行まで成功していて、ODBC画面で確認すると

     登録されていないようです。

    2014年8月23日 3:25
  • ConfigDSN Function を見る限り SQLConfigDataSource Function を使った場合の文字列の区切りは NULL で良いようですね。

    ただし文字列の最後は ダブルで NULL をつける必要があるようです。

    2014年8月25日 1:19
  • 藤森幸治様

    毎々、ご回答をありがとうございます。

    接続文字列を修正しましたが、状況は改善されませんでした。

     ・文字列の最後に NULL を2つ

     ・パラメータ間を ; (セミコロン)で区切る。

    --

    取り急ぎ結果のご報告となり恐縮でございますが、よろしくお願い致します。

    以上

    2014年8月25日 23:44
  • Office 2013 の問題かもしれませんね。

    Download Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント from Official Microsoft Download Center

    をインストール後、ソースは修正前の物で動作するか確認してみてください。

    2014年8月26日 1:01
  • 藤森様

    毎々お世話をかけます、質問者のyanazaki です。

    2013 環境において、Access2010 再頒布コンポーネントは、導入済です。。

     ・AccessDatabaseEngine.exe (32bit の方)

    -----------------------------

    当方の調査事項をご連絡いたします。

     ・Excel は、「管理者で実行」にて起動。 Administrator

     ・上記、および関連コンポーネントのバージョン

        - 再頒布コンポーネント   14.0.7015.1000

        - Microsoft Access Driver 6.01.7601.17514

    以上


    2014年8月26日 3:47
  • レジストリに正しく書き込まれているか確認、、、でしょうかね。

    64 ビット版の Windows で、ODBC アドミニストレーター ツールが 32 ビットと 64 ビット両方のユーザー DSN を表示する

    ちなみに *.accdb は
    Windows 8.1 x64 + Office 2013 x64
    Windows Server 2012 R2 + Office 2010 x86
    の組み合わせで問題なく登録出来ました。

    2014年8月26日 7:00
  • 藤森様

    毎々お手数をお掛けしております、質問者のyanazakiです。

    残念ながら、レジストリにも登録されておりませんでした。

     ※ いただきましたURLに記載の 「システムDSN」を確認

       余談ですが、手動でレジストリ登録してみましたが、ODBCアドミニストレーターツールには

       表示しませんでした。

    --

    なお、藤森様の環境で成功したとのこと。

    当方でも、2008R2 に対して、Office2007 (32bit)では成功していたことから、

    Office2013 (32bit版)が怪しいかもしれません。

    いろいろとありがとうございます。

    またご情報がありましたら、ご教授をお願い致します。

    2014年8月27日 4:54
  • レジストリに直接記述して表示されないのは、 ODBC Data Sources への記述が抜けているせいでは?
    そこだけ記述すればデーターソースに表示されるはずです。

    ちなみにテストしたコードは以下の通り。
    Private Declare PtrSafe Function SQLConfigDataSource Lib "ODBCCP32.DLL" _
        (ByValhwndParent As Long, _
        ByVal fRequest As Long, _
        ByVal lpszDriver As String, _
        ByVal lpszAttributes As String) As Long
    Private Const ODBC_ADD_SYS_DSN = 4
    Private Const ODBC_REMOVE_SYS_DSN = 6
    
    Dim R_REMOVE As Long
    Dim R_ADD As Long
    Dim lpszDriver As String
    Dim lpszAttributes As String
        
    lpszDriver = "Microsoft Access Driver (*.mdb, *.accdb)"
    lpszAttributes = "DSN=AAA" + vbNullChar & _
            "Description=YYY" + vbNullChar & _
            "DBQ=C:\\DB.accdb" + vbNullChar + vbNullChar
    R_REMOVE = SQLConfigDataSource(0, ODBC_REMOVE_SYS_DSN, lpszDriver, lpszAttributes)
    R_ADD = SQLConfigDataSource(0, ODBC_ADD_SYS_DSN, lpszDriver, lpszAttributes)
    

    2014年8月27日 5:46
  • 藤森様

    毎々サポートをありがとうございます。

    レジストリ ODBC Data Sources は確認させていただきます。

    なお、取り急ぎでございますが、以下のことが判明致しました。

     ■Office2013(本体) のバージョンで発生状況が異なる。

      ・15.0.4420.1017 : 登録される。 

      ・15.0.4433.1508 : 登録されない。 (新しい)

    --

    これから両者の差分を確認します。

    調査予告で申し訳ありませんが、まずは情報展開まで。

    よろしくお願い致します。

    2014年8月27日 23:45
  • 質問者の柳崎です。

    Officeバージョンにより、現象の発生有無が確認できます。

     ・Office Pro 2013 (以降2013) :発生する

     ・Office Pro 2013 Pro (以降2013Pro) :発生しない。

    【原因】

    2013は、これまでのDVD提供からダウンロード提供となり、

    Click-to-Runというインストール形態になります。

    これは、App-Vという「仮想」テクノロジに基づいた実装です。

    つまり、ローカルマシンの「システム」のレジストリに登録しようとしてもできません。

    仮想化されたシステムのレジストリ、即ち以下に登録されてしまいます。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\ClickToRun\REGISTRY\MACHINE

    【対応】

    Office(Excel)から直接APIを呼び出すのではなく、

    別のODBC登録アプリを作成し、Officeからはそれを外部実行するようにします。

    (同現象にお悩みの方:2013Proに変更する、という選択肢もあります。)

    藤森様

    今回は、サポートいただき、ありがとうございました。

    今後ともよろしくお願い致します。

    以上


    • 編集済み yanazaki 2014年9月4日 0:14
    • 回答としてマーク yanazaki 2014年9月4日 0:14
    2014年9月4日 0:13