本人刚学习VC下使用ADO操作数据库,现在手头刚好有一个小项目。考虑到该项目操作数据库的部分比较简单,我决定自己封装一个类,来解决常用的数据库操作问题。现将代码贴出来,还请各位高手指点!// dbOperator.h: interface for the CdbOperator class.
//功能:封装数据库的常用操作
//////////////////////////////////////////////////////////////////////#if !defined(AFX_DBOPERATOR_H__2791D318_4608_4F6B_84B6_11A3093C45D7__INCLUDED_)
#define AFX_DBOPERATOR_H__2791D318_4608_4F6B_84B6_11A3093C45D7__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000class CdbOperator
{
public:
CdbOperator();
virtual ~CdbOperator();
void dbConnect(); //数据库连接
void CloseConn(); //关闭连接
void ExcuteSQL(CString sql); //执行SQL语句
public:
_ConnectionPtr m_pConnection; //连接对象
_RecordsetPtr m_pRecordset; //记录集对象
};#endif // !defined(AFX_DBOPERATOR_H__2791D318_4608_4F6B_84B6_11A3093C45D7__INCLUDED_)// dbOperator.cpp: implementation of the CdbOperator class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "DCAG.h"
#include "dbOperator.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif/**********************************************************************
//函数:CdbOperator()
//功能:类的构造函数,创建数据库连接实例
//参数:无
//返回值:无
***********************************************************************/
CdbOperator::CdbOperator()
{
m_pConnection.CreateInstance("ADODB.Connection");
}CdbOperator::~CdbOperator()
{
}/**********************************************************************
函数:ExcuteSQL(CString sql)
功能:执行SQL语句
参数:CString sql;为所要执行的SQL语句
返回值:无
***********************************************************************/
void CdbOperator::ExcuteSQL(CString sql)
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
_variant_t SQL = sql;
try
{
m_pRecordset->Open(SQL, //数据库查询语句
m_pConnection.GetInterfacePtr(),
adOpenDynamic, //动态光标
adLockOptimistic,//乐观锁定方式
adCmdText); //文本命令
}
//COM错误取得,当执行COM功能的时候,如果出错,可以捕捉到_com_error的异常
catch(_com_error e)
{
CATCH_ERROR;
}
}/**********************************************************************
函数:CloseConn()
功能:关闭连接
参数:无
返回值:无
***********************************************************************/
void CdbOperator::CloseConn()
{
try
{
if(m_pRecordset != NULL && m_pRecordset->State !=adStateClosed)
{
m_pRecordset->Close();
}
}
catch(_com_error e)
{
CATCH_ERROR;
}
}/**********************************************************************
函数:dbConnect()
功能:连接数据库
参数:无
返回值:无
***********************************************************************/
void CdbOperator::dbConnect()
{
try
{
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=TAMDDB.mdb;Persist Security Info=FALSE;Jet OLEDB:DataBase Password = source","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
AfxMessageBox("数据库连接失败,确认数据库TAMDDB.mdb是否在当前路径下!");
return ;
}
}
//功能:封装数据库的常用操作
//////////////////////////////////////////////////////////////////////#if !defined(AFX_DBOPERATOR_H__2791D318_4608_4F6B_84B6_11A3093C45D7__INCLUDED_)
#define AFX_DBOPERATOR_H__2791D318_4608_4F6B_84B6_11A3093C45D7__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000class CdbOperator
{
public:
CdbOperator();
virtual ~CdbOperator();
void dbConnect(); //数据库连接
void CloseConn(); //关闭连接
void ExcuteSQL(CString sql); //执行SQL语句
public:
_ConnectionPtr m_pConnection; //连接对象
_RecordsetPtr m_pRecordset; //记录集对象
};#endif // !defined(AFX_DBOPERATOR_H__2791D318_4608_4F6B_84B6_11A3093C45D7__INCLUDED_)// dbOperator.cpp: implementation of the CdbOperator class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "DCAG.h"
#include "dbOperator.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif/**********************************************************************
//函数:CdbOperator()
//功能:类的构造函数,创建数据库连接实例
//参数:无
//返回值:无
***********************************************************************/
CdbOperator::CdbOperator()
{
m_pConnection.CreateInstance("ADODB.Connection");
}CdbOperator::~CdbOperator()
{
}/**********************************************************************
函数:ExcuteSQL(CString sql)
功能:执行SQL语句
参数:CString sql;为所要执行的SQL语句
返回值:无
***********************************************************************/
void CdbOperator::ExcuteSQL(CString sql)
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
_variant_t SQL = sql;
try
{
m_pRecordset->Open(SQL, //数据库查询语句
m_pConnection.GetInterfacePtr(),
adOpenDynamic, //动态光标
adLockOptimistic,//乐观锁定方式
adCmdText); //文本命令
}
//COM错误取得,当执行COM功能的时候,如果出错,可以捕捉到_com_error的异常
catch(_com_error e)
{
CATCH_ERROR;
}
}/**********************************************************************
函数:CloseConn()
功能:关闭连接
参数:无
返回值:无
***********************************************************************/
void CdbOperator::CloseConn()
{
try
{
if(m_pRecordset != NULL && m_pRecordset->State !=adStateClosed)
{
m_pRecordset->Close();
}
}
catch(_com_error e)
{
CATCH_ERROR;
}
}/**********************************************************************
函数:dbConnect()
功能:连接数据库
参数:无
返回值:无
***********************************************************************/
void CdbOperator::dbConnect()
{
try
{
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=TAMDDB.mdb;Persist Security Info=FALSE;Jet OLEDB:DataBase Password = source","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
AfxMessageBox("数据库连接失败,确认数据库TAMDDB.mdb是否在当前路径下!");
return ;
}
}
_variant_t SQL = sql;
可以省略了 直接可以用传过来参数 少用一个变量是一个 其他的也可以在精简些吧
1.关于操作的函数最好用BOOL类型的,外面好判断是否操作成功;
2.在捕获异常的地方最好使用TRACE或者记录日志等;
3.一个小例子:
BOOL CAdoConnection::Connect(LPCTSTR strConnect, long lOptions)
{
m_strConnect = strConnect;
try
{
///创建 Connection 对象---------------------------
HRESULT hr = m_pConnection.CreateInstance(_T("ADODB.Connection"));
if (SUCCEEDED(hr))
{
// 连接数据库---------------------------------------------
if (SUCCEEDED(m_pConnection->Open(strConnect, "", "", lOptions)))
{
return TRUE;
}
}
}
catch (_com_error e)
{
CString str;
str.Format(_T("连接数据库发生错误: %s\n%s\n"), e.ErrorMessage(), (LPTSTR)e.Description());
TRACE(str);
//AfxMessageBox(str);
throw new CAdoException(e);
return FALSE;
}
catch (...)
{
TRACE(_T(":( 连接数据库时发生未知错误:"));
return FALSE;
}
return FALSE;
}
另外关闭记录集和断开连接不能写在一起,两者不是一回事还要考虑初始化com