Q&A

  • ADO Transaction처리에 관하여
아래와 같이 작성된 함수에서...



{*****************************************************************

*

*

*

*****************************************************************}

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;





1  COMMENTS
  • Profile
    nilriri 2001.09.16 00:59
    E.className해서 보니까 EDBEngineError 에러가 아니고 EOleException

    이었습니다.

    그래서

    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;

    >

    >

    • 김주석
    • 2001.09.15 21:16
    • 2 COMMENTS
    • /
    • 0 LIKES
    • skpark
      2001.09.16 03:21
      법인번호도 주민등록번호 유효성검사와 같습니다. 사업자번호는.... 김주석 wrote: > 법인번호 유효성검...
    • 김주석
      2001.09.19 21:47
      skpark wrote: > 법인번호도 주민등록번호 유효성검사와 같습니다. > 사업자번호는.... 주민등록번호와 ...
    • SSaulkka
    • 2001.09.15 20:47
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 왕초보^
      2001.09.17 09:42
      초보입니다... wrote: > 1. Preview로 미리보기를 실행시키면 메모리 누수가 일어나는 것 같습니다. > ...
    • 돌쇠
      2001.09.18 23:38
      답답해... wrote: > edit에 입력되는 값을.... > > > 숫자만 입력을 받아야 하거든요... > > 그걸...
    • 이성훈
      2001.09.15 20:08
      답답해... wrote: > edit에 입력되는 값을.... > > > 숫자만 입력을 받아야 하거든요... > > 그걸...
    • 연기훈
      2001.09.15 20:07
      maskedit를 사용하시는게 어떨런지여..... 아니면.. edit 이벤트중 key down 이벤트에서 키가 룰린것...
    • nilriri
    • 2001.09.15 19:34
    • 1 COMMENTS
    • /
    • 1 LIKES
    • nilriri
      2001.09.16 00:59
      E.className해서 보니까 EDBEngineError 에러가 아니고 EOleException 이었습니다. 그래서 on .... d...
    • 델초보
    • 2001.09.15 18:58
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 나그네
      2001.09.15 23:36
      DBase 에서는 Number형과 Float형 만 지원됩니다. insert into "home.dbf" valuse ('1','2') 숫자형선언...
    • 델초보
      2001.09.17 10:05
      나그네 wrote: > DBase 에서는 Number형과 Float형 만 지원됩니다. > insert into "home.dbf" valuse ('1...
    • 초보맨
    • 2001.09.15 18:49
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 나그네
      2001.09.15 23:27
      이거다! 라고 할만한것은, 아니 정답이 없습니다. 만든이가 맘대로-엿장수 맘대로-만든다는 애기지요. 머...
    • stone
    • 2001.09.15 16:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 쥐 <:( )~
      2001.09.16 15:09
      stone wrote: > ==[질문코드]======================================================= > String str1 :...
    • 쥐 <:( ) ~
      2001.09.15 18:07
      새까만넘 wrote: > 안녕하세요? > Adoquery 로 DBGrid 에 데이타를 불러왔는데요. > 다음과 같이 총점 ...
    • 정호
    • 2001.09.15 10:25
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 쥐 <:( ) ~
      2001.09.15 18:01
      정호 wrote: > 소켓에서 서버로부터 Receive 받는 string에서 케리지리턴값을 포함에서 > 던져주는데 그...
    • redcoda
    • 2001.09.15 09:02
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 더날드
      2001.09.26 01:20
      안녕하세요.. 우선 다운받는곳에선.. User := 'nan'; Password := 'babo'; Host := '22.222.222.22'...
    • 급한이
    • 2001.09.15 07:05
    • 1 COMMENTS
    • /
    • 0 LIKES
    • major
      2001.09.15 19:15
      급한이 wrote: > 초보실력에 회사에 있는 프로그램을 수정하다보니 다음과 같은 작업이 않되어서 급하게 ...
    • 용이
    • 2001.09.15 06:23
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2001.09.17 20:59
      저도 예전에 메신저를 한번 만들어 볼까 했던 적이 있었드랬습니다. 간단하게 말씀드리자면, 메신저를 ...
    • 용이
      2001.09.18 05:02
      한원희 wrote: > 저도 예전에 메신저를 한번 만들어 볼까 했던 적이 있었드랬습니다. > > 간단하게 말...
    • 라일락
    • 2001.09.15 05:56
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 홍세비
      2001.09.18 02:14
      라일락 wrote: > 안녕하세요.. Edit박스에 관한 질문입니다.. > 최근에 Edit박스의 외곽선이 델파이의 표...
    • 라일락
      2001.09.15 18:23
      답변 감사합니다.. 델파이5 에서는 없는것 같은데... 그런기능이 구현된 컴포넌트가 어디에 있는지 가르...
    • 쥐 <:( ) ~
      2001.09.15 17:51
      라일락 wrote: > 안녕하세요.. Edit박스에 관한 질문입니다.. > 최근에 Edit박스의 외곽선이 델파이의 표...
    • 새까만넘
      2001.09.15 13:00
      라일락 wrote: > 안녕하세요.. Edit박스에 관한 질문입니다.. > 최근에 Edit박스의 외곽선이 델파이의 표...
    • 쥐 <:( ) ~
      2001.09.15 18:10
      새까만넘 wrote: > 라일락 wrote: > > 안녕하세요.. Edit박스에 관한 질문입니다.. > > 최근에 Edit박스...
    • 델초
      2001.09.16 22:34
      쥐 새까만넘 wrote: > > 라일락 wrote: > > > 안녕하세요.. Edit박스에 관한 질문입니다.. > > > 최근...