搜尋此網誌

2013/08/20

一個簡單的 Delphi O/R Mapping 工具

一個簡單的 Delphi O/R Mapping 工具。
這裡好像無法上傳檔案,需要者可與我聯絡:

  albertdongtw@gmail.com

或由此下載:

Download

Entity Builder主要的功能在於產生Delphi類別來對映(mapping)既有的資料表。基本上,資料表的欄位會對映到Delphi類別的屬性(property)。但是手動做這些工作是非常辛苦的,所以我們可以使用這個工具程式來建立基本的類別骨架。
執行程式後的啟始畫面。


按下「建立ADO連線」按鈕設定ADO連線。

接著如同使用TADOConnection元件般設定ConnectionString



此時會顯示資料庫與資料表(不含系統資料表)清單。

由資料表清單選擇一個資料表。


按「預覽」按鈕即可顯示產生的程式碼。可按滑鼠右鍵儲存到檔案或是複製到剪貼簿。




  
產生出來的完整程式碼如下:
{-------------------------------------------------------------------------------
This file is generated by EntityBuilder v1.2
provided by Albert Dong, albertdongtw@gmail.com

The Template Engine is from:
    http://sourceforge.net/projects/delphi-templeng/
--------------------------------------------------------------------------------

Class: User
Table: user
Author: XXX
Date: 2013/8/20 下午 07:06:39
Description:
-------------------------------------------------------------------------------}

unit uUser;

interface

uses
  Windows, Messages, SysUtils, Variants, Contnrs, Classes, DB, uEntity;

const
  TBL_User = 'user';

type
  {**
   * Class description.
   *
   * @author XXX, 2013/08/20 19:06:39. Created.
   *}
  TUser = class(TEntity)
  private
    // ------ Fields ------
    FNo: string;
    FName: string;
    FNameEng: string;
    FEmail: string;
    FRecvCalNotify: integer;
    FRecvCalOverdue: integer;
    FIsAdmin: integer;

  protected
    // ------ Property Accessors ------
    function GetNo: string;
    procedure SetNo(value: string);

    function GetName: string;
    procedure SetName(value: string);

    function GetNameEng: string;
    procedure SetNameEng(value: string);

    function GetEmail: string;
    procedure SetEmail(value: string);

    function GetRecvCalNotify: integer;
    procedure SetRecvCalNotify(value: integer);

    function GetRecvCalOverdue: integer;
    procedure SetRecvCalOverdue(value: integer);

    function GetIsAdmin: integer;
    procedure SetIsAdmin(value: integer);


    procedure FillData(DataSet: TDataSet); override;

  public
    // ------ Utility Class Methods ------
    class function ListAll: TList;
    class procedure DeleteAll;

    constructor Create; override;
    destructor Destroy; override;

    function ToString: string; override;

    procedure Reload;
    procedure Insert;
    procedure Update;
    procedure Delete;

  published
    // ------ Properties ------
    property No: string read GetNo write SetNo;
    property Name: string read GetName write SetName;
    property NameEng: string read GetNameEng write SetNameEng;
    property Email: string read GetEmail write SetEmail;
    property RecvCalNotify: integer read GetRecvCalNotify write SetRecvCalNotify;
    property RecvCalOverdue: integer read GetRecvCalOverdue write SetRecvCalOverdue;
    property IsAdmin: integer read GetIsAdmin write SetIsAdmin;
  end;

implementation

uses
  uToString;

{ TUser }

class function TUser.ListAll: TList;
var
  stmt: string;
begin
  stmt := 'SELECT * FROM ' + TBL_User;
  result := TEntity.ExecQueryForList(stmt, TUser);
end;

class procedure TUser.DeleteAll;
begin
  ExecUpdate('DELETE FROM ' + TBL_User);
end;

constructor TUser.Create;
begin
  inherited Create;
  // TODO: Constructor...
end;

destructor TUser.Destroy;
begin
  // TODO: Destructor...
  inherited Destroy;
end;

(**
 * Fill object properties with the specified dataset.
 * Every subclass of TEntity inherits AsXXX() methods.
 *
 * @param DataSet the specified dataset.
 *)
