|
쿼리를 전담에서 수행하는 함수가 있습니다.
이 함수에서 쿼리를 수행하고, 만약 예외가 발생하면 그 에러 코드를 결과값으로
정상 수행이면 1을, 넘기는 함수가 있는데요
try
{
쿼리 수행 구문,
}
catch ( EDatabaseError )
{
예외 처리 구문
}
catch ( EDBEngine )
{
예외 처리 구문
}
이런 스탈로 만든 함수인데요
에러가 EDatabaseError이 나오고요,
EDatabaseError에서 에러 코드를 받아 내는 방법을 찾고 있습니다.
구글에서 뒤져 보니깐
EDatabaseError을 EDBEngineError로 바꿔서 Error[idx]->ErrorCode를 가져 오는 방법이 있길래
시도를 해봤는데요
dynamic_cast가 안 먹히네요
그것외에 다른 방법이 없나 뒤져 보고 있는 중입니다.
혹시나 해서 EDatabaseError에서 GetLastError도 받아 봤는데요 아닌것 같네요
EDatabaseError에서 ErrorCode를 어떻게 받아 내야 하는지 아시는분 좀 갈켜주세요~ ^^
ps. 데이타베이스는 Firebird 2.0 12748 이고 Embedded로 사용하고 있습니다.
int __fastcall TDM_GDB::DataQueryExecute(const TStringList* &sls_Query, const AnsiString &strCaller)
{
bool i_Return = 1;
TDateTime d_CheckTime = Now();
while (i_GTID1 != 0 && SecondsBetween(d_CheckTime, Now()) < 3)
Application->ProcessMessages();
i_GTID1++;
TTransactionDesc TD;
TD.TransactionID = i_GTID1;
TD.IsolationLevel = Dbxpress::xilREADCOMMITTED;
dbx_MainCon->StartTransaction(TD);
int k=0;
__try
{
for ( k = 0; k < sls_Query->Count; k++)
{
//LOGOUT("%s", sls_Query->Strings[k]);
if(strCaller == "CalculateUser")
{
//LOGOUT("%s", sls_Query->Strings[k]);
}
dbx_MainCon->ExecuteDirect(Trim(sls_Query->Strings[k].Trim()));
}
dbx_MainCon->Commit(TD); // on success, commit the changes;
i_Return = 1;
}
catch (const EDBEngineError &E)
{
ShowMessage(E.Message);
dbx_MainCon->Rollback(TD);
i_Return = E.Errors[E.ErrorCount]->ErrorCode;
}
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();
}
catch (...)
{
dbx_MainCon->Rollback(TD); // on failure, undo the changes
ErrorLogs("TDM_GDB::DataQueryExecute - 2 : ", sls_Query->Strings[k] + "\n\n");
throw("Error Happen : " + sls_Query->Strings[k] );
}
i_GTID1 = 0;
return i_Return;
}
|