none
[VS2005] DLL上でCDatabaseによりODBCアクセスすると例外が発生。 RRS feed

  • 質問


  • VS2005(VC++)環境にて、CDatabaseでODBCアクセスするDLLを作成した所、
    下記の箇所にて例外が発生します。
    何か情報をお持ちの方がいらっしゃいましたら、コメントをお願い致します。

      ソース :dbcore.cpp
      メソッド:void CDatabase::AllocConnect(DWORD dwOptions)
      行   :690行目
           ↓
    AFX_SQL_SYNC(::SQLSetConnectOption(m_hdbc, SQL_LOGIN_TIMEOUT,
    m_dwLoginTimeout));
    #ifdef _DEBUG
    if (nRetCode != SQL_SUCCESS && nRetCode != SQL_SUCCESS_WITH_INFO)
    TRACE(traceDatabase, 0, _T("Warning: Failure setting login timeout.\n"));
    #endif

    例外とは言いましても、デバッガ上、

      『XXXの 0x7c809eb2 で初回の例外が発生しました: 0xC0000005: 場所 0x0000000a を読み込み中にアクセス違反が発生しました。』

    …と出力されるのみで、nRetCode にはSQL_SUCCESSが設定されており、
    意図するデータはDBより取得出来ています。
    (=処理上、問題なく動いているように見える)

    しかしこのまま見過ごすのは気持ち悪い為、原因を探っていたのですが
    現状解決出来ずにいます。

      環境:
        OS:WindowsXP Pro
        DB:MySQL 5.0
        開発:VS2005(VC++)

    以下のコードにてDBアクセスしています。
    (下記をDLL内クラスのメンバとして実装。
     Exe(GUI)起動完了後、ボタン押下によりメソッドをコールしています。)

    // データソース接続
    int CConnectDB::Connect()
    {
    // 既に接続済みの場合はリターン
    if ( m_tDB.IsOpen())
    {
    return TRUE;
    }

    // データソースオープン
    try
    {
    if ( ! m_tDB.OpenEx( m_csStrCon, CDatabase::noOdbcDialog )) ←★
    {
    return FALSE;
    }
    }
    catch( CDBException *e )
    {
    e->Delete();
    return FALSE;
    }

    return TRUE;
    }

     ★:この中で例外が発生するが、catchに入る事なく正常終了する。
       以後、DBアクセスは問題なく出来る。

    2006年11月14日 11:57

すべての返信

  • 自己レスです。

    私のメインPCでのみ上記現象が発生し、その他PCでは全く問題ありませんでした。
    メインPCのVC++環境を再構築(OSごと再インストール)した所、
    例外は発生しなくなりました。

    という事で、解決とさせて頂きます。

    また、上記内容を別サイトにマルチポストさせて頂いております。
     http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200611/06110030.txt

    お騒がせ致しました。
    2006年11月17日 7:13