|
저는 요 며칠, Builder-BDE를 통해 Oracle 8.1.6 연결하는 것에 대해
문제가 있어 질문을 2 차례 올렸던 사람입니다. 이리 저리 시도해 보고 있는데
아직 해결을 못한 상황입니다.
그런데, 상황을 추려 보니, 재미있는 사실을 발견했습니다.
TQuery를 통해 SQL문으로 어떤 쿼리질(?)을 시도하는데,
다른 것은 다 잘 먹히는데(select, create table, drop table)
유독 수정하는 SQL문(UPDATE, INSERT, DELETE)만 시도하면 문제가 발생합니다.
다시 말해, SQL문 중 UPDATE, INSERT, DELETE만 시도하면 프로그램이 중간에
뻑 죽어버립니다.
특기사항:
1) IDE에서 실행중일 경우에는 첨부한 그림과 같이 어셈블러 디버깅창이
뜨면서 프로그램이 죽습니다.
2) EXE를 단독실행했을 경우 UPDATE, INSERT, DELETE 시도 부분에서
프로그램이 아무 메시지 없이 (그냥 뻑) 종료되어 버립니다.
3) 그런데, 애초의 원했던 UPDATE, INSERT, DELETE 결과는 제대로 반영되어
있습니다. 즉, 프로그램은 죽었지만 Update SQL문은 Oracle DB에 제대로 먹혀
있단 말씀입니다.
SELECT 문이 제대로 먹히는 것이나, UPDATE 등도 서버 자체에는 제대로
반영되는 것을 보면, 환경설정이나 연결 확립 및 DB와의 통신 자체는 문제가
없을 것으로 생각됩니다.
그러나, UPDATE, INSERT, DELETE 만 요청하면 프로그램이 죽는 현상은
어떻게 해석을 해야 하고 어떻게 해결을 해야 할 지를 정말 모르겠군요.
다음은 제가 사용한 소스입니다. TMemo object 에 SQL 문을 입력하고 button을
누르면 실행하게끔 하였습니다. "SELECT"가 포함된 경우에는 Open()을,
"SELECT"가 포함안된 경우에는 ExecSQL()을 call하도록 하였습니다.
void __fastcall TForm1::BtnRunQClick(TObject *Sender)
{
AnsiString For1stWord = MemoQuery->Lines->Strings[0];
For1stWord = For1stWord.UpperCase();
bool fWithResultSet = (For1stWord.Pos("SELECT") > 0);
if(fWithResultSet)
qrImedia->Close();
/* 미리 close 하는 것은 SELECT문이 최신 정보를 서버로부터
가져오도록 강제하는 효과가 있다. (Update등을 위해서는 무의미)
혹자는 Update시에는 Close()하지 말라고 함.
*/
qrImedia->SQL->Assign(MemoQuery->Lines);
if(!qrImedia->Prepared)
qrImedia->Prepare();
/* Even though C++Builder prepares queries for you,
it is better programming practice to prepare
a query explicitly. That way your code is
self-documenting, and your intentions are clear.
*/
if(fWithResultSet)
qrImedia->Open();
else // update, insert, delete, ...
qrImedia->ExecSQL();
}
경험자의 조언을 애타게 기다립니다.
최성규
|