Q&A

  • zeos+ mysql에러 'Transaction component not defined'
<!--CodeS-->
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ZQuery, ZMySqlQuery, ZTransact, ZMySqlTr, ZConnect,
  ZMySqlCon, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ZZMySqlDatabase1: TZZMySqlDatabase;
    ZZMySqlTransact1: TZZMySqlTransact;
    ZZMySqlQuery1: TZZMySqlQuery;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  queryStr: String;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
    // MySQL에 접속하기 위해서는 반드시 아래의 5개의 정보가 필요하다
    ZZMySqlDatabase1.Host := '192.168.0.10';
    ZZMySqlDatabase1.Login := 'root';
    ZZMySqlDatabase1.Password := '';
    ZZMySqlDatabase1.Database := 'i770624';
    ZZMySqlDatabase1.Port := '3306';

    try
      ZZMySqlDatabase1.Connect;
    except
      showMessage(' DB 접속실패 ');
    end;

    queryStr := 'INSERT INTO ipdata ( ipdata_code, ipdata_gongo ) VALUES';
    queryStr := queryStr + '(''1234'',''1234'');';

    ZZMySqlQuery1.Sql.Clear;
    ZZMySqlQuery1.Sql.Add(queryStr);

    try
      ZZMySqlQuery1.ExecSQL;
      showMessage( queryStr + ' 등록처리 ');
    except
      showMessage(' 등록실패 ');
    end;
end;
end.
<!--CodeE-->

위의 소스 코드를 실행해보면 에러가 나는데요.
에러문을 보면

<!--CodeS-->
Project1.exe raised exception class EDatabaseError with message 'Transaction component not defined'.
Process stopped. Use Step or Run to continue.
<!--CodeE-->

이건 데이터를 넣어야 뭘하지 미치겠네요 ㅠ.ㅠ
관련 문제엔 트랜잭션 지원을 안한다란 답변만 죽있는데..트랜잭션에서 에러가 나면 어떻게 하져ㅠ,ㅠ*

새로 만들고서 콤포넌트 다 추가해도 문제가 계속 발생해요.
답변 부탁드려요.ㅠ,ㅠ

