none
VC++で作成したアプリを64bitOSで実行すると、SQL Server 2008 express R2に接続できない RRS feed

  • 質問

  • VC++で作成した下記ソースのアプリを64bitOS(Windows2008)で実行すると、SQL Server 2008 Express R2に接続できません。(SQLConnectがエラーになります)

    接続先がSQL Server 2008 Standardだと接続が成功します。またExpressでも、アプリを実行するOSが32bitだと接続が成功します。

    ODBCの接続テストは、OSが64bitでも、ExpressとStandard共に成功しています。

    Express エディションは、64bitで実行したアプリでExpressエディションに接続できないのでしょうか。

    <VC++のソース抜粋>

      CString strErr;
      SQLRETURN nRet = SQL_SUCCESS;

      nRet = SQLAllocEnv( &m_hEnv );
      if( SQL_SUCCESS != nRet )
      {
       strErr.Format( _T("Unknown Error! File =%s, Line = %d"), CString( __FILE__ ), __LINE__ );
       throw strErr;
      }
      m_bFreeEnv = true;

      nRet = SQLAllocConnect( m_hEnv, &m_hDbc );
      if( SQL_SUCCESS != nRet )
      {
       strErr.Format( _T("Unknown Error! File =%s, Line = %d"), CString( __FILE__ ), __LINE__ );
       throw strErr;
      }
      m_bFreeCon = true;

      CString strDSN  = _T("TLPDB");
      CString strUID  = _T("sa");
      CString strAuth = _T("password");
      nRet = SQLConnect( m_hDbc, strDSN.AllocSysString(), static_cast<SQLSMALLINT>( strDSN.GetLength() ),
               strUID.AllocSysString(), static_cast<SQLSMALLINT>( strUID.GetLength() ),
               strAuth.AllocSysString(), static_cast<SQLSMALLINT>( strAuth.GetLength() ) );
      if( SQL_SUCCESS           != nRet &&
       SQL_SUCCESS_WITH_INFO != nRet )
      {
       strErr.Format( _T("Unknown Error! File =%s, Line = %d"), CString( __FILE__ ), __LINE__ );
       throw strErr;
      }
      m_bDisconnect = true;
     }

    2011年4月8日 0:36

回答

  • SQLAllocConnect 等を使用されているということは、ODBC を使用されていますね?

    VC++ で作成されたアプリケーションのターゲットは、x86/x64 どちらでビルドされていますか? AMD64 版の Windows では、ODBC の接続設定が 32bit と 64bit の2つあります。VC++ で作成されたアプリケーションが 32bit をビルドされている場合は 32bit 用の設定(WOW64のODBC設定)を行っておく必要があります。

    この点は大丈夫ですか?

     

    • 回答としてマーク 山本春海 2011年4月22日 5:20
    2011年4月8日 1:48

すべての返信

  • SQLAllocConnect 等を使用されているということは、ODBC を使用されていますね?

    VC++ で作成されたアプリケーションのターゲットは、x86/x64 どちらでビルドされていますか? AMD64 版の Windows では、ODBC の接続設定が 32bit と 64bit の2つあります。VC++ で作成されたアプリケーションが 32bit をビルドされている場合は 32bit 用の設定(WOW64のODBC設定)を行っておく必要があります。

    この点は大丈夫ですか?

     

    • 回答としてマーク 山本春海 2011年4月22日 5:20
    2011年4月8日 1:48
  • K.Takaoka様、返信ありがとうございます。

    アプリケーションはx86でビルドしています。

    32bit 用の設定(WOW64のODBC設定)方法の知識が無いので、現在調べながらやっております。

     ⇒この設定は、接続先がExpressエディションの場合に必要になる認識でよろしいでしょうか。(Standard版では現在の設定でも SQLConnectが成功します。)

     

    ※設定前は、Expressエディションに接続した時の、SQLConnectのエラーが下記の状況となります。

      【ODBCのユーザーDNSに作成した場合】

       [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server が存在しないか、アクセスが拒否されました

      【ODBCのシステムDNSに作成した場合】

       [Microsoft][ODBC Driver Manager] 指定された DSN には、ドライバーとアプリケーションとのアーキテクチャの不一致が含まれています

     

    2011年4月8日 6:39
  • K.Takaoka様、ありがとうございます。

    32bit 用の設定(WOW64のODBC設定)方法の知識が無いので、現在調べながらやっております。

     ⇒C:\Windows\SysWOW64\odbcad32.exeを直接起動してODBCの設定を行ったところ無事に接続できるようになりました。

      本当にありがとうございました。

      ※しかし、Standard版で接続可能で、Express版では接続出来なかった理由が不明のままです。

    2011年4月8日 6:48