基於ADO的VC++數據庫操作類實現

 預先操作:
 【1】在stdafx.h中添加
    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
 【2】在主進程的InitInstance()中添加
         if(!AfxOleInit())
        {
         AfxMessageBox("OLE初始化錯誤");
         return FALSE;
         }

 【3】在.cpp文件中要包含"CPFile.h"
*********************************************************************/

/**//*****************************************************************
CPFile.h
******************************************************************/
class CPData 
{
public:
   
    //默認初始化構造函數
    CPData();
   
    //傳入連接的構造函數
    CPData(_ConnectionPtr pConnection);
   
    //析構函數
    virtual ~CPData();
public:
   
    //連接數據庫
    BOOL Connect(CString strUser,CString strPassword,CString strFileName="ConnectionParam.udl",int nOptions=-1,CString strConStr="Provider=sqloledb.1;Data Source=(local);Database=VLan");
   
    //關閉數據庫的連接
    void DisConnect();
   
    //數據庫查詢語句,用來對數據庫的各種字段進行查詢
    //如果成功返回TRUE,否則返回FALSE.查詢的結果存儲在類的共有成員變量m_pRecordset中
    //查詢結果的行數和列數分別保存在共有成員變量m_nResultRow和m_nResultCol中
    BOOL Select(CString strSql);
   
    //查詢語句,負責對僅僅查詢一個字段的情況進行處理
    //結果存放在CStringArray類型的變量pResult中
    BOOL Select(CString strSql,CStringArray& Result);
   
    //對多個字段進行查詢
    BOOL SelectMulitCol(CString strSql,CStringArray& Result);
   
    //打開表
    BOOL OpenTable(CString strTable);
   
    //打開表
    BOOL OpenTable(CString strTable,CStringArray& Result);
   
    //進行其它的更新操作
    BOOL Execute(CString strSql);
public:
    BOOL ExecuteTrans(CStringArray& aSql);   
   
    //關閉結果集合
    void CloseRecordset();
   
    //得到操作結果的列數
    long GetResultCol();
   
    //得到操作結果的條數
    long GetResultRow();
   
    //得到操作結果
    _RecordsetPtr GetResult();
private:
   
    //數據庫操作返回的結果條數
    long m_nResultRow;
   
    //返回的_RecordsetPtr中列數
    long m_nResultCol;
   
    //連接指針
    _ConnectionPtr m_pConnection;
   
    //命令執行指針
    _CommandPtr m_pCommand;
   
    //結果集指針
    _RecordsetPtr m_pRecordset;
};

/**//**************************************************************
CPFile.cpp
**************************************************************/

/**///////////////////////////////////////////////////////////////////////
// 構造函數
/**///////////////////////////////////////////////////////////////////////
//默認的構造函數
CPData::CPData()
{
    //初始化
    m_nResultRow = 0;
    m_nResultCol=0;
    m_pConnection = NULL;
    //創建對象
    m_pRecordset.CreateInstance(_uuidof(Recordset));
    m_pCommand.CreateInstance(_uuidof(Command));
}

//傳入參數的構造函數
CPData::CPData(_ConnectionPtr pConnection)
{
    m_pConnection = pConnection;
    m_nResultRow = 0;
    m_nResultCol=0;
    //創建對象
    m_pRecordset.CreateInstance(_uuidof(Recordset));
    m_pCommand.CreateInstance(_uuidof(Command));
   
}
/**///////////////////////////////////////////////////////////////////////
// 析構函數
/**///////////////////////////////////////////////////////////////////////
CPData::~CPData()
{
    if(m_pRecordset->State!=adStateClosed)
        m_pRecordset->Close();
    m_pRecordset = NULL;

    if(m_pCommand->State!=adStateClosed)
        m_pCommand->Release();
    m_pCommand = NULL;

    if(m_pConnection->State!=adStateClosed)
        m_pConnection->Close();
    m_pConnection = NULL;
}

