Q&A

  • ADOQuery 입력구문좀 봐주세요...
델파이5, MS-SQL Server 7.0을 사용합니다.
ADO컴포넌트를 사용 합니다.

accADO.BeginTrans();  //TADOConnection컴포넌트
  with SQLado do begin  //ADOQuery
    close;
    sql.clear;
    sql.add('INSERT INTO TESTDB');
    SQL.ADD('(생략)');    
    ExecSQL;
  end;
accADO.CommitTrans;
잘 입력 됩니다.
=============================================================
accADO.BeginTrans();  

  with SQLado do begin //Query1
    close;
    sql.clear;
    sql.add('INSERT INTO TESTDB');
    SQL.ADD('(생략)');    
    ExecSQL;
  end;
  with SQLado do begin  //Query2
    close;
    sql.clear;
    sql.add('INSERT INTO TESTDB');  
    ExecSQL;
  end;
accADO.CommitTrans;
이 경우는 Query2의 부분만 저장이 되네요...
==============================================================================
accADO.BeginTrans();  //TADOConnection컴포넌트
for i := 1 to 10 do begin
   with SQLado do begin  //ADOQuery
     close;
     sql.clear;
     sql.add('INSERT INTO TESTDB');
     SQL.ADD('(생략)');    
     ExecSQL;
   end;
end;
accADO.CommitTrans;
이 경우는 저장이 안되네요...
==============================================================================
실제 상황은 for문도 두어개 됩니다.
그러나 BeginTrans 와 CommitTrans는 최초와 마지막에 사용 하는 것이 맞는것 같고요
그리 했더니 저장이 안됩니다.

저~기 아래 질문을 했었는데 아침부터 계속 안돼서 다시질문을 올립니다.
죄성합니다.
accADO.BeginTrans();  //TADOConnection컴포넌트
for i := 1 to 10 do begin
   with SQLado do begin  //ADOQuery
     ExecSQL;
   end;
end;
for i := 1 to 10 do begin
   with SQLado do begin  //ADOQuery    
     ExecSQL;
   end;
end;
with SQLado do begin  //ADOQuery    
   ExecSQL;
end;
accADO.CommitTrans;
위 구문은 틀린 것인가요?  제대로 하려면 어떻게바꾸어 주어야 하나요?
감사합니다.
2  COMMENTS
  • Profile
    아폴론 2003.03.13 04:29
    ADO쿼리를 ADOCommand로 바꾸었습니다.그랫더니요 으~~~~~ 돌아버리겠어요~~~
    웬만큼 되어서 본격적으로 작업 했더니 정작 안되네요???
    저 아래 구문중 WITH 문 하나 빼면 DB 두개에 저장이 잘 되는데... 다시 넣으면
    전체가 입력이 안됩니다.
    에러가 나는것은 아니구요 커밋까지 잘 흘러갑니다. 그러나 정작 데이터는 저장이
    안되네요.~~~~~디비 두개 다 저장이 안되네여
    음.... 뒷골이 땡겨 진통제 먹고 다시 합니다......
    고수님들 다시함 살펴봐 주세요...

    ps>잠시 상황설명: MS-SQL디비는 외부업체가 만든 DataBase 입니다.
       저는 그 디비에 키값설정해서 한번에 많은 량의 데이터를 입력하고자 합니다.
       DB를 살펴보니 데이터 한건을 입력받으면 Table은 4개에 입력이 되고 그중 한테이블에는
       레코드가 22개나 생깁니다.






    //===========================================================================
    DDstr := '';
    DDstr :=' INSERT INTO TESTDB1 '+
          ' (....) ' +
          ' VALUES '+
          ' (:P....) ';
    //===========================================================================
    UDstr := '';
    UDstr :=' INSERT INTO TESTDB2 '+
          ' (....) '+
          ' VALUES '+
          ' (:P....) ';
    //===========================================================================
    accADO.BeginTrans();
    try
    with QRYt305 do begin
       first;
       Li_no := 0;
       while not eof do begin
          for i := 1 to 3 do begin //1청구금액, 2부가세,3합계로 나누기 위해..
             inc(Li_no);
             if i = 1 then begin
                for j := 1 to 6 do begin
                   with ADOCommand1 do begin  //INSERT INTO TESTDB1
                      commandtext := '';
                      commandtext := DDstr;
                      Parameters.ParamByName('P...').Value:= frdt;
                      Execute;
                   end;
                end;
                with ADOCommand2 do begin  //INSERT INTO TESTDB2
                   commandtext := '';
                   commandtext := UDstr;
                   Parameters.ParamByName('P...').Value:= frdt;
                   Execute;
                end;
             end else
             if i = 2 then begin
                for j := 1 to 6 do begin
                   with ADOCommand1 do begin  //INSERT INTO TESTDB1
                      commandtext := '';
                      commandtext := DDstr;
                      Parameters.ParamByName('P...').Value:= frdt;
                      Execute;
                   end;
                end;
                with ADOCommand2 do begin   //INSERT INTO TESTDB2
                   commandtext := '';
                   commandtext := UDstr;
                   Parameters.ParamByName('P...').Value:= frdt;
                   Execute;
                end;
             end else
             if i = 3 then begin
                for j := 1 to 10 do begin
                   with ADOCommand1 do begin  //INSERT INTO TESTDB1
                      commandtext := '';
                      commandtext := DDstr;
                      Parameters.ParamByName('P...').Value:= frdt;
                      Execute;
                   end;
                end;
                //============요기부터 없으면 제대로 입력됨===========
                //============있으면 전부 입력이 안됨=================
                with ADOCommand2 do begin   //INSERT INTO TESTDB2
                   commandtext := '';
                   commandtext := UDstr;
                   Parameters.ParamByName('P....').Value:= frdt;
                   Execute;
                end;
                //============요기까지================================
             end;
          end;
          Next;
       end;
    end;
    accADO.CommitTrans;
    except
       on E:Exception do begin
          accADO.RollBackTrans;
          showmessage('입력 실패' + #13+ E.Message);
          Exit;
       end;
    end;
    showmessage('성공');
  • Profile
    최정윤 2003.03.16 08:02

    해당부분에서 에러가 발생하기 때문에 트랜잭션 에러에 의해서 데이터가 롤백되는 상황입니다.

    해당부분에서 어떤 에러가 발생할만한 문제가 있는지는 위의 구문만을 보아서는 알수가 없구요.. 데이터베이스 필드와 파라미터에 들어가는 것들 혹은 SQL 전체 구문을 봐야만 문제를 알수 있을거 같습니다. 그럼 ....