<!--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-->
이건 데이터를 넣어야 뭘하지 미치겠네요 ㅠ.ㅠ
관련 문제엔 트랜잭션 지원을 안한다란 답변만 죽있는데..트랜잭션에서 에러가 나면 어떻게 하져ㅠ,ㅠ*
새로 만들고서 콤포넌트 다 추가해도 문제가 계속 발생해요.
답변 부탁드려요.ㅠ,ㅠ
첫째. 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-->