FreePascal Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
FreePacal 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

FreePascal 강좌/문서
[5] 라자루스를 이용한 업무 프로그램 개발 - 4
어느좋은날 [freepascal] 673 읽음    2020-06-13 22:41
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.
브리오 [egsuh]   2020-09-15 12:55 X
simlaz_db unit 이 server에서 사용되나요, 아니면 client, 혹은 둘 다?
어느좋은날 [freepascal]   2020-09-15 18:41 X
Server에만 사용 됩니다. ^^
Client에서는 Server를 통해 데이터를 주고 받기 때문에 DB에 접속할 일이 없습니다.

+ -

관련 글 리스트
5 라자루스를 이용한 업무 프로그램 개발 - 4 어느좋은날 673 2020/06/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.