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