看到近期很多人都在讨论Delphi的OO数据库开发,我也来凑凑热闹。
昨天一个上午看来看关于O/R Mapping 的介绍,都是用Java描述的,少数用c#描述的,就是没有Delphi的,于是乎我大胆写了下面的代码。如果把下面的代码中的那些的配置工作放到XML文件中,再使用delphi里边的反射机制(在Delphi里是RTTI吧?)作出来的是不是就是 O/R Mapping 了?
Kao,现在最多只能放100分了,那大家多多光临我的小站吧:
http://lincosoft.go.nease.net基础类代码
type
  TORBase = class(TObject)
  private
    FDataSet: TDataSet;
    procedure FSetDataSet(AValue: TDataSet);
    function FGetRecordCount: integer;
  public
    constructor Create;
    destructor Destroy;override;
    procedure Setter(AName: string;AValue: Variant);virtual;
    function Getter(AName: string): Variant;virtual;
    procedure Connnect;virtual;
    procedure Insert;virtual;//添加记录
    procedure Delete;virtual;//删除记录
    procedure First;virtual;//第一条记录
    procedure Last;virtual;//最后一条记录
    procedure Next;virtual;//下一条记录
    procedure Prior;virtual;//前一条记录
    procedure Post;virtual;//保存记录
    procedure Cancel;virtual;
  published
    property DataSet: TDataSet read FDataSet write FSetDataSet;
    property RecordCount: Integer read FGetRecordCount;
  end;implementationconstructor TORBase.Create;
begin
  FDataSet := TDataSet.Create(nil);
end;destructor TORBase.Destroy;
begin
  inherited;
  FDataSet.Free;
end;procedure TORBase.FSetDataSet(AValue: TDataSet);
begin
  FDataSet := AValue;
end;function TORBase.FGetRecordCount: Integer;
begin
  result := FDataSet.RecordCount;
end;procedure TORBase.Setter(AName: string;AValue: Variant);
begin
  FDataSet.FieldByName(AName).AsVariant := AValue;
end;function TORBase.Getter(AName: string): Variant;
begin
  result := FDataSet.FieldByName(AName).AsVariant;
end;procedure TORBase.Connnect;
begin
  FDataSet.Open;
end;procedure TORBase.Insert;
begin
  FDataSet.Insert;
end;procedure TORBase.Delete;
begin
  FDataSet.Delete;
end;procedure TORBase.First;
begin
  FDataSet.First;
end;procedure TORBase.Last;
begin
  FDataSet.Last;
end;procedure TORBase.Next;
begin
  FDataSet.Next;
end;procedure TORBase.Prior;
begin
  FDataSet.Prior;
end;procedure TORBase.Post;
begin
  FDataSet.Post;
end;procedure TORBase.Cancel;
begin
  FDataSet.Cancel;
end;基类
type
  TORBase = class(TObject)
  private
    FDataSet: TDataSet;
    procedure FSetDataSet(AValue: TDataSet);
    function FGetRecordCount: integer;
  public
    constructor Create;
    destructor Destroy;override;
    procedure Setter(AName: string;AValue: Variant);virtual;
    function Getter(AName: string): Variant;virtual;
    procedure Connnect;virtual;
    procedure Insert;virtual;//添加记录
    procedure Delete;virtual;//删除记录
    procedure First;virtual;//第一条记录
    procedure Last;virtual;//最后一条记录
    procedure Next;virtual;//下一条记录
    procedure Prior;virtual;//前一条记录
    procedure Post;virtual;//保存记录
    procedure Cancel;virtual;
  published
    property DataSet: TDataSet read FDataSet write FSetDataSet;
    property RecordCount: Integer read FGetRecordCount;
  end;implementationconstructor TORBase.Create;
begin
  FDataSet := TDataSet.Create(nil);
end;destructor TORBase.Destroy;
begin
  inherited;
  FDataSet.Free;
end;procedure TORBase.FSetDataSet(AValue: TDataSet);
begin
  FDataSet := AValue;
end;function TORBase.FGetRecordCount: Integer;
begin
  result := FDataSet.RecordCount;
end;procedure TORBase.Setter(AName: string;AValue: Variant);
begin
  FDataSet.FieldByName(AName).AsVariant := AValue;
end;function TORBase.Getter(AName: string): Variant;
begin
  result := FDataSet.FieldByName(AName).AsVariant;
end;procedure TORBase.Connnect;
begin
  FDataSet.Open;
end;procedure TORBase.Insert;
begin
  FDataSet.Insert;
end;procedure TORBase.Delete;
begin
  FDataSet.Delete;
end;procedure TORBase.First;
begin
  FDataSet.First;
end;procedure TORBase.Last;
begin
  FDataSet.Last;
end;procedure TORBase.Next;
begin
  FDataSet.Next;
end;procedure TORBase.Prior;
begin
  FDataSet.Prior;
end;procedure TORBase.Post;
begin
  FDataSet.Post;
end;procedure TORBase.Cancel;
begin
  FDataSet.Cancel;
end;业务实体类  TPerson = class(TORBase)
  public
    procedure Set_Name(AValue: string);
    function Get_Name: string;
  published
    property Name: string read Get_Name write Set_Name;
  end;
procedure TPerson.Set_Name(AValue: string);
begin
  Setter('Name',AValue);
end;function TPerson.Get_Name: string;
begin
  result := Getter('Name');
end;界面:procedure TForm1.FormCreate(Sender: TObject);
begin
  FPerson := TPerson.Create;
  FPerson.DataSet := ADOTable1;
  FPerson.Connnect;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  FPerson.Next;
  Edit1.Text := FPerson.Name;
end;procedure TForm1.FormDeactivate(Sender: TObject);
begin
  FPerson.Free;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  FPerson.Prior;
  Edit1.Text := FPerson.Name;
end;

解决方案 »

  1.   

    这么写一个class还可以,不过不知道符合文档不,我现在负责delphi的一个项目和vc的6个class,比较麻烦啊
      

  2.   

    虽然个人对DB的O化没有很多的认识,但是觉得不应该只是把DataSet封装一遍而已。因为对于数据库的应用来说,数据的建模要比在程序中的封装来的重要。对于多数的数据库应用程序来说,DB的O化与否其实并没有多少实质上的区别。个人认为DB的O化的意义在于淡化DB的R关系,让应用程序开发者摆脱那些繁琐的数据有效性校验,数据库连接管理,甚至权限管理等细节,能够像使用一个普通对象一样操作数据库中的一系列数据(注意是一系列,不一定是某一个表格或某一条记录)。所以个人认为对于中型以下的Delphi数据库应用来说,DB的O化并没有太大的意义。但是,如果你要做一个给最终用户用的脚本引擎或者干脆就是一个数据库的开发工具的话,DB的O化就能给你的产品带来无穷的价值。
      

  3.   

    呵呵, 其实他的TORBase已经用到模式了, 可能是自己还不知道吧!