网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > DELPHI > 正文
Delphi2010 RTTI + Attribute 简单实现ORM
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/12
下载{$ArticleTitle}原创论文样式

1、支持ORM,最基础的两个信息是表的信息和字段信息。这两个信息,如果用Attribute 来辅助,代码更简洁和可读性更好。可以把属性名当做真实字段名,也可以将特性里的属性当成真实姓名,再加上字段标题(可以当成注释)、必填字段、是否为主键、显示格式等等,如果没有Attribute ,类、属性的辅助信息必须用其他信息来描述,非常麻烦。
uses
SysUtils, RTTI, TypInfo,Types;
type
Table = class(TCustomAttribute)
private
FName: string;
FTitle: string;
published
public
constructor Create(ATableName, ATitle: string);
property Name: string read FName write FName;
property Title: string read FTitle write FTitle;
end;
FieldInfo = class(TCustomAttribute)
private
FFieldName: string;
FTitle: string;
published
public
constructor Create(AFieldName, ATitle: string);
//字段名
property FieldName: string read FFieldName write FFieldName;
//标题
property Title: string read FTitle write FTitle;
end;

2、有了这两个Attribute,我们必须创建一个解析属性和Attribute的类,并且能解析Insert、update、delete、select等SQL语句。我们姑且叫 TStorable。这个类可以根据需要扩展你所想要的东西。目前只实现了Insert方法,其他的方法,留给勤奋的人去遐想。
TStorable = class
public
//插入SQL语句
function Insert: string;
//获取字段标题
function GetFieldTitle(const AFieldName: string): string;
//设置
//function SetAttributeValue(const PropName, AttributeValue: string): Boolean;
end;
function TStorable.GetFieldTitle(const AFieldName: string): string;
var
Context: TRttiContext;
typ: TRttiType;
A1, A2: TCustomAttribute;
Prop: TRttiProperty;
begin
Context := TRttiContext.Create;
try
typ := Context.GetType(ClassType);
for Prop in typ.GetProperties do
begin
for A2 in Prop.GetAttributes do
begin
if (A2 is FieldInfo) and SameText(FieldInfo(A2).FieldName, AFieldName) then
begin
Result := FieldInfo(A2).Title;
Break;
end;
end;
end;
finally
Context.Free;
end;
end;
function TStorable.Insert: string;
var
Context:TRttiContext;
Prop:TRttiProperty;
typ:TRttiType;
A1,A2:TCustomAttribute;
Sqls,Fields,Values,Value:string;
begin
Context := TRttiContext.Create;
try
Sqls := '''';
Fields := '''';
Values := '''';
typ := Context.GetType(ClassType);
for A1 in typ.GetAttributes do
begin
if A1 is Table then
begin
Sqls := ''Insert Into ''+Table(A1).Name; //获取Insert表名
for Prop in typ.GetProperties do
begin
for A2 in Prop.GetAttributes do
begin
if A2 is FieldInfo then //AHa
begin
Fields := Fields + '',''+ FieldInfo(A2).FieldName ;
// the value of the attribute
Value := Prop.GetValue(Self).ToString;
//根据数据类型对属性值加以编辑
case Prop.GetValue(Self).Kind of
tkString, tkChar, tkWChar, tkWString, tkUString:
Value := QuotedStr(Value);
tkInteger, tkInt64, tkFloat:
Value := Value;
else
Value := QuotedStr(Value);
end;
Values := Values + '','' + Value ;
end; //for A2 in Prop.GetAttributes
end;
end; //enf of for Prop
Delete(Fields,1,1);
Delete(Values,1,1);
Sqls := Sqls + '' ('' + Fields + '') VALUES ('' + Values + '');'';
Result := Sqls;
end; //if A1 is Table then
end; //for A1 in typ.GetAttributes do
finally
Context.Free;
end;
end;
constructor FieldInfo.Create(AFieldName, ATitle: string);
begin
FFieldName := AFieldName;
FTitle := ATitle;
end;
3、有了上面的解析类和SQL基础

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号