|
대충 결론을 냈습니다.
EDBEngineError 객체는 BDE에서 생성해서 넘긴다고 되어 있네요
그런데 TSQLQuery는 BDE를 통하지 않고 DB에 접근 하기 때문에
EDBEngineError 예외 객체를 만들지 않고 EDatabaseError 객체로 넘겨 주는것 같습니다.
TIBQuery 객체를 이용해서 다시 한번 해볼려고 합니다.
EException
EDatabaseException
EDBEngineError
계층도가 저렇게 되어 있어서
강제로 EDatabaseException에서 EDBEngine객체를 생성도 시켜 봤는데요 에러 나네요 쩝~
강재호.만해 님이 쓰신 글 :
: catch (EDatabaseError& E)
: {
: EDBEngineError* Error;
: Error = dynamic_cast<EDBEngineError*>(&E); <-- 형 변환 부분.
: if ( Error != NULL )
: {
: ShowMessage(Error->Errors[Error->ErrorCount]->Message);
: }
: ShowMessage(E.Message);
: dbx_MainCon->Rollback(TD); // on failure, undo the changes
: ErrorLogs("TDM_GDB::DataQueryExecute - 2 : ", sls_Query->Strings[k] + "\n\n");
: i_Return = GetLastError();
: }
:
: 저 위에 코드를 보시면 아시겠지만
:
: EDatabaseError &E; 변수를 가져와서
:
: EDBengine* Error;
: Error = dynamic_cast<EDbEngineError*>(&E); <- 여기서 형변환을 시킵니다.
:
: if (Error != NULL ) <- 여기서 Error 이 NULL이라서 여기 밑의 ShowMessage를 실행 시키지 않고 있네요
: {
: ShowMessage(Error->Errors[Error->ErrorCount]->Message);
: }
:
: 혹시나 제가 뭘 잘못 할고 있는건 아닌가 싶어서
:
: Ctrl+F7 키를 눌러서 해봤느데 같은 내용이 나오네요 어떻게 해야 할런지 쩝~ ^^
:
:
: 정재만 님이 쓰신 글 :
: : 꽁수 한가지 가르쳐 드리겠읍니다(권장안함)
: :
: : 메세지로 출력되는 에러코드를 추출하는것도 한가지 방법이긴 합니다..
: :
: :
: : 정재만 님이 쓰신 글 :
: : : 형 변환이 안되고 있다는 말씀이 컴파일 에러가 난다는 말인가요?
: : :
: : : 아니면 형변환후 기본값이 제대로 출력이 안된다는 말씀인지?
: : :
: : :
: : : dynamic_cast이후 TDBError *E = Err->Errors[i];로 함번 해보셨는지?
: : :
: : :
: : : 강재호.만해 님이 쓰신 글 :
: : : : catch (EDatabaseError& E)
: : : : {
: : : : EDBEngineError* Error;
: : : : Error = dynamic_cast<EDBEngineError*>(&E); <-- 형 변환 부분.
: : : : if ( Error != NULL )
: : : : {
: : : : ShowMessage(Error->Errors[Error->ErrorCount]->Message);
: : : : }
: : : : ShowMessage(E.Message);
: : : : dbx_MainCon->Rollback(TD); // on failure, undo the changes
: : : : ErrorLogs("TDM_GDB::DataQueryExecute - 2 : ", sls_Query->Strings[k] + "\n\n");
: : : : i_Return = GetLastError();
: : : : }
: : : : 제 코드에도 저 부분이 있긴 한데요
: : : :
: : : : 제가 타입 캐스팅을 잘못한건지 EDatabaseError* 에서 EDBEngineError*로 형 변환이 안되고 있네요
: : : :
: : : : 정재만 님이 쓰신 글 :
: : : : : 도움이 될련지
: : : : :
: : : : : 샘플코드을 참조하세요....
: : : : :
: : : : : void __fastcall TMainForm::ErrorCheck (TDataSet *TDataSet, EDatabaseError *E, TDataAction &Action)
: : : : : {
: : : : : AnsiString S;
: : : : : EDBEngineError *Err = dynamic_cast<EDBEngineError*>(E);
: : : : :
: : : : : if (Err) {
: : : : : for (int i = 0; i < Err->ErrorCount; i++) {
: : : : : if (i > 0) AppendStr(S, '\n');
: : : : : TDBError *E = Err->Errors[i];
: : : : : AppendStr(S, Format( "%.4x (%d): %s",
: : : : : ARRAYOFCONST((E->ErrorCode, E->NativeError,E->Message))));
: : : : : }
: : : : : DatabaseError(S, 0);
: : : : : }
: : : : : }
|