1

occiを使用して、C++を介してOracleデータベースに対してSQLステートメントを実行することに関する問題に苦労しています。私のコードは次のとおりです。

#include <iostream>
#include "occi.h"

namespace oc = oracle::occi;

int main() {
    std::cout << "Setting up environment...\n";
    oc::Environment * env = oc::Environment::createEnvironment();

    std::cout << "Setting up connection...\n";
    oc::Connection * conn = env->createConnection("user","pass","server");

    std::cout << "Creating statement...\n";
    //Very simply query... 
    oc::Statement * stmt = conn->createStatement("SELECT '1' FROM dual");

    std::cout << "Executing query...\n";
    oc::ResultSet * rs = stmt->executeQuery();

    while(rs->next()) {
            std::cout << rs->getString(1) << std::endl; //Error is thrown at this line, but after printing since I can see '1' on the console.
    }


    stmt->closeResultSet(rs);
    conn->terminateStatement(stmt);
    env->terminateConnection(conn);
    oc::Environment::terminateEnvironment(env);

    return 0;
}

表示されるエラーは次のとおりです。

MyDatabaseApp.exeの0x1048ad7a(msvcp100d.dll)で未処理の例外:0xC0000005:アクセス違反の読み取り場所0xccccccd0。

私のプログラムは、次のコード行で「xstring」内で停止します。

    #if _ITERATOR_DEBUG_LEVEL == 0

    ....

    #else /* _ITERATOR_DEBUG_LEVEL == 0 */
    typedef typename _Alloc::template rebind<_Elem>::other _Alty;

    _String_val(_Alty _Al = _Alty())
            : _Alval(_Al)
            {   // construct allocator from _Al
            ....
            }

    ~_String_val()
            {   // destroy the object
            typename _Alloc::template rebind<_Container_proxy>::other
                    _Alproxy(_Alval);  

            this->_Orphan_all(); //<----------------------Code stops here

            _Dest_val(_Alproxy, this->_Myproxy);
            _Alproxy.deallocate(this->_Myproxy, 1);
            this->_Myproxy = 0;
            }
    #endif /* _ITERATOR_DEBUG_LEVEL == 0 */

クエリを次のように変更した場合:

oc::Statement * stmt = conn->createStatement("SELECT 1 FROM dual"); 

そして、ループステートメントは次のようになります。

std::cout << rs->getInt(1) << std::endl;

エラーなしで正常に動作します。これは、整数を取得するとプリミティブが返されるだけであるためだと思いますが、オブジェクトが返されると、オブジェクトが爆発します(デストラクタについては考えますが、理由はわかりません...)

私は今日何時間もこれで遊んでいます、そして私はかなり立ち往生しています。

私のシステムに関するいくつかの情報:

  • OS-Windows XP
  • Oracleバージョン-10g
  • IDE-Microsoft Visual Studio 2010 Express C ++

私のプロジェクトのプロパティは次のとおりです。

  • C / C++-一般-追加のインクルードディレクトリ=C:\ oracle \ product \ 10.2.0 \ client_1 \ oci \ include;%(AdditionalIncludeDirectories)
  • C / C ++-コード生成-マルチスレッドデバッグDLL(/ MDd)
  • リンカ-一般-追加のライブラリディレクトリ=C:\ oracle \ product \ 10.2.0 \ client_1 \ oci \ lib \ msvc \ vc8;%(AdditionalLibraryDirectories)
  • リンク-入力-追加の依存関係=oraocci10.lib;oraocci10d.lib;%(AdditionalDependencies)

あまり多くの情報と混同していないことを願っています...どんな助けや洞察も素晴らしいでしょう、よろしくお願いします!

編集ループを書き直して値をローカル変数に格納すると、ループの最後にエラーがスローされます。

while(rs->next()) {
    std::string s = rs->getString(1); //s is equal to "1" as expected
    std::cout << s << std::endl; //This is executed successfully
} //Error is thrown here
4

2 に答える 2

2

通常、このような問題は、エンドユーザーとプロバイダーのビルド環境(IDE)の違いに起因します。

これを確認してください。

関連する問題:

まず、正しいlibとdllを使用してみてください。デバッグモードでコンパイルする場合は、すべてのライブラリとdllをデバッグする必要があります。VC ++モジュールビューを使用して、適切なDLLがロードされていることを確認します。

私のアプリケーションでは、MSVC2010用にすべてのライブラリをコンパイルできて幸運でした。だから私はデバッグモードとリリースモードのDLLをチェックして、動作するアプリケーションを取得しました。

于 2013-07-02T11:40:23.497 に答える
2

約1か月前にこの問題を再検討したところ、MSVC2010occiライブラリがOracle11g用に構築されていることがわかりました。Oracle 10gを実行しているため、MSVC2005ライブラリを使用する必要がありました。そこで、古いIDEをインストールし、デバッグライブラリをロードしましたが、機能しました(何らかの理由で、リリースバージョンは機能しませんでした)。

編集

私と同じ問題を抱えている人にとって、適切なライブラリを使用してIDEをMSVC2010からMSVC2005にダウングレードできない場合は、harvySが提案するように、Oracleクライアントを10gから11gにアップグレードしてMSVC2010ライブラリを使用してみてください。振り返ってみると、これはおそらくより良い解決策だったでしょう。

于 2013-07-02T14:59:21.927 に答える