CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  语言基础/算法/系统设计

Delphi下多层数据访问方案的可行性(up者有分)

楼主clonalman(克隆人)2006-03-02 23:46:01 在 Delphi / 语言基础/算法/系统设计 提问

1、     数据连接层(Data   Connection)  
   
  支持事务,连接池管理,返回统一操作接口:IProviderSupport  
  (Borland就是这么干的)  
   
  (支持多数据库操作,建议使用dbExpress或其他实现IProviderSupport的数据集)  
   
  IDataConn   =   Iinterface  
   
      StartTransaction;  
   
      EndTransaction(Commit:   Boolean);  
   
      LockPS:   IproviderSupport;  
   
      UnLockPS:   IproviderSupport;    
   
  end;  
   
  2、     数据映射层(SQL   Mapping)  
   
        支持事务,分析XML文件,管理SQL生成对象,返回3个操作接口:  
   
        IQuery、IColumn、IConstraint   (参考www.db4o.com的接口设计)  
   
        XML文件:带有SQL标识、数据库信息和UI显示信息  
   
         
   
        IDataQuery   =   IInterface  
   
      StartTransaction;  
   
              EndTransaction(Commit:   Boolean);  
   
              CreateQuery(const   Name:   string):   IQuery;  
   
        End;  
   
     
   
  IQuery:SQL生成对象实现该接口  
   
  IQuery   =   IInterface  
   
      Constrain(const   column:   string):   IConstriant;  
   
      ExecQuery:   OleVariant;  
   
  end  
   
  IQuery   =   IInterface  
   
      Constrain(const   column:   string):   IConstraint  
   
  end  
   
         
   
  IColumn:  
   
  通过这个接口可设置聚合字段  
   
         
   
        IConstraint:  
   
            模拟Where语句,   通过IConstraint嵌套来实现条件语句的嵌套  
   
         
   
        IConstraint   =   IInterface  
   
              //比较操作符  
   
  AsEQ:   IConstraint;   //等于  
   
  AsNQ:   IConstraint;   //不等于  
   
  AsGT:   IConstraint;   //大于  
   
  AsLT:   IConstraint;   //小于  
   
  AsGQ   IConstraint;   //大于等于  
   
  AsLQ   IConstraint;   //小于等于  
   
  AsLike:   IConstraint;   //模糊查询  
   
  //约束值  
   
  Constrain(Value:   Olevariant):   IConstraint;  
   
  //连接操作符  
   
  WithAnd(const   column:   string):   IConstraint;  
   
  WithOr(const   column:   string):   IConstraint;  
   
        end  
   
     
   
         
   
        例子:  
   
  var   q:   IQuery  
   
     
   
  aaa=1   and   bbb>2  
   
  q.   Constrain(‘aaa’).   Constrain(1).WithAnd(‘bbb’).   Constrain(2).AsGT  
   
     
   
  (aaa=1   or   bbb>2)   and   ccc   like   ‘%ccc’  
   
  q.   Constrain(‘aaa’).   Constrain(1).WithOr(‘bbb’).   Constrain(2).AsGT  
   
  q.Constrain(‘ccc’).   Constrain(‘%ccc’).AsLike;  
   
     
   
  3、     数据访问层(DAO)  
   
  3.1   返回IQuery接口,查询数据集  
   
  3.2   以业务对象(BO)为参数进行增加、删除、修改  
   
  IEntityDAO   =   IInterface  
   
        Insert(bo:   TBizObject);  
   
        Delete(bo:   TBizObject);  
   
        Update(bo:   TBizObject);  
   
        CreateQuery(boClass:   TBizObjectClass):   IQuery;  
   
        Query(IQuery):   OleVariant;  
   
  End;  
   
  4、     业务层(BO):需要带有SQL标识,以后获得该标识所带的SQL生成对象  
   
  TbizObject   =   class  
   
      …  
   
      constructor   Create   (const   Value:   OleVariant);   overload;’  
   
      constructor   Create   (const   DataSet:   TDataSet);   overload;  
   
  Public  
   
      Class   function   MapName:   string;   varitul;  
   
  End;  
   
  TReservation   =   class(TBizObject);  
   
      ….  
   
  Public  
   
      Class   function   MapName:   string;   override;  
   
      Perperty   State:   Integer;   //未到/已到/取消  
   
      Procedure   ToReception(Rec:   TReception);  
   
  End;  
   
  TReception   =   class(TBizObject);  
   
      ….  
   
  Public  
   
      Class   function   MapName:   string;   override;  
   
  End;  
   
     
   
     
   
     
   
  举例:  
   
  var    
   
  DQ:   IdataQuery;  
   
      DAO:   IEntityDAO;  
   
      Res:   Treservation;  
   
      Rec:   Treception  
   
      Query:   IQuery;  
   
      DataSet   :=   TdataSet;  
   
     
   
  查询今日将到的预定单  
   
     
   
  DAO   :=   TEntityDAO.Create;  
   
     
   
  Query   :=   DAO.CreateQuery(TReservation)  
   
  Query.Constrian(‘arrive_dt’).Constrain(Date);   //今日将到  
   
  DataSet   :=   Query.Execute;    
   
     
   
  预定转接待(事务、业务对象持久化)  
   
     
   
      DAO   :=   TEntityDAO.Create;  
   
  Res   :=   TReservation.Create(‘RS000001’)  
   
  Try  
   
      Rec   :=   TRception.Create;  
   
      try  
   
  //将预定单置为已到  
   
  Res.State   :=   1;    
   
     
   
  //预定转接待  
   
  Res.ToReception(Rec)  
   
     
   
  //数据库持久化,需要事物  
   
  DQ   :=   TdataQuery.Create;  
   
  DQ.   StartTransaction;   //开始事物  
   
  Try  
   
  DAO.Update(Res);   //修改预定单  
   
  DAO.Insert(Rec);   //插入接待单  
   
                      DQ.EndTransaction(True);//提交事物  
   
  except  
   
  DQ.   EndTransaction(False);   //回滚事物  
   
  end;  
   
     
   
  Finally;  
   
      Rec.Free;  
   
  End;  
   
  Finally  
   
  Res.Free;  
   
  End;  
   
       
   
  预定单超时取消(事务、查询、批量业务对象持久化)  
   
     
   
  DAO   :=   TEntityDAO.Create;  
   
     
   
  Query   :=   DAO.CreateQuery(TReservation)  
   
  Query.Constrian(‘arrive_dt’).Constrain(Date).AsLT;  
   
  DataSet   :=   Query.ExecQuery;  
   
     
   
  Res   :=   TReservation.Create(DataSet)  
   
  Try  
   
      DQ   :=   TdataQuery.Create;  
   
      Try  
   
            DQ.   StartTransaction;   //开始事物  
   
          while   not   DataSet.eof   do  
   
          begin  
   
                    Res.State:=   2;   //预定取消  
   
                  DAO.Update(Res);   //持久化  
   
                  DataSet.Next;  
   
            end;  
   
          DQ.EndTransaction(True);//提交事物  
   
      except  
   
            DQ.   EndTransaction(False);   //回滚事物  
   
      end;  
   
  finally  
   
      Res.free;  
   
  end;    
   
  问题点数:100、回复次数:7Top

