先发布一下源代码ADOConn::ADOConn()
{
}
ADOConn::~ADOConn()
{
}void ADOConn::OnInitADOConn()//连接数据库
{
try
{
m_pCon.CreateInstance("ADODB.Connection");
m_pCon->ConnectionTimeout=3;//连接尝试时间
//连接Access数据库
m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ExamSystem.mdb","","",adModeUnknown);
}
catch(_com_error e)//捕捉异常
{
AfxMessageBox(e.Description());
}
}void ADOConn::ExitConn()//断开连接
{
if(m_pRs!=NULL)
m_pRs->Close();
m_pCon->Close();

}_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)//执行SQL查询语句
{
try
{
if(m_pCon==NULL)
OnInitADOConn();
m_pRs.CreateInstance("ADODB.Recordset");//创建记录集
m_pRs->Open(bstrSQL,m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)//捕捉异常
{
AfxMessageBox(e.Description());
}
return m_pRs;//返回结果集
}BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)//执行SQL操作语句
{
try
{
if(m_pCon==NULL)
OnInitADOConn();//连接数据库
m_pCon->Execute(bstrSQL,NULL,adCmdText);//执行SQL
return true;
}
catch(_com_error e)//捕捉异常
{
AfxMessageBox(e.Description());
return false;
}
}

解决方案 »

  1.   

    这代码是我从《Visual C++ 项目开发案例精粹》里拷贝过来的,下面一个一个函数来问他们其中的问题:
    ADOConn:
    构造函数ADOConn里面为什么没有对两个成员变量初始化成NULL;ExitConn:
    进行完Close方法后应该指向NULL比较恰当;GetRecordSet:
    这也是我测试时候最郁闷的,不加判断的执行m_pRs.CreateInstance,难道这样不会造成内存泄漏?
    我尝试吧这部分改成
    while(1)
            m_pRs.CreateInstance("ADODB.Recordset");//创建记录集
    然后打开任务管理器看内存使用情况(简单的内存泄漏我是这么做的,没用什么其他工具),可是发现并没有出现内存耗尽的情况。刚开始接触ADO的时候就听说_ConnectionPtr、_RecordsetPtr是什么智能指针,使用时候需要初始化,难道用这个CreateInstance初始化过程和平时使用的new方法有什么不同
      

  2.   

    ADO本身就是一些组件的集成,封装的很好,LZ不比在封装,多此一举!给段示例:
    STDMETHODIMP CUserManager::AddMeter(IMeter *pMeter)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState())// TODO: Add your implementation code here
    HRESULT hr;
    CString sql;
    _ConnectionPtr adoConn;
    _RecordsetPtr adoRs1;
    DataCmn::IMeterPtr pTempMeter;
    _variant_t v;if (pMeter == NULL)
    return E_POINTER;
    if (FAILED(hr = pMeter->QueryInterface(__uuidof(IMeter), (void**)&pTempMeter)))
    return E_POINTER;
    try
    {
    hr = adoConn.CreateInstance(__uuidof(Connection));
    hr = adoRs1.CreateInstance(__uuidof(Recordset));
    hr=adoConn->put_ConnectionTimeout(30);
    hr = adoConn->Open((BSTR)m_ConnectionString, L"", L"", adCmdUnspecified); 
    sql= L" Meter ";
    hr = adoRs1->Open((LPCTSTR)sql, (IDispatch *)adoConn, adOpenStatic,adLockOptimistic,adCmdTable);
    hr = adoRs1->AddNew();v = pTempMeter->MeterNo;
    if (v.vt != VT_EMPTY)
    adoRs1->PutCollect(L"MeterNo", v);
    v = pTempMeter->Name;
    if (v.vt != VT_EMPTY)
    adoRs1->PutCollect(L"Name", v);
    v = pTempMeter->UserID;
    if (v.vt != VT_EMPTY)
    adoRs1->PutCollect(L"UserID", v);
    v = pTempMeter->Phase;
    if (v.vt != VT_EMPTY)
    adoRs1->PutCollect(L"Phase", v);
    v = pTempMeter->Ratio;
    if (v.vt != VT_EMPTY)
    adoRs1->PutCollect(L"Ratio", v);
    v = pTempMeter->CapID;
    if (v.vt != VT_EMPTY)
    adoRs1->PutCollect(L"CapID", v);
    v = pTempMeter->Charge;
    if (v.vt != VT_EMPTY)
    adoRs1->PutCollect(L"Charge", v);
    hr = adoRs1->Update();
    hr = adoRs1->Close();adoRs1.Release();
    pTempMeter.Release();
    }
    catch(_com_error e)
    {
    if(e.Description().length()>0)
    return AtlReportError(__uuidof(UserManager), (BSTR)e.Description(), IID_IUserManager, e.Error());
    else
    return AtlReportError(__uuidof(UserManager), e.ErrorMessage(), IID_IUserManager, e.Error());
    }return S_OK;
    }
      

  3.   


    http://www.baidu.com/s?wd=%D6%B1%BD%D3%B5%E3%BB%F7%CD%F8%D6%B7&opt-webpage=on&ie=gbk