吵吵   2014-08-05  阅读:1,990

写SQL语句是一个非常枯燥的事情,事实上凡是大量重复的东西,都是非常枯燥的。

因此我们就想到要改变,于是有人就搞出对象关系映射的框架来,Java中的Hibernate就是个活生生的例子。

c#也是不甘落后的,它搞了个EF框架,即Entity framework。

唯独还在Delphi世界里面苦苦挣扎的人,简直就是苦不堪言啊。每增加一张表,就得写每一次insert,update,select的语句,这是个多么苦逼的事情!

自从Delphi2010后,你发现Delphi编译出来的程序越来越大了,为啥会这么大啊,因为增加了一些东西,保存了更多的数据,这个增加的东西是什么呢?就是RTTI。

RTTI-Runtime type information,翻译成中文就是运行时类信息。这些数据信息是非常大的,包含了类的属性,变量,方法等等的信息。

今天只是简单的探讨一下该怎么用,不介入详细的东西,详细的东西,学半年都学不完吧。

1、将一个类插入到表中

function TDMBase.InsertObject(AClass:TObject;ATable:string):Integer;
var
  ctx: TRttiContext;
  t: TRttiType;
  f: TRttiField;
  str:string;

begin
  ctx:=ctx.Create;
  t:= ctx.GetType(AClass.ClassType);
  Self.ClearSQL;
  Self.Table:=ATable;
  for f in t.GetFields do
  begin
    str:= f.GetValue(AClass).ToString;
    if str<>'' then
    BEGIN
      Self.AddInsertField(f.Name,str);
    END;
  end;
  ctx.Free;
  result:=Self.ExecInsert;
end;

2、select 数据,将ADOQuery中的数据填充到一个类中:

function TDMBase.SelectObject(AClass:TClass):TObject;
var
  ctx: TRttiContext;
  t: TRttiType;
  f: TRttiField;
  str:string;
  obj:TObject;
begin
  ctx:=ctx.Create;
  t:= ctx.GetType(AClass);
  obj:=AClass.Create;
  for f in t.GetFields do
  begin
    str:=Self.Str(f.Name);
    f.SetValue(obj,str);

  end;
  ctx.Free;
  result:=obj;
end;

虽然涉及到主键,时间,日期,字段长度等内容还需仔细琢磨,而且远比不上EF框架。

毕竟是不用一点点去写SQL,这就很幸福了!

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

一条回应:“delphi的反射RTTI”

  1. 看SQL语句 也很枯燥啊

发表评论

电子邮件地址不会被公开。 必填项已用*标注