對于初學者,使用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
|