/**//////////////////////////////////////////////////////////////////////
///簡單操作函數
////////////////////////////////////////////////////////////////////

//得到操作結果的行數
long CPData::GetResultRow()
{
    return this->m_nResultRow;
}

//得到操作結果的列數
long CPData::GetResultCol()
{
    return this->m_nResultCol;
}

//得到操作結果
_RecordsetPtr CPData::GetResult()
{
    return this->m_pRecordset;
}

/**////////////////////////////////////////////////////////////////////////
///連接操作
///////////////////////////////////////////////////////////////////////

//連接到數據庫
//1.連接字符串可以自己構造,也可以從文件中讀出
BOOL CPData::Connect(CString strUser,CString strPassword,CString strFileName,int nOptions,CString strConStr)
{
    try{
        m_pConnection.CreateInstance(__uuidof(Connection));
        HRESULT hr;
        //如果用文件方式配置數據源,進行配置
        if(strFileName.Compare("")!=0&&CPFile::IsFileExist(strFileName))
        {
            CString con = "File Name="+strFileName;
            m_pConnection->ConnectionString =(_bstr_t)con;
            hr=m_pConnection->Open("","","",nOptions);   
        }
        else
        {
            //自己配置連接字符串
            m_pConnection->ConnectionString = (_bstr_t)strConStr;
            hr=m_pConnection->Open("",_bstr_t(strUser),_bstr_t(strPassword),nOptions); 
        }
        //進行連接
        //連接失敗
        if(FAILED(hr))
        {  
            AfxMessageBox("連接失敗!");
            return FALSE;
        }
    }
    catch(_com_error&e)
    {
        AfxMessageBox(e.Description()+"B");
        return FALSE;
    }
    return TRUE;
}

//斷開連接
void CPData::DisConnect()
{
    if(m_pConnection->State!=adStateClosed)
        m_pConnection->Close();
}

/**////////////////////////////////////////////////////////////////////////
///更新操作
///////////////////////////////////////////////////////////////////////
BOOL CPData::Execute(CString strSql)
{
    try
    {
        _variant_t vNULL;
        vNULL.vt = VT_ERROR;
       
        /**////定義爲無參數
        vNULL.scode = DISP_E_PARAMNOTFOUND;
       
        /**////非常關鍵的一句,將建立的連接賦值給它
        m_pCommand->ActiveConnection = m_pConnection;
       
        /**////命令字串
        m_pCommand->CommandText = (_bstr_t)strSql;
       
        /**////執行命令,取得記錄集
        m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
       
        //確實,vNULL中的intVal是執行操作所影響的行數
        m_nResultRow = 0;
        m_nResultRow = vNULL.intVal; 
    }
    catch(_com_error&e)
    {
        m_nResultRow = 0; 
        return FALSE;
    }
    return TRUE;
}

