occi를 사용하여 C++를 통해 SQL 문을 Oracle 데이터베이스로 실행하는 것과 관련된 문제로 고민하고 있습니다.간단한 Oracle 쿼리 문자열 표시시 "액세스 위반"오류가 발생했습니다 (VS10 Exp C++)
#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;
}
는 IS 표시됩니다 오류 :
처리되지 않은 예외를 0x1048ad7a (msvcp100d.dll)에서 MyDatabaseApp.exe에서 다음과 같이 내 코드는가 0xc0000005 : 위치 0xccccccd0 읽기 액세스 위반.
내 프로그램 코드의 다음 줄에 'xstring'내부 정지 :
oc::Statement * stmt = conn->createStatement("SELECT 1 FROM dual");
및 루프 문 :
내가 내 쿼리를 변경하는 경우#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 */
std::cout << rs->getInt(1) << std::endl;
오류없이 정상적으로 작동합니다. 나는 이것이 정수를 얻는 것이 단순히 원시적을 반환하기 때문에 발생한다고 생각하지만 객체가 반환 될 때 (소멸자에 대해 생각한다. 그러나 이유는 확실하지 않다.)
내가 놀아왔다. 오늘 몇 시간 동안 이것으로 주위에, 나는 꽤 붙어있다.
내 시스템에 대한 일부 정보 :
- OS - 윈도우 XP
- Oracle 버전 - 10g의
- IDE - 마이크로 소프트 비주얼 스튜디오 2010 익스프레스 C++
내 프로젝트 속성은 다음과 같습니다 :
- C/C++ - 일반 - 추가가 디렉토리 = C를 포함 : \ 오라클 \ 10.2.0 \ 제품 \ client_1 \ OCI \ 포함, % (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
로컬 문자열 변수에 rs-> getString (1)을 할당하여 디버거에서 검사하면 어떨까요? 그게 뭘 보여? – OldProgrammer
@LeorA 저의 첫 번째 생각이었습니다. 그래서 내가 지역 변수를 만들고 'rs-> getString (1)'에 값을 할당하면 값이 "1"(예상대로)이고 출력되지만 인쇄 할 때 같은 오류가 발생합니다. 루프 ... – souldzin
메모리 손상 문제가 발생합니다. 행운을 빕니다. – OldProgrammer