本人刚学习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 ;

}

解决方案 »

  1.   

    ExcuteSQL(CString sql) 中的参数 传引用比较好 
    _variant_t SQL = sql; 
    可以省略了 直接可以用传过来参数  少用一个变量是一个  其他的也可以在精简些吧
      

  2.   

    _variant_t SQL = sql;这句是不能省的,Open()的第一个参数是_variant_t型的变量,省掉之后编译器会报错
      

  3.   

    小建议:
    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;
    }
      

  4.   

    关闭连接只关闭了记录集,没有关闭connection,另外没有释放release
      

  5.   

    关闭connection我已经改了,但是这个release是什么意思,还请指点!!
      

  6.   

    释放资源
    另外关闭记录集和断开连接不能写在一起,两者不是一回事还要考虑初始化com