1 楼yxsoft()回复于 2006-03-03 05:11:25 得分 14

看不懂,帮UPTop

2 楼lovendII(流氓都做了城管)回复于 2006-03-03 08:32:30 得分 14

up有分就帮你upTop

3 楼clasj(★知我☆)回复于 2006-03-04 20:57:39 得分 14

upTop

4 楼zhangl_cn(和尚-修行)回复于 2006-03-04 22:50:09 得分 14

也UP一下吧Top

5 楼saien(精益求精)回复于 2006-03-04 23:36:41 得分 14

好像还可以!Top

6 楼zhaoshengui(之无)回复于 2006-03-06 13:41:25 得分 15

vupTop

7 楼zhaolinzeng(超领)回复于 2006-03-06 14:00:07 得分 15

up!Top

相关问题

  • 老问题,提方案,远程数据访问
  • delphi数据访问控件的Bug,该如何办?
  • 100分寻求可行性方案
  • ***高分求证方案的可行性***
  • Delphi新手:在不使用ADO控件的情况下如何用ADO进行数据访问?
  • 数据访问问题
  • 多数据访问问题
  • 试讨论手机病毒植入可行性方案!
  • 关于word的开发,这种方案的可行性。
  • 简单的数据库问题,只要给出可行性方案就给分!!!

关键词

  • 接口
  • 预定
  • 数据库
  • 数据
  • sql
  • iprovidersupport
  • treservation
  • iquery
  • iconstraint
  • treception

得分解答快速导航

  • 帖主:clonalman
  • yxsoft
  • lovendII
  • clasj
  • zhangl_cn
  • saien
  • zhaoshengui
  • zhaolinzeng

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo