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');就可以了,但我觉得这样不是很合理,有的对象属性有几十个,并且有的属性是需要计算才能出来的,不是一下就可以得到的,怎么合理写或者什么时候写这个保存到数据库里面的这个过程,会更好一些,
有哪位高手指点一下这方面的知识?  

解决方案 »

  1.   

    asaler.add('aid','0001');
    asaler.add('aname','张三');
    ...
    //需要计算的计算好后
    asaer.add('计算字段',计算值);
    asaer.Insert;你试着实现一下
      

  2.   

    asaler.Create仅仅是在内存中创建出一个实例,如果要将其持久化则需要用SQL语句来实现
    至于有N个属性的话,可用RTTI来做,简单一句话就是拼写SQL
    随手写一下思路:
    Sale:=TSale.Create
    Sale.name:=...
    Sale.Sex:=..
    Sale.PostData(fnSave,objSale);//该方法是中间层方法,也是拼SQL的过程在objSale中可能有多个属性,不过可用RTTI来解决,即获得该类后用RTTI来获得各属性,再把对象的值赋给各属性即可,最好建一个基类,PostData做为基类的一个抽象方法,每次调用时转型即可~
      

  3.   

    如果还是不清楚的话,建议看一下刘艺的Delphi面向对象编程思想
      

  4.   

    先谢各位了,
    在objSale中可能有多个属性,不过可用RTTI来解决,即获得该类后用RTTI来获得各属性?
       rtti我大概知道是什么意思,但怎样用就不知道怎做了。   byteh能说详细点不?
      

  5.   

    使用构造函数Create仅仅是在内存中创建一个对象实例,并不应该写数据库。假设这样一个使用场景:你需要查询某一个业务员的业绩,这时需要传入一个业务员对象实例作为查询参数之一,那么就需要Create一个业务员对象,但并不是想往数据库中写入任何数据。所以在Create中不应该有写数据库的操作。
    将数据保存至数据库中有两种做法:
    一、定义一个数据存储接口,让TSale类实现此接口;
    二、单独编写一个用于数据存储和获取的类,在此类中实现数据的保存与读取,将要保存的对象作为存储方法的参数。
      

  6.   

    procedure TBaseProxy.ClearObject;
    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;
      

  7.   

    以上例子是用RTTI将类中的某对象属性清空~
    主要用GetPropList,SetPropValue方法
    TBaseProxy为我的基类
      

  8.   

    去看看Bold、ECO之类的O/R Mapping工具
    有现成的实现
      

  9.   

    谢谢各位老大,那个rtti看来一下子学不会,以后再学
      

  10.   

    请教  RTTI 是 什么意思哦???
      

  11.   

    Delphi还没有很好的ORM库,这一点和C++一样。Bold过时太久了,也没有后续支持了,使用起来比较麻烦。ECO是基于.NET框架,Win32用不了。
      

  12.   

    回答10楼:RTTI=Run Time Type Info,运行时类型信息
    关于Delphi中的ORM工具,有一款不错的,NObject O/R Mapping 框架,大家可以到http://www.macrobject.cn/cn/downloads.htm下载试用。