Q&A

  • update failed라는 에러
예전의 질답 게시판을 열심히 찾아봤지만..답을 못찾아 이렇게 글을 남김니다.
테이블에서 해당하는 일련번호를 찾아 delete를 시켜야 하는데...
그게 잘 안됩니다.
With QR_DEL do
    begin
      Close;
      ParamByName('ACCN').AsInteger := GACC;
      ParamByName('NUM').AsString := NUMSEQ ;  //일련번호입니다.
      OPEN;
      if QR_DEL.RecordCount = 0 then
        Begin
          ShowMessage('삭제하려는 계산서가 없습니다');
          Exit;
        end;

      if QR_DEL.RecordCount > 0 then
        begin
          if Application.MessageBox('현재 자료를 삭제하시겠습니까?','삭제확인',MB_OKCANCEL) = id_OK then
            begin
              QR_DEL.Delete;
              QR_DEL.ApplyUpdates;  -> 이부분에서 에러가 납니다.
              FrmData.CommitTransaction;
              QR_DEL.Close;
              QR_DEL.ParamByName('ACCN').AsInteger := GACC;
              QR_DEL.ParamByName('NUM').AsString := NUMSEQ ;
              QR_DEL.Open;
              ShowMessage('삭제되었습니다 !!!');
              Clear_Edit_Box;
              Ed_SANO3.SetFocus;
            end;
         end; //
    end;

왜 에러가 나는지 알려주십시오..
1  COMMENTS
  • Profile
    김경록 2003.08.03 04:01
    음.. 소스를 보니 이전에 코딩한 내역을 안 보여 주시는군여..

    의문점이 먼저 드는게 있군여..
    아래 구문을 쓰기 전에
    점선 "--->" 부분에 대해서 Prepare가 먼저 선언이 된 것입니까?
    선언되었다고 가정하고 말씀드리져..

    With QR_DEL do
        begin
          Close;
    --> ParamByName('ACCN').AsInteger := GACC;
    --> ParamByName('NUM').AsString := NUMSEQ ;  //일련번호입니다.
          OPEN;


    If절을 아래와 같이 바꾸어 사용해 보십시오..
    if QR_DEL.RecordCount = 0 then
    ---> if QR_DEL.EOF then


    역시 이 문장도 아래와 같이 변경해 보십시오..
    if QR_DEL.RecordCount > 0 then
    --> if Not QR_DEL.EOF then


    QR_DEL.ApplyUpdates;  -> 이부분에서 에러가 납니다.
    위 문장을 보기 전에 아래 설명한 내용을 먼저 읽어 주십시오..
    (왠지 Online 지원형식의 답변같이 내가 답변하는 것 같네염..
    이상하게 사무적으로 쓰고 있네염..  *^^*)


    이 문장은 무엇을 뜻하는것입니까?
    ---> FrmData.CommitTransaction;

    그 전에 Transaction이 선언되었었다는 뜻입니까?
    그렇다면, ApplyUpdates는 불가합니다.
    Transaction 영역내에 있는 상태에서 현재 Row에 대해서
    삭제하고 Commit(ApplyUpdates)하라는 것은 어불성설입니다..
    Database에게 Transaction을 걸어 놓고..
    Delete 후
    Database를 Commit을 하십시오.. (ApplyUpdates를 하지 마십시오..)

    만약, Transaction을 걸지 않았다면,
    ApplyUpdates는 유효합니다.
    따라서, 다른 곳에서 Error가 없는지 확인해야 한다고 판단됩니다..


    Transaction과 관계가 없다면,
    조회되어진 Data가 존재하는지 확인해 보십시오..
    RecordCount는 불확실한 값을 가질 수 있습니다.
    즉, Select가 성공적으로 수행되었더라도 값은 임의의 값이
    리턴되어질 수 있습니다.. (결과 개수와 무관한 정수로 말입니다..)
    따라서, EOF로 확인하시는게 정확하다 할 수 있습니다.
    물론, Delphi Help에도 보시면, RecordCount에 대해서 부정확한값이
    리턴되어져 돌아올 수 있다고 설명해 놓고 있습니다.

    다시말씀드리면, Prepare를 님이 올려주신 이전에 선언했는지 확인하시고,
    Prepare가 되었다면, 해당 내역을 삭제하거나 변경하는 것은
    불가하다고 말씀드리고 싶습니다.
    (Transaction 영역밖에 있더라도.. 의미(개념)상으론 불가)
    Prepare는 단지 Select시 Delphi에게 넘겨줄 SQL문의
    Argument만을 변경할 수 있다는 뜻으로 델파이에게
    고정시켜 놓았다는 뜻이며,
    이는 어떤 Action을 취함에 있어서 제약을 해 놓겠다는 뜻이 됩니다..
    만약, Delete가 수행되었다면, 그것은 오류이며,
    Delete가 정상적으로 수행되지 않았을 가능성이 많습니다..

    도움이 되었는지는 모르지만...
    Prepare에 대해서 정확한 개념을 잡아 주시는게 좋지 않을지
    생각됩니다..
    더불어서 Transaction에 대해서도 말입니다..