• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 封裝ADO訪問數據庫的兩個類

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    對于初學者,使用ADO訪問 數據庫 的時候,涉及到各種數據類型轉換,可能有一些難度,我試圖封裝了ADO訪問數據庫,使其更方便的用現有的VC的數據類型,更加方便的使用ADO操作數據庫。 下面分別提供兩個封裝ADO數據庫訪問的類,一個是數據庫的連接類,一個是數
        對于初學者,使用ADO訪問數據庫的時候,涉及到各種數據類型轉換,可能有一些難度,我試圖封裝了ADO訪問數據庫,使其更方便的用現有的VC的數據類型,更加方便的使用ADO操作數據庫。
    下面分別提供兩個封裝ADO數據庫訪問的類,一個是數據庫的連接類,一個是數據庫字段訪問的類。

       在連接類中,大家可以看到,連接類中并沒有Recordset的成員變量,因為這樣的,在整個數據庫應用程序中,數據庫的連接一般一個就夠了,而同時打開的Reocordset則可能不只一個,所以,如果兩個在同一個類里,那么,如果要同時打開兩個記錄集,需要建立類的兩個實例,就是需要同時打開兩個數據庫連接,如果對于連接的是同一個數據庫,同時打開兩個連接的話,意味著資源的不必要的浪費。

       數據庫字段訪問類,簡化了,獲取數據庫字段內容的操作,避免了數據類型轉換的麻煩。

       兩個類都對錯誤處理進行了較多的考慮,在訪問數據庫中,如果沒有錯誤處理,其害處是顯而易見的。




    #ifndef _BBADOCONNECT_H
    #define _BBADOCONNECT_H

    //
    // ADO訪問數據庫類
    // 軟件環境:需要MSADO15.DLL
    // 作者:鄧振波
    // 2001.4.20
    // Email:bozi@china.com
    // 說明:封裝了ADO使用的操作函數和ADO訪問數據庫錯誤處理
    //  使在VC上方便的使用ADO訪問數據庫
    // 包括:ADO連接數據庫、打開記錄集、執行SQL、以及
    //  事務處理、ADO記錄集內容轉換成C++的常用數據類型(CString、char,long,float等)
    //
    // 使用:1。定義一個CBBAdoConnection實例:CBBAdoConnection m_adoConn;
    //  2。建立連接:m_adoConn.Open(strConnstring);
    //     如果需要無條件重新連接的可以,參數bRepen設成TREU
    //  3。打開記錄集:
    //
    //   _RecordsetPtr* prsThis=NULL;
    //   prsThis=new _RecordsetPtr;
    //   CString strSQL;
    //   strSQL="select * from Table_Name";//  
    //   如果記錄集打開失敗
    //   

    if(!(m_adoConn.OpenRecordset(strSQL,prsThis)))
    //    return FALSE;
    //  4。建立記錄集值對象
    //   注意需要用參數構造
    //   CBBRstValues rsv(m_adoConn,prsThis);
    //  
    //  5。獲得的字段的值
    //   rsv.GetValueLong(&m_nDeptID,1L);//獲得第一個字段的值
    //   rsv.GetValueStr(m_strName,"ID");//獲得第一個字段名為ID的值
    //   其它的同理.如果需要獲得SQL Server中nText類型的字段值請用
    //   GetValText(CString &strText, CString &strFieldName)函數
    //  6。記錄集的記錄移動 (*prsThis)->MoveNext()等類似函數
    //  7。記錄集不用時候需要釋放其資源
    //   1)關閉記錄集
    //   2)刪除記錄集指針
    //   e.g. (*prsThis)->Close();
    //     delete prsThis;
    //     prsThis=NULL;
    //   否則會造成內存泄漏
    //  
    //  注:
    //   1。程序必須要初始化COM環境,請在應用類中加入AfxOleInit函數初始化環境,否則ADO的調用將失敗
    //   2。如果需要調用存儲過程SQL語句改為“Exec ” + 存儲過程名即可,與執行SQL同樣
    //
    //                 CopyRight seesi,2001
    //
    //      說明:你可以隨便在的程序中任意使用、修改本代碼,但請你不要刪除文件頭的部分說明。如果需要轉載,請注明出處。
    // msado15.dll必須放在本文件所在目錄,或者自己指定下面的msado15.dll全路徑
    //

    #if !defined(__AFXADO_H)
    #import "msado15.dll" no_namespace rename ("EOF", "adoEOF") \
      rename ("LockTypeEnum", "adoLockTypeEnum") \
      rename ("DataTypeEnum", "adoDataTypeEnum") \
      rename ("FieldAttributeEnum",

    "adoFieldAttributeEnum") \
      rename ("EditModeEnum", "adoEditModeEnum") \
      rename ("RecordStatusEnum", "adoRecordStatusEnum")

    \
      rename ("ParameterDirectionEnum",

    "adoParameterDirectionEnum")
    #endif  // !defined(__AFXADO_H)


    class CBBAdoConnection  
    {
    public:
    CBBAdoConnection();
    virtual ~CBBAdoConnection();
    public:
    int SetConnTimeOut(long lTimeOut); // 設置連接超時
    int SetCommTimeOut(long lTimeOut); // 設置命令執行超時
    BOOL IsConnectClose(); // 判斷連接是否已經打開
    int ExecuteSQL(LPCSTR szSQL); // 簡單執行SQL語句,不返回記錄集
    // 打開數據庫記錄集
    // 參數:
    //  strSQL  記錄集的SQL語句
    //  rs   返回的記錄集_RecordsetPtr對象
    //  sConnString 數據庫的連接字符串
    //     如果使用數據庫連接已經打開,參數沒用
    //     如果數據庫的連接沒有打開,當給予一個連接字符串,將先打開數據庫連接
    BOOL OpenRecordset(CString strSQL, _RecordsetPtr *rs,CString sConnString="");//打開數據庫記錄集
    BOOL OpenRecordset(const char *sSQL,_RecordsetPtr* rs,char* sConnString=NULL);

    // 打開數據庫連接
    // 參數:
    //  strConnString 連接字符串
    //  sConnString  連接字符串
    //  bReOpen   是否重新打開,如果為FALSE,,
    //      將先判斷數據庫是否打開如果沒有打開則打開,
    //      如果已經打開,將不執行任何操作
    //      如果為TRUE,則無條件重新打開。
    BOOL OpenConnection(CString strConnString ,BOOL bReOpen=FALSE);
    BOOL OpenConnection(char* sConnString,BOOL bReOpen=FALSE); void CloseConnect();// 關閉數據庫連接

    BOOL ExecuteTrans(CStringArray arrStrSQL); // 事務處理,不返回任何記錄集,參數為事務SQL數組


    _ConnectionPtr* GetConnection(); // 得到_ConnectionPtr指針
    CString GetConnString(); // 得到連接字符串
    private:
    enum ERRORFrom {
         ErrFormOpenConnsction,
         ErrFromOpenRecordset,
         ErrFormCloseConnection,
         ErrFormTanslation
         };
    _ConnectionPtr* m_pConn;
    char m_szConnString[512];
    ///
    protected:
    void ReportError(int nERRORfrom);
    };


    class CBBRstValues  
    {
    public:
    // 三種構造類的方法
    // 如果無參數構造,請構造后調用InitConnectAndRst方法
    // 其他的兩種構造則不需調用InitConnectAndRst方法
    CBBRstValues();
    CBBRstValues(_ConnectionPtr* pConn,_RecordsetPtr* pRs);
    CBBRstValues(CBBAdoConnection* pBBadoConn,_RecordsetPtr*

    pRs);

    virtual ~CBBRstValues();
    public:
    // 初始化連接隊象和記錄集對象
    void InitConnectAndRst(_ConnectionPtr* pConn,_RecordsetPtr*  pRs);
    void InitConnectAndRst(CBBAdoConnection* pBBAdoConn, _RecordsetPtr *  Rs);

    // GetValText函數
    // 得到數據庫nText字段的值
    // 參數:
    //  strText   用來接收返回值(字段值)
    //  strFieldName 字段名,該字段數據類型必須是nText類型
    BOOL GetValText(CString& strText,CString& strFieldName); //得到數據庫nText字段的值

    // GetValueStr函數
    // 得到數字型,日期型和字符型字段值函數
    // 參數:
    //  cVal   用來接收返回值(字段值)的字符串指針,要求要開辟足夠的內存單元
    //      或者足夠容納字段內容的字符數組。
    //  vIndex   數據庫字段的名字或者索引,變體型,一般不直接用這個參數,
    //      應該用同形式的多態函數的參數調用
    //      數據庫字段的數據類型可以是數字型,日期型和字符型
    //  nFieldLen  需要返回的數據的字符串的長度,如果為-1,則返回整個字段值
    //  lpszFieldName 字段名,數據庫字段的數據類型可以是數字型,日期型和字符型
    //  nFieldIndex  在SQL語句中字段的索引序號數據庫字段的數據類型可以是數字型,日期型和字符型

    // GetValueLong函數
    // 得到數字型,日期型和字符型字段值函數
    // 參數:
    //  lVal   用來接收返回值(字段值)
    //  vIndex   數據庫字段的名字或者索引,變體型,一般不直接用這個參數,
    //      應該用同形式的多態函數的參數調用
    //      數據庫字段的數據類型要求是數字型(int,long)
    //  lpszFieldName 字段名,數據庫字段的數據類型可以是數字型,日期型和字符型
    //  nFieldIndex  在SQL語句中字段的索引序號數據庫字段的數據類型可以是數字型,日期型和字符型

    // GetValueFlaot函數
    // 得到數字型,日期型和字符型字段值函數
    // 參數:
    //  fVal   用來接收返回值(字段值)
    //  vIndex   數據庫字段的名字或者索引,變體型,一般不直接用這個參數,
    //      應該用同形式的多態函數的參數調用
    //      數據庫字段的數據類型要求是字型(int,long,float,貨幣型等)
    //  lpszFieldName 字段名,數據庫字段的數據類型可以是數字型,日期型和字符型
    //  nFieldIndex  在SQL語句中字段的索引序號數據庫字段的數據類型可以是數字型,日期型和字符型

    BOOL GetValueStr(char* cVal,_variant_t &vIndex,int

    nFieldLen=-1);
    BOOL GetValueLong(long* lVal,_variant_t &vIndex);
    BOOL GetValueFloat(float* fVal,_variant_t &vIndex);

    BOOL GetValueStr(char* cVal,long lIndex,int nFieldLen=-1);
    BOOL GetValueLong(long* lVal,long lIndex);
    BOOL GetValueFloat(float* fVal,long lIndex);

    BOOL GetValueStr(char* cVal,CString strIndex,int nFieldLen=-1);
    GetValueLong(long *lVal, LPCSTR lpszIndex);
    BOOL GetValueFloat(float* fVal,CString strIndex);

    BOOL GetValueStr(CString& str,LPCSTR lpszFieldName,int nFieldLen=-1);
    BOOL GetValueStr(CString& str,UINT nFieldIndex,int nFieldLen=-1);
    BOOL GetValueStr(CString& str,_variant_t &vIndex,int nFieldLen=-1);

    // 判斷值是否有效,是否為NULL
    BOOL VerifyVTData(_variant_t& value);
    BOOL VerifyVTData(char* pData);
    protected:
    _RecordsetPtr* m_prsThis;
    _ConnectionPtr* m_pConn;
    void ReportError();

    };

    #endif // _BBADOCONNECT_H







    ////CPP文件

    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////

    CBBAdoConnection::CBBAdoConnection()
    {
       m_pConn=NULL;
    }

    _ConnectionPtr* CBBAdoConnection::GetConnection()
    {
    return m_pConn;
    }

    CString CBBAdoConnection::GetConnString()
    {
    return m_szConnString;
    }

    CBBAdoConnection::~CBBAdoConnection()
    {
    // 關比連接
    CloseConnect();
    }

    BOOL CBBAdoConnection::OpenConnection(char *sConnString,BOOL bReOpen /*=FALSE*/)
    {

    // 不需重新打開
    if(!bReOpen)
    {
      if(m_pConn !=NULL && ((*m_pConn)->State!=adStateClosed))
       return TRUE;  
    }

    VERIFY(sConnString);
    strcpy(m_szConnString,sConnString);

    try
    {
      m_pConn =new _ConnectionPtr;
      m_pConn->CreateInstance(__uuidof(Connection));
      if(m_pConn==NULL)
       return FALSE;
      HRESULT hr=(*m_pConn)->Open((char*)sConnString,"","",-1);  
      if(FAILED(hr))
       return FALSE;  
      return TRUE;
    }
    catch(_com_error)
    {
      ReportError(ErrFormOpenConnsction);
      return FALSE;
    }
    catch(...)
    {
      #ifdef _DEBUG // 調試時顯示相應的錯誤信息
       MessageBox(NULL,"數據庫連接未處理的異常!","連接失敗",MB_OK|MB_ICONINFORMATION);
      #else
       MessageBox(NULL,"連接數據失敗,請檢查網絡和數據庫設置是否正確","連接失敗",MB_OK|MB_ICONINFORMATION);
      #endif
      return FALSE;
    }
    SetConnTimeOut(5);
    }

    BOOL CBBAdoConnection::OpenRecordset(const char *sSQL, _RecordsetPtr *rs, char *sConnString)
    {
    // rs=new _RecordsetPtr;
    VERIFY(sSQL);
    try
    {  

      if((m_pConn==NULL)||((*m_pConn)->State==adStateClosed))
      {
       int n=(*m_pConn)->State;
       if(sConnString!=NULL)
       {
        if(!OpenConnection(sConnString))
         return FALSE;
       }
       // 嘗試連接數據庫
       else
       {
        //
        // if(!OpenConnection(m_szConnString))
        // return FALSE;
        // MessageBox(NULL,"數據庫連接已經斷開,請重新連接!","連接問題",MB_OK|MB_ICONINFORMATION);  
       }

       return FALSE;
      }  
      // rs=new _RecordsetPtr;
      HRESULT hr;
      hr=rs->CreateInstance(__uuidof(Recordset));
      if(FAILED(hr))
      {   
       return FALSE;// 建立實例失敗
      }     
      hr=(*rs)->Open(sSQL,m_pConn->GetInterfacePtr(),
       adOpenStatic, adLockBatchOptimistic, -1);
      if(FAILED(hr))
      {   
       return FALSE;// 打開連接失敗
      }   
      return TRUE;// 成功返回
    }
    catch(_com_error)
    {
      
      // AfxMessageBox(ce->Description());
      ReportError(ErrFromOpenRecordset);
      return FALSE;
    }
    catch(...)
    {
      MessageBox(NULL,"數據庫記錄打開失??!","記錄失敗",MB_OK|MB_ICONINFORMATION);
      return FALSE;
    }
    return TRUE;
    }

    void CBBAdoConnection::CloseConnect()
    {
    try
    {
      if(m_pConn!=NULL)
      {
       if((*m_pConn)->State!=adStateClosed)
        (*m_pConn)->Close();   
       delete m_pConn;
       m_pConn=NULL;
      }
    }
    catch(_com_error)
    {
      ReportError(ErrFormCloseConnection);
    }
    catch(...)
    {
      AfxMessageBox("關閉數據庫連接未知錯誤!");
    }
    }





    BOOL CBBAdoConnection::OpenConnection(CString strConnString, BOOL bReOpen)
    {
    char c[512];
    strcpy(c,strConnString.GetBuffer(0));
    strConnString.ReleaseBuffer();
    return OpenConnection(c,bReOpen);
    }

    BOOL CBBAdoConnection::OpenRecordset(CString strSQL, _RecordsetPtr *rs, CString sConnString)
    {
    char c[1024];
    strcpy(c,strSQL.GetBuffer(0));
    strSQL.ReleaseBuffer();
    return OpenRecordset(c,rs,(char*)(LPCTSTR)sConnString);
    }

    BOOL CBBAdoConnection::ExecuteTrans(CStringArray arrStrSQL) // 開始事務處理,不返回任何記錄集,參數為事務SQL數組
    {

    (*m_pConn)->BeginTrans();

    try
    {
      _RecordsetPtr* prsThis;
      for(int i=0;i<arrStrSQL.GetSize();i++)
      {
       prsThis=new _RecordsetPtr;   
       OpenRecordset(arrStrSQL.ElementAt(i),prsThis);
       delete prsThis;
      }
      prsThis=NULL;
      (*m_pConn)->CommitTrans();
      return TRUE;
    }
    catch(_com_error)
    {
      (*m_pConn)->RollbackTrans();
      ReportError(ErrFormTanslation);
      return FALSE;
    }
    }




    // 執行SQL操作,不返回記錄集
    int CBBAdoConnection::ExecuteSQL(LPCSTR szSQL)
    {
    // VARIANT vEffect;
    try
    {
      (*m_pConn)->Execute(szSQL,NULL,adCmdText|adExecuteNoRecords);
      return TRUE;
    }
    catch(_com_error)
    {
      ReportError(ErrFormTanslation);    
      return FALSE;
    }
    // return vEffect.lVal;
    }

    // 返回是否處在連接狀態
    BOOL CBBAdoConnection::IsConnectClose()
    {

    return (m_pConn==NULL)||((*m_pConn)->State==adStateClosed);
    }

    // 設置連接超時
    int CBBAdoConnection::SetConnTimeOut(long lTimeOut)
    {
    return (*m_pConn)->put_ConnectionTimeout(lTimeOut);
    }

    int CBBAdoConnection::SetCommTimeOut(long lTimeOut)
    {
    return (*m_pConn)->put_CommandTimeout(lTimeOut);
    }

    // 報告錯誤
    void CBBAdoConnection::ReportError(int nERRORfrom)
    {
    switch(nERRORfrom)
    {
    case ErrFormOpenConnsction:
      #ifdef _DEBUG  // 調試試時顯示相應的錯誤信息
       try
       {
        for(long l=0;l<(*m_pConn)->Errors->Count;l++)
        {
         ErrorPtr pErr;
         pErr=(*m_pConn)->Errors->GetItem(l);
         CString str;
         str=(char*)pErr->Description;     
         MessageBox(NULL,str,"連接失敗",MB_OK|MB_ICONINFORMATION);
        }
       }
       catch(...)
       {
        MessageBox(NULL,"數據庫連接未知錯誤,無法捕捉具體錯誤信息!","錯誤",MB_ICONINFORMATION);
       }
      #else
        MessageBox(NULL,"連接數據失敗,請檢查網絡和數據庫設置是否正確","連接失敗",MB_OK|MB_ICONINFORMATION);
      #endif
      break;
    case ErrFromOpenRecordset:
      #ifdef _DEBUG
        try
        {    
         for(long i=0;i<(*m_pConn)->Errors->Count;i++)
         {
          ErrorPtr pErr;
          pErr=(*m_pConn)->Errors->GetItem(i);
          AfxMessageBox(pErr->Description);
         }
        }
        catch(...)
        {
         MessageBox(NULL,"數據庫連接未知錯誤,無法捕捉具體錯誤信息!","錯誤",MB_ICONINFORMATION);
        }
      #else
        MessageBox(NULL,"打開數據庫失敗,請檢查網絡,并嘗試重新連接數據庫!","記錄失敗",MB_OK|MB_ICONINFORMATION);
      #endif
      break;
    case ErrFormCloseConnection:
      #ifdef _DEBUG  // 調試時顯示相應的錯誤信息
       try
       {
        for(long l=0;l<(*m_pConn)->Errors->Count;l++)
        {
         ErrorPtr pErr;
         pErr=(*m_pConn)->Errors->GetItem(l);
         CString str;
         str=(char*)pErr->Description;
         MessageBox(NULL,str,"連接失敗",MB_OK|MB_ICONINFORMATION);
        }
       }
       catch(...)
       {
        MessageBox(NULL,"數據庫連接未知錯誤,無法捕捉具體錯誤信息!","錯誤",MB_ICONINFORMATION);
       }

      #else
        ;// MessageBox(NULL,"關閉數據庫連接異常","關閉異常",MB_OK|MB_ICONINFORMATION);
      #endif
      break;
    case ErrFormTanslation:
      #if def _DEBUG
       try
       {
        for(long i=0;i<(*m_pConn)->Errors->Count;i++)
        {
         ErrorPtr pErr;
         pErr=(*m_pConn)->Errors->GetItem(i);
         AfxMessageBox(pErr->Description);
        }
       }
       catch(...)
       {
        MessageBox(NULL,"數據庫連接未知錯誤,無法捕捉具體錯誤信息!","錯誤",MB_ICONINFORMATION);
       }
      #else
        MessageBox(NULL,"數據庫執行任務失敗,請檢查數據庫。","任務失敗",MB_OK|MB_ICONINFORMATION);
      #endif
      break;
    default:
      break;
    }
    }





    /////////////// CRecordsetValus


    CBBRstValues::CBBRstValues()
    {
    ;
    }

    CBBRstValues::CBBRstValues(_ConnectionPtr* pConn,_RecordsetPtr* pRs)
    {
    ASSERT(pConn);
    ASSERT(pRs);
    m_prsThis=pRs;
    m_pConn=pConn;
    }

    CBBRstValues::CBBRstValues(CBBAdoConnection* pBBadoConn,_RecordsetPtr* pRs)
    {
    CBBRstValues(pBBadoConn->GetConnection(),pRs);
    }

    CBBRstValues::~CBBRstValues()
    {
    ;
    }

    void CBBRstValues::InitConnectAndRst(_ConnectionPtr *pConn, _RecordsetPtr *pRs)
    {
    ASSERT(pConn);
    ASSERT(pRs);
    m_prsThis=pRs;
    m_pConn=pConn;
    }

    void CBBRstValues::InitConnectAndRst(CBBAdoConnection *pBBAdoConn, _RecordsetPtr *pRs)
    {
    InitConnectAndRst(pBBAdoConn->GetConnection(),pRs);
    }

    BOOL CBBRstValues::GetValueLong(long *lVal, _variant_t &vIndex)
    {
    _variant_t value;
    try{

      if((*m_prsThis)==NULL||(*m_prsThis)->State==adStateClosed)  
      {

    #ifdef _DEBUG
       AfxMessageBox("記錄集未打開!");
    #else
       MessageBox(NULL,"無法讀取數據庫資料,可能數據庫連接已經斷開,請重新連接、然后重試。","連接問題",MB_ICONINFORMATION);
    #endif
       return FALSE;
      }

      if((*m_prsThis)->adoEOF)
      {
       lVal=0;
       return FALSE;
      }

      value=(*m_prsThis)->GetCollect(vIndex);  
    }
    catch(_com_error)
    {
      ReportError();
      return FALSE;
    }
    catch(...)
    {
      AfxMessageBox("數據庫字段訪問未知錯誤!請檢查數據庫是否改動。",MB_ICONINFORMATION);
      return FALSE;
    }

    if(VerifyVTData(value))  
    {
      *lVal = long(value);
    }
    else
    {
      *lVal=0;
    }

    return TRUE;
    }

    BOOL CBBRstValues::GetValueStr(char *cVal, _variant_t &vIndex, int nFieldLen)
    {
    char * c=NULL;
    _variant_t value;
    DATE dt;
    CString str;
    COleDateTime da;

    // 檢查是數組
    // VERIFY(sizeof(cVal)<1);
    memset(cVal,0,sizeof(cVal));
    try
    {
      if((*m_prsThis)==NULL||(*m_prsThis)->State==adStateClosed)
      {
    #ifdef _DEBUG
       AfxMessageBox("記錄集未打開!");
    #else
       MessageBox(NULL,"無法讀取數據庫資料,可能數據庫連接已經斷開,請重新連接、然后重試。","連接問題",MB_ICONINFORMATION);
    #endif
       return FALSE;
      }

      if((*m_prsThis)->adoEOF)
      {
       cVal[0]='\0';
       return FALSE;
      }
      value = (*m_prsThis)->GetCollect(vIndex);
    }
    catch(_com_error)
    {
      ReportError();
      // AfxMessageBox("數據庫字段訪問錯誤!");
      return FALSE;
    }
    catch(...)
    {
      AfxMessageBox("數據庫字段訪問未知錯誤!請檢查數據庫是否改動。",MB_ICONINFORMATION);
      return FALSE;
    }

    if(VerifyVTData(value))
    {
      switch(value.vt)
      {
       case VT_BSTR:
        c = (char *)_com_util::ConvertBSTRToString( V_BSTR(&value) );
        if(VerifyVTData(c))
        {           
         if(nFieldLen<=0)
         {
          strcpy(cVal,(char*)c);
         }
         else
         {
          strncpy(cVal, (char*)c, nFieldLen);
         }    
        }
        delete c;
        c=NULL;
        break;
       case VT_I4:
       case VT_DECIMAL:  
       case VT_UI4:
       case VT_I8:
       case VT_UI8:
       case VT_INT:
       case VT_UINT:
        long lVal;
        lVal = long(value);
        ltoa(lVal,cVal,10);    
        break;
       case VT_DATE:    
        dt=value.date;
        da=COleDateTime(dt);    
        // str=da.Format("%Y-%m-%d %H:%M:%S");
        str=da.Format("%Y-%m-%d ");
        c=new char[64];
        memset(c,0,sizeof(char)*64);
        strcpy(c,str.GetBuffer(0));
        str.ReleaseBuffer();
        if(VerifyVTData(c))
        {           
         if(nFieldLen<=0)
         {
          strcpy(cVal,(char*)c);
         }
         else
         {
          strncpy(cVal, (char*)c, nFieldLen);
          cVal[nFieldLen]='\0';
         }    
        }
        delete c;
        c=NULL;
        break;
       default:
    #ifdef _DEBUG
        AfxMessageBox("未處理的字段數據類型,請處理!");
    #else
        break;
    #endif
        break;
      }
    }

    else
    {
      cVal[0]='\0';
    }
    return TRUE;
    }

    BOOL CBBRstValues::GetValueLong(long *lVal, long lIndex)
    {
    _variant_t vIndex(lIndex);
    return GetValueLong(lVal,vIndex);
    }

    BOOL CBBRstValues::GetValueLong(long *lVal, LPCSTR lpszIndex)
    {
    _variant_t vIndex(lpszIndex);
    return GetValueLong(lVal,vIndex);
    }

    BOOL CBBRstValues::VerifyVTData(char *pData)
    {
    if(pData == NULL)
    {
      return FALSE;
    }
    return TRUE;
    }

    BOOL CBBRstValues::VerifyVTData(_variant_t &value)
    {
    if(value.vt == VT_NULL)
    {
      return FALSE;
    }
    return TRUE;
    }

    BOOL CBBRstValues::GetValueStr(CString& str,LPCSTR lpszFieldName,int nFieldLen/*=-1*/)
    {
    _variant_t vIndex(lpszFieldName);
    return GetValueStr(str,vIndex,nFieldLen);
    }

    BOOL CBBRstValues::GetValueStr(CString& str,UINT nFieldIndex,int nFieldLen/*=-1*/)
    {
    _variant_t vIndex((long)nFieldIndex);  
    return GetValueStr(str,vIndex,nFieldLen);

    }

    BOOL CBBRstValues::GetValueStr(CString& str,_variant_t &vIndex,int nFieldLen/*=-1*/)
    {
    TCHAR buffer[1024];
    if(nFieldLen > 1023)
      nFieldLen = 1023;

    BOOL bResult=GetValueStr((char*)buffer,vIndex,nFieldLen);
    str.Format(buffer);
    str.TrimRight();
    return bResult;
    }

    BOOL CBBRstValues::GetValueFloat(float* fVal,_variant_t &vIndex)
    {
    _variant_t value;
    try
    {
      if((*m_prsThis)==NULL||(*m_prsThis)->State==adStateClosed)
      {
      
    #ifdef _DEBUG
       AfxMessageBox("記錄集未打開!");
    #else
       MessageBox(NULL,"無法讀取數據庫資料,可能數據庫連接已經斷開,請重新連接、然后重試。","連接問題",MB_ICONINFORMATION);
    #endif
       return FALSE;
      }
      
      if((*m_prsThis)->adoEOF)
      {
       fVal=0;
       return FALSE;
      }

      value=(*m_prsThis)->GetCollect(vIndex);   
    }
    catch(_com_error)
    {  
      ReportError();
      return FALSE;
    }
    catch(...)
    {
      AfxMessageBox("數據庫字段訪問未知錯誤!請檢查連接數據庫結構是否已經更改。",MB_ICONINFORMATION);
      return FALSE;
    }

    if(VerifyVTData(value))
    {
      *fVal = float(value);
    }
    else
    {
      *fVal = 0;
    }
    return TRUE;
    }


    BOOL CBBRstValues::GetValueFloat(float* fVal,long lIndex)
    {
    _variant_t vIndex(lIndex);
    return GetValueFloat(fVal,vIndex);
    }

    BOOL CBBRstValues::GetValueFloat(float* fVal,CString  strIndex)
    {
    _variant_t vIndex(strIndex);
    return GetValueFloat(fVal,vIndex);
    }

    BOOL CBBRstValues::GetValueStr(char *cVal,long lIndex,int nFieldLen)
    {
    _variant_t vIndex;
    vIndex=_variant_t(lIndex);
    return GetValueStr(cVal,vIndex);
    }


    BOOL CBBRstValues::GetValueStr(char *cVal,CString strIndex,int nFieldLen)
    {
    _variant_t vIndex;
    vIndex=_variant_t(strIndex);
    return GetValueStr(cVal,vIndex);
    }


    void CBBRstValues::ReportError()
    {
    #ifdef _DEBUG
    try
    {
      for(long l=0;l<(*m_pConn)->Errors->Count;l++)
      {
       ErrorPtr pErr;
       pErr=(*m_pConn)->Errors->GetItem(l);
       AfxMessageBox(pErr->Description);
      }  
    }
    catch(...)
    {
      AfxMessageBox("字段錯誤對象訪問錯誤,請檢查書寫是否正確。");
    }
    #else
    MessageBox(NULL,"字段訪問發生錯誤,請確認數據庫結構沒有改動。","字段訪問",MB_ICONINFORMATION);
    #endif
    // AfxMessageBox("數據庫字段訪問錯誤!");
    }

    BOOL CBBRstValues::GetValText(CString &strText, CString &strFieldName)
    {
    _bstr_t varChunk;
    _bstr_t varNotes;
    long lngTotalsize,
           lngOffSet = 0,
           lngChunkSize = 100;
    _variant_t vFieldName = _variant_t(strFieldName);
    lngTotalsize = (*m_prsThis)->Fields->Item[vFieldName]->ActualSize/2;
    if (lngTotalsize <= 0)
      return FALSE;

    try
    {
      while (lngOffSet < lngTotalsize)
      {
       varChunk = (*m_prsThis)->Fields->Item[vFieldName]->GetChunk(lngChunkSize);
       varNotes = varNotes + varChunk;
       lngOffSet = lngOffSet + lngChunkSize;
      }
      strText=(char*)varNotes;
    }
    catch(_com_error)
    {
      ReportError();
      return FALSE;
    }
    catch(...)
    {

    #ifdef _DEBUG
      AfxMessageBox("獲取Text字段未知錯誤");
    #endif
      return FALSE;
    }

    return TRUE;
    }



    // 上面代碼,還有沒有完善的地方,更完善的代碼,在以后會發表,現在我已經做成了一個DLL,并而還有一些示例文件,需要DLL和示例文件的,請與我聯系。EMail: bozi@china.com

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>