封装ADO对象
为了简化程序的操作,在使用ADO对象时可以将其封装到类中。这样做的好处是,在程序的不同模块中操作数据库时,只要引用封装类的头文件,就可以使用封装过的ADO对象了。
在这里封装了一个ADO类,该类的主要功能是完成数据库的打开和关闭,以及记录集的打开与关闭操作,ADO类的头文件如下。
class ADO
{
public:
_ConnectionPtr m_pConnection; //连接对象指针
_RecordsetPtr m_pRecordset; //记录集对象指针
public:
ADO();
virtual ~ADO();
void OnInitADOConn(); //连接数据库
_RecordsetPtr& OpenRecordset(CString sql); //打开记录集
void CloseRecordset(); //关闭记录集
void CloseConn(); //关闭数据库连接
UINT GetRecordCount(_RecordsetPtr pRecordset); //获得记录数
};
接下来介绍一下各个成员函数是如何实现的。
(1)首先介绍ADO类中用于连接数据库的成员函数OnInitADOConn,在该函数中调用ADO连接对象的Open方法连接数据库,代码如下。
void ADO::OnInitADOConn()
{
::CoInitialize(NULL); //初始化COM环境
try
{
m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象实例
_bstr_t strConnect="连接语句";
m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库
}
catch(_com_error e) //捕捉错误
{
AfxMessageBox(e.Description()); //弹出错误
}
}
注意:在使用时,需要把加粗部分的“连接语句”换成实际连接数据库的字符串。
(2)OpenRecordset成员函数用来打开记录集,在该函数中调用ADO记录集对象的Open方法打开记录集,代码如下。
_RecordsetPtr& ADO::OpenRecordset(CString sql)
{
ASSERT(!sql.IsEmpty()); //SQL语句不能为空
try
{
m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例
m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(),
adOpenDynamic, adLockOptimistic, adCmdText); //执行SQL得到记录集
}
catch(_com_error e) //捕获可能的异常
{
AfxMessageBox(e.Description()); //弹出错误
}
return m_pRecordset; //返回记录集指针
}
(3)CloseRecordset成员函数用来关闭记录集,代码如下。
void ADO::CloseRecordset()
{
if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态
m_pRecordset->Close(); //关闭记录集
}
(4)CloseConn成员函数用来关闭数据库连接,代码如下。
void ADO::CloseConn()
{
m_pConnection->Close(); //关闭数据库连接
::CoUninitialize(); //释放COM环境
}
(5)GetRecordCount成员函数用于获得记录集中记录的个数,代码如下。
UINT ADO::GetRecordCount(_RecordsetPtr pRecordset)
{
int nCount = 0; //声明保存记录数的变量
try{
pRecordset->MoveFirst(); //将记录集指针移动到第一条记录
}
catch(...) //捕捉可能出现的错误
{
return 0; //产生错误时返回0
}
if(pRecordset->adoEOF) //判断记录集中是否没有记录
return 0; //无记录时返回0
while (!pRecordset->adoEOF) //当记录集指针没有指向最后时
{
pRecordset->MoveNext(); //将记录集指针移动到下一条记录
nCount = nCount + 1; //记录个数的变量加1
}
pRecordset->MoveFirst(); //将记录集指针移动到第一条记录
return nCount; //返回记录数
}