1-2. DB 접속용 객체 각 클라이언트가 사용할 "ZeosLib"의 DB Connection과 Query 컴퍼넌트는 하나의 객체에 묶어서 만든다. 기본적으로 DB Connection을 열고 닫는 procedure와 "Transaction" 처리를 위한 procedure, DB 설정을 위한 procedure, 그리고 클라이언트의 정보를 기록할 변수들을 추가한다. "constructor"에 사용한 파라메터는 접속한 클라이언트의 IP인데 "접속 ID"에 추가해서 로그 기록시 정보로 활용된다. Firebird의 Transaction은 Rollback/Commit을 RollbackRetaining/CommitRetaining으로 해야 다른 접속자에게도 변경사항이 적용이 되는데, ZeosLib 7.3에서는 DB의 종류에 따라 알아서 자동 처리하기때문에 그냥 Rollback/Commit으로 처리하면 된다.
    // simlaz_db.pas
    unit simlaz_db;

    {$mode delphi}{$H+}

    interface

    uses
      Classes, SysUtils, db, ZDbcIntfs, ZConnection, ZDataset;

    type

      { TSIMLazDB }

      TSIMLazDB = class(TObject)
      private
        FConnID: string; // 접속ID
        FConnTime: TDateTime; // 접속일시
        FReqTime: TDateTime; // 최종요청일시
        FUserID: string; // 사용자ID

        FDBConn: TZConnection;
        FQuery: TZQuery;

      public
        constructor Create(AOwner: TComponent; AIP: string);
        destructor Destroy; override;

        procedure Open;
        procedure Close;
        procedure StartTrans;
        procedure Commit;
        procedure Rollback;
        procedure SetDBParams(AHostName, ADatabase, AUserID, APassword: string);

        property ConnID: string read FConnID write FConnID;
        property ConnTime: TDateTime read FConnTime write FConnTime;
        property ReqTime: TDateTime read FReqTime write FReqTime;
        property UserID: string read FUserID write FUserID;
        property Query: TZQuery read FQuery write FQuery;
      end;

    implementation

    constructor TSIMLazDB.Create(AOwner: TComponent; AIP: string);
    begin
      FUserID := '';
      FConnTime := Now;
      FReqTime := FConnTime;
      FConnID := AIP + '_' + FormatDateTime('yyyymmddhhnnsszzz', FConnTime);

      FDBConn := TZConnection.Create(AOwner);
      FDBConn.Name := 'SIMLazDB' + FormatDateTime('yyyymmddhhnnsszzz', Now);
      FDBConn.LoginPrompt := False;
      FDBConn.TransactIsolationLevel := tiReadCommitted;

      FDBConn.Protocol := 'firebird';
      FDBConn.ClientCodepage := 'UNICODE_FSS';

      FQuery := TZQuery.Create(AOwner);
      FQuery.Connection := FDBConn;
      FQuery.CachedUpdates := True;
    end;

    destructor TSIMLazDB.Destroy;
    begin
      if FDBConn.InTransaction then FDBConn.Rollback;
      if FQuery.Active then FQuery.Close;
      Close;

      FreeAndNil(FQuery);
      FreeAndNil(FDBConn);

      inherited Destroy;
    end;

    procedure TSIMLazDB.Open;
    begin
      if not FDBConn.Connected then FDBConn.Connect;
    end;

    procedure TSIMLazDB.Close;
    begin
      if FDBConn.Connected then FDBConn.Disconnect;
    end;

    procedure TSIMLazDB.StartTrans;
    begin
      if not FDBConn.InTransaction then FDBConn.StartTransaction;
    end;

    procedure TSIMLazDB.Commit;
    begin
      if FDBConn.InTransaction then FDBConn.Commit;
    end;

    procedure TSIMLazDB.Rollback;
    begin
      if FDBConn.InTransaction then FDBConn.Rollback;
    end;

    procedure TSIMLazDB.SetDBParams(AHostName, ADatabase, AUserID, APassword: string);
    begin
      FDBConn.HostName:= AHostName;
      FDBConn.Database := ADatabase;
      FDBConn.User := AUserID;
      FDBConn.Password := APassword;
    end;

    end.