아래와 같이 작성된 함수에서...
{*****************************************************************
*
*
*
*****************************************************************}
Function SQLExec(SQL:String):Boolean;
var
Cmd : TADOCommand;
ErrStr : String;
begin
try
Cmd := TADOCommand.Create(nil);
Cmd.Connection := Cnn; //맨 아래쪽에...컨넥션 하는거 있습니다.
Cmd.CommandType := cmdText;
Cmd.CommandText := SQL;
if (Cnn.InTransaction) then Cnn.CommitTrans;
Cnn.BeginTrans;
Cmd.Execute;
Cnn.CommitTrans;
Cmd.Free;
SQLExec := True;
except
on E : EDBEngineError do
begin
ErrStr := getDBErr(E);
Cnn.RollbackTrans;
Application.MessageBox( PChar(ErrStr), 'SQL 실행 오류', + MB_DEFBUTTON1 + MB_ICONSTOP + MB_APPLMODAL );
Cmd.Free;
SQLExec := False;
end ;
end ;
end;
{*****************************************************************
*
*
*
*****************************************************************}
Function getDBErr(p_E: EDBEngineError):String;
var
li_Err: Integer;
ls_Errnum, ls_Errtext : String;
begin
ls_errnum := '에러 번호: ' + IntToStr(p_e.ErrorCount) + #13;
for li_Err := 0 to p_e.ErrorCount - 1 do
begin
ls_errtext := ls_errtext + '에러메시지 : '+ p_E.errors[li_err].Message+#13;
end;
Result := ls_errnum + ls_Errtext
end;
SQLExec(sql)을 실행중...에러가 발생했을때...
다시한번 똑같은 함수를 실행하면..
이미 트랜젝션이 진행중이라고 에러가 발생합니다.
그래서
if (Cnn.InTransaction) then Cnn.CommitTrans;
위와 같은 문장을 추가하니까...에러가 없더군요..
그렇다면.
try
except
end
에서 ...except블럭에 있는...
Cnn.RollbackTrans;
위의 문장이 실행이 안된다는 건데...
에러가 발생해서 에러메시지가 출력되는 것도..
getDBError()함수를 통해서 생성된 에러 메시지가 아니라..
기본적으로 뜨는 에러 메시지가 출력되더군요..
except블럭에..showmessage()를 사용해서
메시지가 뜨지 않구요...
뭐가 문제인지..어떻게 해결해야 하는지...
한말씀씩...-.-;
그럼..즐거운 주말보내시길...
아래 추가했어요...이것두 있어야 할거 같아서..-.-;
Function DBConnect():Boolean;
var
ErrStr : String;
begin
try
if (Cnn=nil) then
begin
Cnn := TADOConnection.Create(nil);
end;
With Cnn do
begin
if (Not Connected) then
begin
ConnectionString := ConStr;
LoginPrompt := False;
Connected := True;
end
end;
DBConnect := True;
except
on E : EDBEngineError do
begin
ErrStr := getDBErr(E);
Application.MessageBox( PChar(ErrStr), 'SQL 실행 오류', + MB_DEFBUTTON1 + MB_ICONSTOP + MB_APPLMODAL );
DBConnect := False;
end ;
end ;
end;
이었습니다.
그래서
on .... do
begin
:
:
end;
블럭의 예외처리가 몽땅 빠져서 트랜젝션이 이미 시작 되었다는 오류도 나고
롤백도 안되고 그랬더군요..
즐건 주말 보내시고...항상 즐코하시길..-.-;
nilriri wrote:
> 아래와 같이 작성된 함수에서...
>
> {*****************************************************************
> *
> *
> *
> *****************************************************************}
> Function SQLExec(SQL:String):Boolean;
> var
> Cmd : TADOCommand;
> ErrStr : String;
> begin
> try
> Cmd := TADOCommand.Create(nil);
>
> Cmd.Connection := Cnn; //맨 아래쪽에...컨넥션 하는거 있습니다.
> Cmd.CommandType := cmdText;
> Cmd.CommandText := SQL;
>
>
> if (Cnn.InTransaction) then Cnn.CommitTrans;
> Cnn.BeginTrans;
> Cmd.Execute;
> Cnn.CommitTrans;
>
> Cmd.Free;
>
> SQLExec := True;
> except
> on E : EDBEngineError do
> begin
> ErrStr := getDBErr(E);
> Cnn.RollbackTrans;
> Application.MessageBox( PChar(ErrStr), 'SQL 실행 오류', + MB_DEFBUTTON1 + MB_ICONSTOP + MB_APPLMODAL );
> Cmd.Free;
> SQLExec := False;
> end ;
> end ;
> end;
>
> {*****************************************************************
> *
> *
> *
> *****************************************************************}
> Function getDBErr(p_E: EDBEngineError):String;
> var
> li_Err: Integer;
> ls_Errnum, ls_Errtext : String;
> begin
> ls_errnum := '에러 번호: ' + IntToStr(p_e.ErrorCount) + #13;
> for li_Err := 0 to p_e.ErrorCount - 1 do
> begin
> ls_errtext := ls_errtext + '에러메시지 : '+ p_E.errors[li_err].Message+#13;
> end;
> Result := ls_errnum + ls_Errtext
> end;
>
> SQLExec(sql)을 실행중...에러가 발생했을때...
> 다시한번 똑같은 함수를 실행하면..
> 이미 트랜젝션이 진행중이라고 에러가 발생합니다.
> 그래서
> if (Cnn.InTransaction) then Cnn.CommitTrans;
> 위와 같은 문장을 추가하니까...에러가 없더군요..
>
> 그렇다면.
> try
> except
> end
> 에서 ...except블럭에 있는...
>
> Cnn.RollbackTrans;
>
> 위의 문장이 실행이 안된다는 건데...
> 에러가 발생해서 에러메시지가 출력되는 것도..
> getDBError()함수를 통해서 생성된 에러 메시지가 아니라..
> 기본적으로 뜨는 에러 메시지가 출력되더군요..
> except블럭에..showmessage()를 사용해서
> 메시지가 뜨지 않구요...
> 뭐가 문제인지..어떻게 해결해야 하는지...
> 한말씀씩...-.-;
>
> 그럼..즐거운 주말보내시길...
>
>
>
>
>
> 아래 추가했어요...이것두 있어야 할거 같아서..-.-;
>
> Function DBConnect():Boolean;
> var
> ErrStr : String;
> begin
> try
> if (Cnn=nil) then
> begin
> Cnn := TADOConnection.Create(nil);
> end;
>
> With Cnn do
> begin
> if (Not Connected) then
> begin
> ConnectionString := ConStr;
> LoginPrompt := False;
> Connected := True;
> end
> end;
>
> DBConnect := True;
> except
> on E : EDBEngineError do
> begin
> ErrStr := getDBErr(E);
> Application.MessageBox( PChar(ErrStr), 'SQL 실행 오류', + MB_DEFBUTTON1 + MB_ICONSTOP + MB_APPLMODAL );
> DBConnect := False;
> end ;
> end ;
> end;
>
>