procedure TUser.FillData(DataSet: TDataSet);
begin
  if DataSet = nil then
    raise Exception.Create('Nil DataSet!');

  if DataSet.IsEmpty or DataSet.Eof then
    Exit;

    FNo := AsString(DataSet, 'no');
    FName := AsString(DataSet, 'name');
    FNameEng := AsString(DataSet, 'name_eng');
    FEmail := AsString(DataSet, 'email');
    FRecvCalNotify := AsInteger(DataSet, 'recv_cal_notify');
    FRecvCalOverdue := AsInteger(DataSet, 'recv_cal_overdue');
    FIsAdmin := AsInteger(DataSet, 'is_admin');
end;

procedure TUser.Reload;
var
  stmt: string;
begin
  stmt := 'SELECT * FROM ' + TBL_User
        + ' WHERE 1 = 1 '
        + '   AND no = ' + QuotedStr(No)
    ;

  TEntity.Load(stmt, self);
end;

procedure TUser.Insert;
var
  stmt: string;
begin
  stmt := 'INSERT INTO ' + TBL_User + ' ('

        + 'no'

        + ', name'

        + ', name_eng'

        + ', email'

        + ', recv_cal_notify'

        + ', recv_cal_overdue'

        + ', is_admin'

        + ') VALUES ('

        + QuotedStr(No)

        + ', ' + QuotedStr(Name)

        + ', ' + QuotedStr(NameEng)

        + ', ' + QuotedStr(Email)

        + ', ' + IntToStr(RecvCalNotify)

        + ', ' + IntToStr(RecvCalOverdue)

        + ', ' + IntToStr(IsAdmin)
        + ') '
    ;

  ExecUpdate(stmt);
end;

procedure TUser.Update;
var
  stmt: string;
begin
  stmt := 'UPDATE ' + TBL_User + ' SET '

        + 'no = ' + QuotedStr(No)

        + ', name = ' + QuotedStr(Name)

        + ', name_eng = ' + QuotedStr(NameEng)

        + ', email = ' + QuotedStr(Email)

        + ', recv_cal_notify = ' + IntToStr(RecvCalNotify)

        + ', recv_cal_overdue = ' + IntToStr(RecvCalOverdue)

        + ', is_admin = ' + IntToStr(IsAdmin)

        + ' WHERE 1 = 1 '
        + '   AND no = ' + QuotedStr(No)
    ;

  ExecUpdate(stmt);
end;

procedure TUser.Delete;
var
  stmt: string;
begin
  stmt := 'DELETE FROM ' + TBL_User
      + ' WHERE 1 = 1 '
      + '   AND no = ' + QuotedStr(No)
    ;
  ExecUpdate(stmt);
end;

function TUser.ToString: string;
begin
  TToStringBuilder.toString(self);
end;

function TUser.GetNo: string;
begin
  result := FNo;
end;

procedure TUser.SetNo(value: string);
begin
  if FNo <> value then begin
    FNo := value;
  end;
end;

function TUser.GetName: string;
begin
  result := FName;
end;

procedure TUser.SetName(value: string);
begin
  if FName <> value then begin
    FName := value;
  end;
end;

function TUser.GetNameEng: string;
begin
  result := FNameEng;
end;

procedure TUser.SetNameEng(value: string);
begin
  if FNameEng <> value then begin
    FNameEng := value;
  end;
end;

function TUser.GetEmail: string;
begin
  result := FEmail;
end;

procedure TUser.SetEmail(value: string);
begin
  if FEmail <> value then begin
    FEmail := value;
  end;
end;

function TUser.GetRecvCalNotify: integer;
begin
  result := FRecvCalNotify;
end;

procedure TUser.SetRecvCalNotify(value: integer);
begin
  if FRecvCalNotify <> value then begin
    FRecvCalNotify := value;
  end;
end;

function TUser.GetRecvCalOverdue: integer;
begin
  result := FRecvCalOverdue;
end;

procedure TUser.SetRecvCalOverdue(value: integer);
begin
  if FRecvCalOverdue <> value then begin
    FRecvCalOverdue := value;
  end;
end;

function TUser.GetIsAdmin: integer;
begin
  result := FIsAdmin;
end;

procedure TUser.SetIsAdmin(value: integer);
begin
  if FIsAdmin <> value then begin
    FIsAdmin := value;
  end;
end;


initialization
  // Register this entity class for dynamic loading.
  RegisterClass(TUser);

finalization
  UnRegisterClass(TUser);


end.