最近在学习VC环境下使用ADO连接数据库的方法,其中每次连接数据库的时候要创建一个ConnectionPtr的智能指针对象,然后利用Open()函数来打开数据库,下来就是觉得每次调用Open()函数的时候需要设置的参数太多,于是就像自己写一个类,继承原来ADO对象的所有功能,并将其改造成符合自己特殊要求的类,但是不知道在如何来继承,这和普通的类的继承似乎有所不一样,不知道有没有人知道如何做呢?

解决方案 »

  1.   

    没有必要继承ADO的类, 定义一个全局的ConnectionPtr的指针,打开一次以后可以一直用了,程序关闭之后在关闭连接就好了.
      

  2.   

    曾经这样写过个,给LZ参考下头文件
    #pragma once #import "C:\Program Files\Common Files\System\ado\msado20.tlb" rename_namespace("ADODB") rename("EOF","ADOEOF")
    using namespace ADODB;class CDBOperate
    {
    public:
    CDBOperate();
    ~CDBOperate();
    BOOL Open(LPCTSTR szConString);
    BOOL IsOPen();
    VOID Close();
    BOOL ExecuteSQL(LPCTSTR szSQL);
    BOOL GetRecordset(LPCTSTR szSQL, _Recordset** ppRst);
    _ConnectionPtr GetConnection() {return m_pDBCon;}private:
    _ConnectionPtr m_pDBCon;
    };实现文件
    #include "DBOperate.h"CDBOperate::CDBOperate()
    {
    m_pDBCon = NULL;
    }
    CDBOperate::~CDBOperate()
    {
    Close();
    }
    BOOL CDBOperate::Open(LPCTSTR szConString)
    {
    HRESULT hr;
    BOOL bOK(FALSE);
    if(IsOPen())
    {
    Close();
    }

    try
    {
    if(m_pDBCon == NULL)
    {
    hr = m_pDBCon.CreateInstance(__uuidof(Connection));
    if(FAILED(hr))
    {
    goto __Open_END;
    }
    }
    m_pDBCon->PutConnectionTimeout(long(5));
    m_pDBCon->PutCursorLocation(adUseClient);
    hr = m_pDBCon->Open((_bstr_t)szConString, _T(""), _T(""), -1);
    if(SUCCEEDED(hr))
    {
    bOK = TRUE; 
    }
    }
    catch (...)
    {
    goto __Open_END;
    }

    return bOK;__Open_END:
    Close();
    return bOK;
    }
    BOOL CDBOperate::IsOPen()
    {
    BOOL bOpen(FALSE);

    try
    {
    if(m_pDBCon != NULL && (m_pDBCon->State == adStateOpen))
    {
    bOpen = TRUE;
    }
    }
    catch (...)
    {
    NULL;
    } return bOpen;
    }
    VOID CDBOperate::Close()
    {
    try
    {
    if(m_pDBCon != NULL)
    {
    if(m_pDBCon->State == adStateOpen)
    {
    m_pDBCon->Close();
    }
    m_pDBCon = NULL;
    }
    }
    catch (...)
    {
    NULL;
    }
    }
    BOOL CDBOperate::ExecuteSQL(LPCTSTR szSQL)
    {
    BOOL bOK(FALSE); if(IsOPen())
    {
    try
    {
    m_pDBCon->Execute(_bstr_t(szSQL), NULL, adExecuteNoRecords);
    bOK = TRUE;
    }
    catch (...)
    {
    NULL;
    }
    }
    return bOK;
    }
    BOOL CDBOperate::GetRecordset(LPCTSTR szSQL, _Recordset** ppRst)
    {
    BOOL bOK(FALSE);
    if(IsOPen())
    {
    try
    {
    HRESULT hr;
    _RecordsetPtr pRs = NULL;
    hr = pRs.CreateInstance(__uuidof(Recordset));
    if(SUCCEEDED(hr))
    {
    pRs->CursorLocation = adUseClient;
    hr = pRs->Open(_variant_t(szSQL),m_pDBCon.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText);
    if(SUCCEEDED(hr))
    {
    *(ppRst) = pRs; 
    pRs.Detach();
    bOK =TRUE;
    }
    }
    }
    catch (...)
    {
    NULL;
    }
    }
    return bOK;
    }
      

  3.   

    http://www.codeproject.com/database/adoclasses.asp
      

  4.   

    当我们需要同时打开好几个记录集的时候就会发现有必要继承了,首先原始的ADO中的类的参数设置比较多,很多时候我们需要的参数是一样的,而且我们需要用到原始ADO类中的很多方法,如果每个都封装的话,效率就不高了,
    不知四楼的能不能给我发一份,再下不胜感激,只要_ConnectionPtr和_ResultsetPtr的继承类即可。
    [email protected]