Q&A

  • DBExpress에 대해문의드립니다..답변꼭좀부탁드릴꼐요..ㅠㅠ
안녕하세요
모두들 즐거운 저녁을 보내고계시는지요..

DBExpress에 대해 알지를못해서 문의드립니다..
왜저런것도 모르지 하고 지나치시마시구요..
답변 꼭 부탁드려요..

A서버의 테이블에서 데이타를 읽어와서
B서버의 테이블에 데이타를 인서트 하는겁니다.

A서버 데이타조회: TSQLConnection-TSQLQuery-TDataSetProvider-TClientDataSet-tDataSource-Grid
B서버 데이타조회: TSQLConnection-TSQLQuery-TDataSetProvider-TClientDataSet

A서버 데이타는 문제없이 조회가됩니다.
근데 B서버로 데이타 인서트가 되질않습니다.
TSQLQuery.Close
TSQLQuery.SQL := 인터스문장(INSERT INTO a_table VALUES (:a,:b) )
TSQLQuery.ParamByName('a').AsString := aa;
TSQLQuery.ParamByName('b').AsString := bb;
TSQLQueryExecSQL;
TClientDataSet.Open;
TClientDataSet.ApplyUpdates(-1);

이렇게 처리하였더니
Project Project1.exe raised exception class TDBXError with message 'DBX Error:  ParameterNotSet'.
에러가납니다..

DBExpress컴포넌트는 단방향버퍼컴포넌트여서 TDataSetProvider-TClientDataSet을 함께 써야한다고
해서 했는데..도저히 되질않습니다..

사실 DBExpress 도 처음써봤고...그래서 여기저기서 찾아보아도..명쾌하게 알수가없어서
이렇게 직접 질문을올립니다..

그럼 좋은 밤들 되세요..

5  COMMENTS
  • Profile
    초보임당 2009.11.06 18:10
    이렇게 해보시면 어떻시겠어요...

    둘다 ClientDataSet (줄여서 CDS) 을 쓰셨으면 CDS 를 그냥 쓰시면 되요..

    INSERT 시만..(EDIT 는 배제 햇습니다.)

    A 서버쪽의 CDS를 CDS_A 라 하고 B서버쪽의 CDS를 CDS_B 라 하면요..ㅎㅎ

    1. 일단 A서버쪽의 데이터를 오픈합니다.


    begin
    with CDS_A do begin

    Close;
    CommandText := 'SELECT aa, bb FROM A_TABLE WHERE .....' ; //쿼리문
    Open;

    //만약 비어있지 않다면...B서버쪽에 쿼리한 데이터를 입력 합니다.
    if not IsEmpty then begin

    with CDS_B do begin

    Close;
    CommandText := 'SELECT aa, bb FROM A_TABLE WHERE 1 = -1 ' ; //where 조건에 1 = -1을 해서 일단 테이블을 오픈합니다.
    Open;

    //CDS_A 의 조회된 데이터를 루핑돌리며 CDS_B 의 필드에 입력 합니다.
    CDS_A.DisableControls; //CDS 를 Controls 를 Enable True 하면 루핑돌는게 화면에 보여서...일단 DisableControls 해놓습니다. (그리드에서 쭉 내려가는게 보여요..ㅎㅎ)
    CDS_A.First; //가장 처움레코드부터 루핑돌려야 겠죠?
    try
    while not CDS_A.Eof do begin
    Insert;
    FieldByName('a').AsString := CDS_A.FieldByName('a').AsString
    FieldByName('b').AsString := CDS_A.FieldByName('a').AsString ;
    Post;
    CDS_A.Next;
    end;
    finally
    CDS_A.EnableControls;
    end;

    //입력이 끝나면 CDS_B 의 데이터를 서버에 업데이트 합니다.
    if CDS_B.ApplyUpdates(0) > 0 then Exit;
    end;
    end;
    end;
    end;

    이렇게 해보시면 어떻시겠어요...


    입력만 했는데...CDS 의 EDIT 나 DELETE 등도 가능합니다..
  • Profile
    초보임당 2009.11.06 20:21
    아 하나더 있네요...TDataSetProvider 옵션에 보면 PoAllowCommandText 를 True 로 해주세요..ㅋㅋ
  • Profile
    아리쏭~ 2009.11.06 21:58
    답변감사합니다..님이알려주신방법대로 해보고 결과올릴께요!!^^
    즐거운 오후시간되세요!!
  • Profile
    아리쏭~ 2009.11.07 01:51
    일단 어떤방식으로 하라는지 이해는 했고..
    그대로 코딩을했습니다.

    근데 ApplyUpdates에서 에러가 나네요..
    Project Project1.exe raised exception class EDatabaseError with message 'Unable to find record. No key specified'.
    이런에러가 납니다..

    열심히 디버깅중인데..에러잡기 어려워요..ㅠㅠ
  • Profile
    아리쏭~ 2009.11.07 03:20
    제가 DateTime의 NULL값처리를 잘못해줘서 난에러더라구요..
    아주 잘잘잘 돌아갑니다.
    감사합니다..(--)(__)..

    좋은주말보내세요~~^^