Q&A

  • 삽입 수정 삭제에 에러처리 좀 갈켜주세요.
안녕하세요.

오늘의 질문은 입력, 수정, 삭제를 하고자 함에 있어서

발생되는 에러를 도무지 알 수가 없는데 도움을 청합니다.



트랜잭션을 시작하면 발생하게 됩니다.



'Cannot perform this operation on a closed database'





procedure TForm3.Button1Click(Sender: TObject);

var

InsertSQL: String;

begin

if Edit3.Text = '' then

Edit3.SetFocus;

if Edit2.Text = '' then

Edit2.SetFocus;

if Edit1.Text = '' then

Edit1.SetFocus;



if not Database1.InTransaction then

Database1.StartTransaction;



with Query1 do begin

Close;

SQL.Clear;

InsertSQL := '';

InsertSQL := 'insert into animals.dbf(Name, Weight, Area)' +

' values(:prName, :prWeight, :prArea)';

SQL.Add(InsertSQL);

ParamByName('prName').AsString := Trim(Edit1.Text);

ParamByName('prWeight').AsString := Trim(Edit2.Text);

ParamByName('prArea').AsString := Trim(Edit3.Text);

end;



try

Query1.ExecSQL;

Database1.Commit;

Query1.Refresh;

except

Database1.Rollback;

Query1.Refresh;

end;



Edit1.Text := '';

Edit2.Text := '';

Edit3.Text := '';

end;





며칠째 풀지 못한 숙제로 남아 있습니다.

정말 도와주세요.



