Tsaler=class(object)//业务员对象
Fid:string;//编号
Fname:string;//姓名
Fmobil:string//手机
constructor create(id,name,mobile:string);
end
将这个对象的数保存至数据库什么时候,用什么样的方法才合理?
在这个对象建立以后就保存,将保存的过程写在create里面?
constructor create(id,name,mobitel:string)
begin
Fid:=id;
fname:=name;
fmobitel:=tel;
with adoquery1 do //当然以下的过程可以是单独的另外一个方法,
beign
append;
fieldybname('id').value:=fid;
....
post
end;
end;
以后只要,asaler.create('0001','张三','13900002');就可以了,但我觉得这样不是很合理,有的对象属性有几十个,并且有的属性是需要计算才能出来的,不是一下就可以得到的,怎么合理写或者什么时候写这个保存到数据库里面的这个过程,会更好一些,
有哪位高手指点一下这方面的知识?
Fid:string;//编号
Fname:string;//姓名
Fmobil:string//手机
constructor create(id,name,mobile:string);
end
将这个对象的数保存至数据库什么时候,用什么样的方法才合理?
在这个对象建立以后就保存,将保存的过程写在create里面?
constructor create(id,name,mobitel:string)
begin
Fid:=id;
fname:=name;
fmobitel:=tel;
with adoquery1 do //当然以下的过程可以是单独的另外一个方法,
beign
append;
fieldybname('id').value:=fid;
....
post
end;
end;
以后只要,asaler.create('0001','张三','13900002');就可以了,但我觉得这样不是很合理,有的对象属性有几十个,并且有的属性是需要计算才能出来的,不是一下就可以得到的,怎么合理写或者什么时候写这个保存到数据库里面的这个过程,会更好一些,
有哪位高手指点一下这方面的知识?
asaler.add('aname','张三');
...
//需要计算的计算好后
asaer.add('计算字段',计算值);
asaer.Insert;你试着实现一下
至于有N个属性的话,可用RTTI来做,简单一句话就是拼写SQL
随手写一下思路:
Sale:=TSale.Create
Sale.name:=...
Sale.Sex:=..
Sale.PostData(fnSave,objSale);//该方法是中间层方法,也是拼SQL的过程在objSale中可能有多个属性,不过可用RTTI来解决,即获得该类后用RTTI来获得各属性,再把对象的值赋给各属性即可,最好建一个基类,PostData做为基类的一个抽象方法,每次调用时转型即可~
在objSale中可能有多个属性,不过可用RTTI来解决,即获得该类后用RTTI来获得各属性?
rtti我大概知道是什么意思,但怎样用就不知道怎做了。 byteh能说详细点不?
将数据保存至数据库中有两种做法:
一、定义一个数据存储接口,让TSale类实现此接口;
二、单独编写一个用于数据存储和获取的类,在此类中实现数据的保存与读取,将要保存的对象作为存储方法的参数。
var
PTI: PTypeInfo;
Tinfo: TPropInfo;
List: TPropList;
i,j : integer;
ttinfo: TTypeinfo;
oPropertyList: PPropList;
clNm: TPersistent;
begin oPropertyList := @List;
PTI:= Self.ClassInfo;//获得类名 j:= GetPropList(PTI,[ tkInteger, tkChar, tkEnumeration, tkFloat,
tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString,
tkVariant, tkArray, tkRecord, tkInterface, tkInt64, tkDynArray],
oPropertyList);//将该类的Published属性加入oPropertyList列表中 for i:= 0 to j do
if assigned(oPropertyList[i]) then
begin Tinfo:= oPropertyList[i]^;//循环列表 ttinfo:=tinfo.PropType^^; if (UPPERCASE(Tinfo.Name) <> 'NAME') and (UPPERCASE(Tinfo.Name) <> 'TAG') then
if UPPERCASE(Tinfo.Name) <> 'ORDERID' then
case ttinfo.kind of
tkString: SetPropValue(Self,Tinfo.Name,'');//为每种类型的属性赋初值
tkFloat: SetPropValue(Self,Tinfo.Name,0);
tkInteger: SetPropValue(Self,Tinfo.Name,0);
tkInt64: SetPropValue(Self,Tinfo.Name,0);
tkChar: SetPropValue(Self,Tinfo.Name,0);
tkWChar: SetPropValue(Self,Tinfo.Name,'');
tkWString: SetPropValue(Self,Tinfo.Name,'');
tkLString: SetPropValue(Self,Tinfo.Name,'');
tkEnumeration: SetPropValue(Self,Tinfo.Name,False);
else clNm := TPersistent(GetObjectProp(Self, tInfo.Name)); if clNm is TCollection then
TCollection(clNm).Clear; if clNm is TFastOwnedCollection then
TFastCollection(clNm).Clear; if clNm is TBaseProxy then
TBaseProxy(clNm).ClearObject;
end; end;end;
主要用GetPropList,SetPropValue方法
TBaseProxy为我的基类
有现成的实现
关于Delphi中的ORM工具,有一款不错的,NObject O/R Mapping 框架,大家可以到http://www.macrobject.cn/cn/downloads.htm下载试用。