/**////////////////////////////////////////////////////////////////////////
///查詢操作
///////////////////////////////////////////////////////////////////////
BOOL CPData::Select(CString strSql)
{
    try
    {
        m_nResultCol=0;
        m_nResultRow=0; 
        m_pRecordset->CursorLocation=adUseClient;    //設置遊標位置,設置爲客戶端形式,否則GetRecordCount()返回值不對
        m_pRecordset->Open(_variant_t(strSql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
        m_nResultCol = m_pRecordset->Fields->GetCount();//得到查詢結果的列數
        m_nResultRow = m_pRecordset->GetRecordCount();  //得到查詢結果的行數
    }
    catch(_com_error&e)
    { 
        AfxMessageBox(e.Description()+"D");
        return FALSE;
    }
    return TRUE;
}

//查詢語句,負責對僅僅查詢一個字段的情況進行處理
//結果存放在CStringArray類型的變量pResult中
BOOL CPData::Select(CString strSql,CStringArray& Result)
{
    if(Select(strSql)!=0)
    {
        Result.RemoveAll();
        for(int i=0;i<m_nResultRow;i++)
        {
            _variant_t value;
            value=m_pRecordset->Fields->Item[(long)0]->Value;  
            if(value.vt==3||value.vt==14)
            {
                CString strTrans;
                strTrans.Format("%ld",value.intVal);
                Result.Add(strTrans);
            }
            else
                Result.Add(value.bstrVal);//
            m_pRecordset->MoveNext();
        }
        m_pRecordset->Close();
        return TRUE;
    }
    else
    {
        m_pRecordset->Close();
        return FALSE;
    }
}

BOOL CPData::SelectMulitCol(CString strSql,CStringArray& Result)
{
    if(Select(strSql)!=0)
    {
        Result.RemoveAll();
        _variant_t value;
        for(int i=0;i<m_nResultRow;i++)
        {  
            for(int j=0;j<m_nResultCol;j++)
            {
                value=m_pRecordset->Fields->Item[(long)(/**//*i*m_nResultCol+*/j)]->Value;
                if(value.vt==3||value.vt==14)
                {
                    CString strTrans;
                    strTrans.Format("%ld",value.intVal);
                    Result.Add(strTrans);
                }
                else
                    if(value.vt==7)
                    {
                        COleDateTime time = value.date;
                        CString strTemp;
                        strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
                        Result.Add(strTemp);
                    }
                    else
                        Result.Add(value.bstrVal);//
            }
            m_pRecordset->MoveNext();
        }
        m_pRecordset->Close();
        return TRUE;
    }
    else
    {
        m_pRecordset->Close();
        return FALSE;
    }
}

//打開整張表
BOOL CPData::OpenTable(CString strTable)
{
    try
    {
        m_nResultCol=0;
        m_nResultRow=0; 
        m_pRecordset->CursorLocation=adUseClient;    //設置遊標位置,設置爲客戶端形式,否則GetRecordCount()返回值不對
        m_pRecordset->Open(_variant_t(strTable),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdTable);
        m_nResultCol = m_pRecordset->Fields->GetCount();//得到查詢結果的列數
        m_nResultRow = m_pRecordset->GetRecordCount();  //得到查詢結果的行數
    }
    catch(_com_error&e)
    { 
        AfxMessageBox(e.Description()+"E");
        return FALSE;
    }
    return TRUE;
}

BOOL CPData::OpenTable(CString strTable,CStringArray& Result)
{
    if(OpenTable(strTable)!=0)
    {
        Result.RemoveAll();
        _variant_t value;
        for(int i=0;i<m_nResultRow;i++)
        {  
            for(int j=0;j<m_nResultCol;j++)
            {
                value=m_pRecordset->Fields->Item[(long)(/**//*i*m_nResultCol+*/j)]->Value;
                if(value.vt==3||value.vt==14)
                {
                    CString strTrans;
                    strTrans.Format("%ld",value.intVal);
                    Result.Add(strTrans);
                }
                else
                    if(value.vt==7)
                    {
                        COleDateTime time = value.date;
                        CString strTemp;
                        strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
                        Result.Add(strTemp);
                    }
                    else
                        Result.Add(value.bstrVal);//
            }
            m_pRecordset->MoveNext();
        }
        m_pRecordset->Close();
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

/**//////////////////////////////////////////////////////////////////////////////
///關閉結果集
/////////////////////////////////////////////////////////////////////////////
void CPData::CloseRecordset()
{
    if(m_pRecordset->State != adStateClosed)
        m_pRecordset->Close();
}
BOOL CPData::ExecuteTrans(CStringArray& aSql)
{
    try{
        int nNum = aSql.GetSize();
        m_pConnection->BeginTrans();
        for(int i=0;i<nNum;i++)
        {
            CString strSql = aSql.GetAt(i); 
            m_pConnection->Execute((_bstr_t)aSql.GetAt(i),NULL,adCmdText);
        }
        m_pConnection->CommitTrans();
        return TRUE;
    }
    catch(_com_error& e)
    {
        m_pConnection->RollbackTrans(); 
        AfxMessageBox(e.Description()+"F");
        return FALSE;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章