接上篇vc++实现反射式数据库模版(3.序列化、反序列化与消息映射)
前三节参照MFC实现了数据模型的序列化工作。这一节就利用ADO完成数据库模版,这里实现增加和查询功能,有兴趣可以自己参照完成删除和更新。
由于查询结果可能是一个集合,这里我们把数据模型设计成链表,只需在基类增加TDObject* m_pNextObject;指向下个数据模型的指针。
参照软件设计原则,我们把业务对象和业务逻辑分开。建立TDLogic做为我们的数据操作模版。
#pragma once
#include"TDObject.h"
//连接字符串
#define CONNECTIONSTRING"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog=TDDataBase;Data Source=."
class TDLogic
{
public:
TDLogic(void);
~TDLogic(void);
//增加数据
bool Insert(TDObject* pObject);
//查询数据,pObject保存查询条件
TDObject* Select(TDObject* pObject);
private:
//ADO
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
};
使用时链接字符串改成自己的,我们这里数据库名为TDDataBase。存在两个表:TDCar与TDPerson。根据各自对应关系完成数据库。
id这里做为自增主键(注意标识规范选择是)。
使用时我们只需要将数据对象传递进去就可以了,十分方便。
//初始化com
CoInitialize(NULL);
//测试
TDPersonp;
p.set_name("小明");
p.set_age(10);
TDCarc;
c.set_name("奔驰");
c.set_price("500000.5");
/*p.show();
c.show();*/
TDLogiclogic;
//增加信息
logic.Insert(&p);
logic.Insert(&c);
//查询信息
PrintSelect(&p);
PrintSelect(&c);
CoUninitialize();
PrintSelect是为了方便封装的一个测试函数,用于显示查询结果,直接看源码就可以了,这里不做解释。
运行结果:
结果不出意外,我们用一个通用的函数实现了对不同数据模型的增加和查询。
使用时我们的只需要创建自己的数据模型类继承TDObject,添加初始化宏,实现宏和初始化成员变量及成员变量映射。
后续优化:这四节简单实现了功能,后续扩展优化空间仍然很大,比如可以通过智能指针替换接收的链表,这样既能防止内存泄漏更加方便操作;TDLogic用单例模式来实现等。这些都需要根据具体功能和习惯自己去研究了。
到这里数据库模版章节已经完了,后续我们会在该基础上继续实现与HTTP服务器的soap交互,从C/S过渡到B/S。
文中测试使用数据库在源码首页,方便添加测试。
源码下载:http://download.youkuaiyun.com/detail/u011736517/9762820