Delphi下多层数据访问方案的可行性(up者有分)
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




