用命令模式实现对象存储——对象与关系数据库
2007-12-30 21:37:31 来源:WEB开发网三、编程实现
现以图书管理系统的存储部分为例,选择ACCESS数据库,ADO数据访问模型,C++语言根据上述理论来实现对象存储。
对象存储由三个核心类来协同完成,分别为CEntitySet(实体集)、CEntity(实体对象)和CStorage(存储管理)。CEntity类是所有实体对象的抽象基类。CStorage类调用数据访问模块(ADO),管理与数据库连接,并向应用系统提供对象存储服务。CEntitySet类是参数模板类,它根据查询条件和对象类型,调用ADO访问数据库并生成需要的实体对象集合,并向应用系统提供对象集合访问服务。
图书管理系统中的对象存储结构如图2所示。
图2:对象存储结构图
CEntitySet类部分实现代码。
CEntitySet类是模板类,其类型参数必须是CEntity类的派生类。类声明如下:
template <class T>
四、对象存储模块的使用
class CEntitySet
{
public:
CEntitySet(const CString& strName);
virtual ~CEntitySet(void);
private:
CString m_strEntityName;
CAdoConnection* m_pConn;
vector<T*> m_vecEnt;
CString m_strSQL;
public:
……
BOOL Execute(void); //根据m_strSQL的查询条件,生成符合条件的实体集
T* operator[](int index) const;
int GetSize(void) const;
……
};
CEntitySet类声明中Execute()成员函数的实现代码如下:
template <class T>
BOOL CEntitySet<T>::Execute(void)
{
……
CAdoRecordSet rs(m_pConn);
if(rs.Open(m_strSQL) == -1)
return FALSE;
while(!rs.IsEOF())
{
CEntity* pEntity = new T(m_strEntityName);
ASSERT(pEntity );
if(pEntity == NULL)
{
rs.Close();
return FALSE;
}
if(!pEntity ->Read(&rs))
break;
m_vecEnt.push_back(static_cast<T*>(pEntity));
rs.MoveNext();
}
rs.Close();
return TRUE;
}
CStorage类在应用程序启动时建立并初始化,在应用程序退出前清理。
更多精彩
赞助商链接