4  COMMENTS
  • Profile
    박정훈 2007.01.07 01:38
    음...

    첫째. ZeosLib 설치시 제대로 설치를 했는지 한번 확인을 해 보세요. ZeosLib의 경우 INSTALL.html 문서를 보면 설치하는 순서가 있습니다. 그냥 아무대로 막 설치하면 설치는되지만 실행할때 저런 에러들이 나곤합니다. 그러니깐 !! 문서에 있는 설명대로 순서대로 설치를 하세용.  

    Transaction component not defined 라는 에러는 설치순서가 잘못되서 TZZMySqlTransact 콤포를 제대로 인식을 못하기 때문에 나오는 에러일 가능성이 큽니다.


    둘째. 일단 MySQL 버전이 3.x.x 대의 경우에는 트랜잭션을 지원하지 않기 때문에 (InnoDB제외) 트랜잭션을 쓸일이 없을테니 패스


    셋째. ZeosLib 5.x.x 버전의 경우 속도는 ZeosLib 6.x.x 버전보다는 속도가 빠릅니다만.. BLOB의 처리나 전체적인 안정성에서 약간의 문제가 있습니다. 특히 몇몇 프로퍼티의 경우 6.x.x 버전과 다른 것들이 많고 6.x.x에서는 통합되어버린것들이 많기 때문에 이왕이면 6.x.x 버전을 사용해서 개발을 하는것이 다른 DB로의 익스포트나 차후 라인업에도 도움이 됩니다.


    넷째. 아래의 코드중에 다음 부분은 약간의 문제가 있어 보입니다.  (게시판에서 escape 된것일수도 있는데. 일단 싱글쿼터 4개가 들어가야 합니다)

    <!--CodeS-->
        queryStr := 'INSERT INTO ipdata ( ipdata_code, ipdata_gongo ) VALUES';
        queryStr := queryStr + '('+''''+'1234'+''''+','+''''+'1234'+''''+')';
    <!--CodeE-->


    다섯째. MySQL관련된 연동방법은 이곳 강의실에 제가 올려둔 글이 있습니다. 참고가 되실거예요


    여섯번째.  보통의 경우 TZQUery 콤포를 폼에 얹어서 사용을 하게 되는데 쿼리가 많아지면 그것만큼 콤포를 올려 쓰는게 굉장히 불합리하게 됩니다. 따라서 아래의 코드는 다음과 같이 TZQUery 를 동적으로 생성해서 사용하는것이 좋을것 같습니다.


    <!--CodeS-->
    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ZQuery, ZMySqlQuery, ZTransact, ZMySqlTr, ZConnect,
      ZMySqlCon, StdCtrls;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        ZZMySqlDatabase1: TZZMySqlDatabase;
        ZZMySqlTransact1: TZZMySqlTransact;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;
      queryStr: String;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var tmpQuery : TZZMySqlQuery;
    begin
        // MySQL에 접속하기 위해서는 반드시 아래의 5개의 정보가 필요하다
        ZZMySqlDatabase1.Host := '192.168.0.10';
        ZZMySqlDatabase1.Login := 'root';
        ZZMySqlDatabase1.Password := '';
        ZZMySqlDatabase1.Database := 'i770624';
        ZZMySqlDatabase1.Port := '3306';

        try
          ZZMySqlDatabase1.Connect;
        except
          showMessage(' DB 접속실패 ');
        end;

        // 동적으로 생성
        try
           tmpQuery := TZZMySqlQuery.Create(nil);
           tmpQuery.Connection := ZZMySqlDatabase1;


           queryStr := 'INSERT INTO ipdata ( ipdata_code, ipdata_gongo ) VALUES';
           queryStr := queryStr + '('+''''+'1234'+''''+','+''''+'1234'+''''+')';

           tmpQuery.Sql.Clear;
           tmpQuery.Sql.Add(queryStr);

           try
              tmpQuery.ExecSQL;
             showMessage( queryStr + ' 등록처리 ');
           except
             showMessage(' 등록실패 ');
           end;

        finally
           tmpQuery.free;
        end;

    end.

    <!--CodeE-->


  • Profile
    이하나 2007.01.07 10:15

    말씀데로 메뉴얼 보고 몇번을 해보고 했던 건데요.ㅠ,ㅠ*



    common7DPK, DBware7DPK, MySQL7DPK



    이렇게 순서데로 한건데 계속 그러네요 ㅠ,ㅠ
    동적생성 예제 참조해주신것 써봐도 아래 부분 Connection 부분에 에러가 나고요.


           tmpQuery.Connection := ZZMySqlDatabase1;


    에러내용은...



    [Error] test.pas(56): Undeclared identifier: 'Connection'


    와 같은데요.
    주말 새벽 1시가 다 되어가는 시간에 이러고 있어요ㅠ.ㅠ
    완전 초보라고 생각하셔야 할거예요ㅠ.ㅠ

    그럼 답변 부탁드립니다.
  • Profile
    박정훈 2007.01.07 15:07
    음.. 백번설명보다는 제대로 동작하는 소스를 보시고 분석해 보시는게 나을것 같아서 소스올립니다. 참고하세요
    Zeos 두 버전에서 전부 정상 작동하는 코드이니 이게 컴파일이 안된다거나 제대로 동작을 안한다면 처음부터 차근차근 설치->Environment 패스 등록 단계까지 되짚어 보시기 바랍니다.

    6.x.x 랑 5.x.x의 차이가 좀 있으니 (Transaction 콤포의 존재 유무에 따른 차이와 연결 프로퍼티의 차이) 주의하시구요.

    아.. dpk들 설치후에

    Tools -> Evironment Options ->  Library -> Library Path  에서 ZeosLib가 있는 패스는 설정하셨죠?

    5.x.x의 경우  common, dbase, other 이 세 폴더를 등록시켜야 되구요
    6.x.x의 경우  src 폴더의 아래이 있는 하위폴더들을 전부 등록시켜놔야 합니다.

    즐삽하세용



    ps. 5.x.x 보다는 6.x.x 버전을 사용하길 강력 권장합니다.  5.x.x는 데이터베이스 종류별로 콤포들이 나눠져 있지만 6.x.x 에서는 TZConnection.protocol 이 부분만 변경해 주면됩니다. (물론 코드내의 SQL문들은 각 데이터베이스에 맞게 수정을 또 해줘야겠죵)
    행여나 나중에 데이터베이스의 종류를 바꾸게 되는경우 5.x.x 버전을 사용하면 노가다 만땅으로 해야 하는 경우가 발생합니다.


  • Profile
    이하나 2007.01.08 18:16
    <!--CodeS-->
      tmpQuery.Transaction := ZZMySqlTransact1;
    <!--CodeE-->

    박정훈님 감사드립니다. ㅠ.ㅠ*
    위에 부분이 빠져서 않됐었나봐요..
    으흐..델파이에 재미를 느끼면서도 이런 부분에 너무 어려워집니다.

    답변 감사드리구요. 열심히 하겠습니다....감사합니다.^^*