6  COMMENTS
  • Profile
    linuxwiz 2000.10.26 21:31
    로칼디비를 쓰시나보군여...

    테스트 해보니 않되더군여...



    제 기억으로는 트랜잭션을 지원해주지 않는 것 같습니다..







    초보자 wrote:

    > 안녕하세요.

    > 오늘의 질문은 입력, 수정, 삭제를 하고자 함에 있어서

    > 발생되는 에러를 도무지 알 수가 없는데 도움을 청합니다.

    >

    > 트랜잭션을 시작하면 발생하게 됩니다.

    >

    > 'Cannot perform this operation on a closed database'

    >

    >

    > procedure TForm3.Button1Click(Sender: TObject);

    > var

    > InsertSQL: String;

    > begin

    > if Edit3.Text = '' then

    > Edit3.SetFocus;

    > if Edit2.Text = '' then

    > Edit2.SetFocus;

    > if Edit1.Text = '' then

    > Edit1.SetFocus;

    >

    > if not Database1.InTransaction then

    > Database1.StartTransaction;

    >

    > with Query1 do begin

    > Close;

    > SQL.Clear;

    > InsertSQL := '';

    > InsertSQL := 'insert into animals.dbf(Name, Weight, Area)' +

    > ' values(:prName, :prWeight, :prArea)';

    > SQL.Add(InsertSQL);

    > ParamByName('prName').AsString := Trim(Edit1.Text);

    > ParamByName('prWeight').AsString := Trim(Edit2.Text);

    > ParamByName('prArea').AsString := Trim(Edit3.Text);

    > end;

    >

    > try

    > Query1.ExecSQL;

    > Database1.Commit;

    > Query1.Refresh;

    > except

    > Database1.Rollback;

    > Query1.Refresh;

    > end;

    >

    > Edit1.Text := '';

    > Edit2.Text := '';

    > Edit3.Text := '';

    > end;

    >

    >

    > 며칠째 풀지 못한 숙제로 남아 있습니다.

    > 정말 도와주세요.

    >

  • Profile
    초보자 2000.10.26 21:51
    linuxwiz wrote:

    > 로칼디비를 쓰시나보군여...

    > 테스트 해보니 않되더군여...

    >

    > 제 기억으로는 트랜잭션을 지원해주지 않는 것 같습니다..

    >

    답변 감사드립니다.

    그렇다면 트랜잭션 말고 로컬DB의 변동사항을 적용 시킬 수 있는 다른 방법은 없나요?

    캐쉬업데이트도 마찬가지입니까?

    이제는 지쳐갑니다.

    도와주세요.

  • Profile
    임형호 2000.10.26 22:23
    로컬디비가 트랙잭션이 안되는지 어떤지는 잘 모르겠습니다. 로컬에서는 해보지를 않아서요. (델파이만 있어서도 테스트해보는건데...) 아래에 글을 올려놓으신 분들의 글을 보면 되는것 같네요.

    음..... 된다면야 그게 제일 좋은 방법이지만요.

    그런데...캐쉬업데이트는 가능합니다.

    applyupdate인가? 암튼 그문장을 실행시키지 않으면 적용되지 않더군요.

    그걸 적절히 사용하면 트랜잭션 처리가 가능하리라 생각이듭니다.





    초보자 wrote:

    > linuxwiz wrote:

    > > 로칼디비를 쓰시나보군여...

    > > 테스트 해보니 않되더군여...

    > >

    > > 제 기억으로는 트랜잭션을 지원해주지 않는 것 같습니다..

    > >

    > 답변 감사드립니다.

    > 그렇다면 트랜잭션 말고 로컬DB의 변동사항을 적용 시킬 수 있는 다른 방법은 없나요?

    > 캐쉬업데이트도 마찬가지입니까?

    > 이제는 지쳐갑니다.

    > 도와주세요.

  • Profile
    김영대 2000.10.26 21:24
    지금 보이는 에러는

    DataBase 가 오픈되지 않을 경우에 나는 에러 같은데여...



    Database1.Open;

    or DataBase1.Connected := True; 먼저 이렇게

    해주셨는지 궁금하네여..



    그럼 도움이 되셨기를 빌며....



    즐코딩 하세여..





    초보자 wrote:

    > 안녕하세요.

    > 오늘의 질문은 입력, 수정, 삭제를 하고자 함에 있어서

    > 발생되는 에러를 도무지 알 수가 없는데 도움을 청합니다.

    >

    > 트랜잭션을 시작하면 발생하게 됩니다.

    >

    > 'Cannot perform this operation on a closed database'

    >

    >

    > procedure TForm3.Button1Click(Sender: TObject);

    > var

    > InsertSQL: String;

    > begin

    > if Edit3.Text = '' then

    > Edit3.SetFocus;

    > if Edit2.Text = '' then

    > Edit2.SetFocus;

    > if Edit1.Text = '' then

    > Edit1.SetFocus;

    >

    > if not Database1.InTransaction then

    > Database1.StartTransaction;

    >

    > with Query1 do begin

    > Close;

    > SQL.Clear;

    > InsertSQL := '';

    > InsertSQL := 'insert into animals.dbf(Name, Weight, Area)' +

    > ' values(:prName, :prWeight, :prArea)';

    > SQL.Add(InsertSQL);

    > ParamByName('prName').AsString := Trim(Edit1.Text);

    > ParamByName('prWeight').AsString := Trim(Edit2.Text);

    > ParamByName('prArea').AsString := Trim(Edit3.Text);

    > end;

    >

    > try

    > Query1.ExecSQL;

    > Database1.Commit;

    > Query1.Refresh;

    > except

    > Database1.Rollback;

    > Query1.Refresh;

    > end;

    >

    > Edit1.Text := '';

    > Edit2.Text := '';

    > Edit3.Text := '';

    > end;

    >

    >

    > 며칠째 풀지 못한 숙제로 남아 있습니다.

    > 정말 도와주세요.

    >

  • Profile
    초보자 2000.10.26 21:55
    김영대 wrote:

    > 지금 보이는 에러는

    > DataBase 가 오픈되지 않을 경우에 나는 에러 같은데여...

    >

    > Database1.Open;

    > or DataBase1.Connected := True; 먼저 이렇게

    > 해주셨는지 궁금하네여..

    >

    > 그럼 도움이 되셨기를 빌며....

    >

    > 즐코딩 하세여..

    >



    가르쳐주신대로 해보았는데요.

    이번에는 Database의 이름을 묻더군요.

    다시한번 부탁드립니다.

  • Profile
    황유동 2000.10.26 22:07
    제 경험으로 'Cannot perform this operation on a closed database' 에러는

    로컬DB를 사용할 경우 해당 DB 파일 또는 테이블이 open 되어 있을때 나더군요....

    그러니까....

    다른 프로세스가 해당 파일이나 테이블을 잡고 있는 경우가 되죠....

    예를 든다면 database desktop로 해당 파일이나 테이블을 open 해 놓았다든지....

    아니면 디버깅 도중에 파일이나 테이블을 닫지 않고 종료되었다든지....

    이런 경우 리부팅을 하고 다시 실행하면 되던데.....

    차분히 보시면 가능할 것 같습니다...

    도움이 되셨으면 좋겠네여.....^^





    초보자 wrote:

    > 김영대 wrote:

    > > 지금 보이는 에러는

    > > DataBase 가 오픈되지 않을 경우에 나는 에러 같은데여...

    > >

    > > Database1.Open;

    > > or DataBase1.Connected := True; 먼저 이렇게

    > > 해주셨는지 궁금하네여..

    > >

    > > 그럼 도움이 되셨기를 빌며....

    > >

    > > 즐코딩 하세여..

    > >

    >

    > 가르쳐주신대로 해보았는데요.

    > 이번에는 Database의 이름을 묻더군요.

    > 다시한번 부탁드립니다.