⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 封装ado访问数据库的两个类 .htm

📁 数据库编程技巧文章
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<P>BOOL CBBAdoConnection::OpenRecordset(const char *sSQL, _RecordsetPtr *rs, char *sConnString)<BR>{<BR><FONT color=#9709f7>&nbsp;// rs=new _RecordsetPtr;<BR></FONT>&nbsp;VERIFY(sSQL);<BR>&nbsp;try<BR>&nbsp;{&nbsp; </P>
<P>&nbsp; if((m_pConn==NULL)||((*m_pConn)-&gt;State==adStateClosed))<BR>&nbsp; {<BR>&nbsp;&nbsp; int n=(*m_pConn)-&gt;State;<BR>&nbsp;&nbsp; if(sConnString!=NULL)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; if(!OpenConnection(sConnString))<BR>&nbsp;&nbsp;&nbsp;&nbsp; return FALSE; <BR>&nbsp;&nbsp; }<BR><FONT color=#9709f7>&nbsp;&nbsp; // 尝试连接数据库<BR></FONT>&nbsp;&nbsp; else<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; <FONT color=#9709f7>//<BR>&nbsp;&nbsp;&nbsp; // if(!OpenConnection(m_szConnString))<BR>&nbsp;&nbsp;&nbsp; // return FALSE; <BR>&nbsp;&nbsp;&nbsp; // MessageBox(NULL,"数据库连接已经断开,请重新连接!","连接问题",MB_OK|MB_ICONINFORMATION);&nbsp; <BR></FONT>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; return FALSE;<BR>&nbsp; }&nbsp; <BR>&nbsp;<FONT color=#9709f7> // rs=new _RecordsetPtr;<BR></FONT>&nbsp; HRESULT hr;<BR>&nbsp; hr=rs-&gt;CreateInstance(__uuidof(Recordset));<BR>&nbsp; if(FAILED(hr))<BR>&nbsp; {&nbsp;&nbsp; <BR>&nbsp;&nbsp; return FALSE;<FONT color=#9709f7>// 建立实例失败<BR></FONT>&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; hr=(*rs)-&gt;Open(sSQL,m_pConn-&gt;GetInterfacePtr(),<BR>&nbsp;&nbsp; adOpenStatic, adLockBatchOptimistic, -1);<BR>&nbsp; if(FAILED(hr))<BR>&nbsp; {&nbsp;&nbsp; <BR>&nbsp;&nbsp; return FALSE;<FONT color=#9709f7>// 打开连接失败<BR></FONT>&nbsp; }&nbsp;&nbsp; <BR>&nbsp; return TRUE;<FONT color=#9709f7>// 成功返回<BR></FONT>&nbsp;}<BR>&nbsp;catch(_com_error)<BR>&nbsp;{<BR>&nbsp; <BR>&nbsp;<FONT color=#9709f7> // AfxMessageBox(ce-&gt;Description());<BR></FONT>&nbsp; ReportError(ErrFromOpenRecordset);<BR>&nbsp; return FALSE;<BR>&nbsp;} <BR>&nbsp;catch(...)<BR>&nbsp;{<BR>&nbsp; MessageBox(NULL,"数据库记录打开失败!","记录失败",MB_OK|MB_ICONINFORMATION);<BR>&nbsp; return FALSE;<BR>&nbsp;}<BR>&nbsp;return TRUE;<BR>}</P>
<P>void CBBAdoConnection::CloseConnect()<BR>{<BR>&nbsp;try<BR>&nbsp;{<BR>&nbsp; if(m_pConn!=NULL)<BR>&nbsp; {<BR>&nbsp;&nbsp; if((*m_pConn)-&gt;State!=adStateClosed)<BR>&nbsp;&nbsp;&nbsp; (*m_pConn)-&gt;Close();&nbsp;&nbsp; <BR>&nbsp;&nbsp; delete m_pConn;<BR>&nbsp;&nbsp; m_pConn=NULL;<BR>&nbsp; }<BR>&nbsp;}<BR>&nbsp;catch(_com_error)<BR>&nbsp;{<BR>&nbsp; ReportError(ErrFormCloseConnection);<BR>&nbsp;}<BR>&nbsp;catch(...)<BR>&nbsp;{<BR>&nbsp; AfxMessageBox("关闭数据库连接未知错误!");<BR>&nbsp;}<BR>}</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>BOOL CBBAdoConnection::OpenConnection(CString strConnString, BOOL bReOpen)<BR>{<BR>&nbsp;char c[512];<BR>&nbsp;strcpy(c,strConnString.GetBuffer(0));<BR>&nbsp;strConnString.ReleaseBuffer();<BR>&nbsp;return OpenConnection(c,bReOpen);<BR>}</P>
<P>BOOL CBBAdoConnection::OpenRecordset(CString strSQL, _RecordsetPtr *rs, CString sConnString)<BR>{<BR>&nbsp;char c[1024];<BR>&nbsp;strcpy(c,strSQL.GetBuffer(0));<BR>&nbsp;strSQL.ReleaseBuffer();<BR>&nbsp;return OpenRecordset(c,rs,(char*)(LPCTSTR)sConnString); <BR>}</P>
<P>BOOL CBBAdoConnection::ExecuteTrans(CStringArray arrStrSQL) <FONT color=#9709f7>// 开始事务处理,不返回任何记录集,参数为事务SQL数组</FONT><BR>{<BR>&nbsp;<BR>&nbsp;(*m_pConn)-&gt;BeginTrans();</P>
<P>&nbsp;try<BR>&nbsp;{<BR>&nbsp; _RecordsetPtr* prsThis;<BR>&nbsp; for(int i=0;i&lt;arrStrSQL.GetSize();i++)<BR>&nbsp; {<BR>&nbsp;&nbsp; prsThis=new _RecordsetPtr;&nbsp;&nbsp; <BR>&nbsp;&nbsp; OpenRecordset(arrStrSQL.ElementAt(i),prsThis);<BR>&nbsp;&nbsp; delete prsThis;<BR>&nbsp; }<BR>&nbsp; prsThis=NULL;<BR>&nbsp; (*m_pConn)-&gt;CommitTrans();<BR>&nbsp; return TRUE;<BR>&nbsp;}<BR>&nbsp;catch(_com_error)<BR>&nbsp;{<BR>&nbsp; (*m_pConn)-&gt;RollbackTrans();<BR>&nbsp; ReportError(ErrFormTanslation); <BR>&nbsp; return FALSE;<BR>&nbsp;} <BR>}</P>
<P>&nbsp;</P>
<P><BR><FONT color=#9709f7>// 执行SQL操作,不返回记录集<BR></FONT>int CBBAdoConnection::ExecuteSQL(LPCSTR szSQL)<BR>{ <BR><FONT color=#9709f7>&nbsp;// VARIANT vEffect;<BR></FONT>&nbsp;try<BR>&nbsp;{<BR>&nbsp; (*m_pConn)-&gt;Execute(szSQL,NULL,adCmdText|adExecuteNoRecords);<BR>&nbsp; return TRUE;<BR>&nbsp;}<BR>&nbsp;catch(_com_error)<BR>&nbsp;{ <BR>&nbsp; ReportError(ErrFormTanslation);&nbsp;&nbsp;&nbsp; <BR>&nbsp; return FALSE;<BR>&nbsp;} <BR><FONT color=#9709f7>&nbsp;// return vEffect.lVal;<BR></FONT>}</P>
<P><FONT color=#9709f7>// 返回是否处在连接状态<BR></FONT>BOOL CBBAdoConnection::IsConnectClose()<BR>{</P>
<P>&nbsp;return (m_pConn==NULL)||((*m_pConn)-&gt;State==adStateClosed);<BR>}</P>
<P><FONT color=#9709f7>// 设置连接超时<BR></FONT>int CBBAdoConnection::SetConnTimeOut(long lTimeOut)<BR>{<BR>&nbsp;return (*m_pConn)-&gt;put_ConnectionTimeout(lTimeOut);<BR>}</P>
<P>int CBBAdoConnection::SetCommTimeOut(long lTimeOut)<BR>{<BR>&nbsp;return (*m_pConn)-&gt;put_CommandTimeout(lTimeOut);<BR>}</P>
<P><FONT color=#9709f7>// 报告错误<BR></FONT>void CBBAdoConnection::ReportError(int nERRORfrom)<BR>{<BR>&nbsp;switch(nERRORfrom)<BR>&nbsp;{<BR>&nbsp;case ErrFormOpenConnsction:<BR>&nbsp; #ifdef _DEBUG&nbsp; <FONT color=#9709f7>// 调试试时显示相应的错误信息<BR></FONT>&nbsp;&nbsp; try<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; for(long l=0;l&lt;(*m_pConn)-&gt;Errors-&gt;Count;l++)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; ErrorPtr pErr;<BR>&nbsp;&nbsp;&nbsp;&nbsp; pErr=(*m_pConn)-&gt;Errors-&gt;GetItem(l);<BR>&nbsp;&nbsp;&nbsp;&nbsp; CString str;<BR>&nbsp;&nbsp;&nbsp;&nbsp; str=(char*)pErr-&gt;Description;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL,str,"连接失败",MB_OK|MB_ICONINFORMATION);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; catch(...)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; MessageBox(NULL,"数据库连接未知错误,无法捕捉具体错误信息!","错误",MB_ICONINFORMATION);<BR>&nbsp;&nbsp; }<BR>&nbsp; #else<BR>&nbsp;&nbsp;&nbsp; MessageBox(NULL,"连接数据失败,请检查网络和数据库设置是否正确","连接失败",MB_OK|MB_ICONINFORMATION);<BR>&nbsp; #endif <BR>&nbsp; break;<BR>&nbsp;case ErrFromOpenRecordset:<BR>&nbsp; #ifdef _DEBUG<BR>&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; for(long i=0;i&lt;(*m_pConn)-&gt;Errors-&gt;Count;i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ErrorPtr pErr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pErr=(*m_pConn)-&gt;Errors-&gt;GetItem(i);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(pErr-&gt;Description);<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch(...)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL,"数据库连接未知错误,无法捕捉具体错误信息!","错误",MB_ICONINFORMATION);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; #else<BR>&nbsp;&nbsp;&nbsp; MessageBox(NULL,"打开数据库失败,请检查网络,并尝试重新连接数据库!","记录失败",MB_OK|MB_ICONINFORMATION);<BR>&nbsp; #endif<BR>&nbsp; break;<BR>&nbsp;case ErrFormCloseConnection:<BR>&nbsp; #ifdef _DEBUG&nbsp; <FONT color=#9709f7>// 调试时显示相应的错误信息<BR></FONT>&nbsp;&nbsp; try<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; for(long l=0;l&lt;(*m_pConn)-&gt;Errors-&gt;Count;l++)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; ErrorPtr pErr;<BR>&nbsp;&nbsp;&nbsp;&nbsp; pErr=(*m_pConn)-&gt;Errors-&gt;GetItem(l);<BR>&nbsp;&nbsp;&nbsp;&nbsp; CString str;<BR>&nbsp;&nbsp;&nbsp;&nbsp; str=(char*)pErr-&gt;Description;<BR>&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL,str,"连接失败",MB_OK|MB_ICONINFORMATION);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; catch(...)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; MessageBox(NULL,"数据库连接未知错误,无法捕捉具体错误信息!","错误",MB_ICONINFORMATION);<BR>&nbsp;&nbsp; }</P>
<P>&nbsp; #else<BR>&nbsp;&nbsp;&nbsp; ;// MessageBox(NULL,"关闭数据库连接异常","关闭异常",MB_OK|MB_ICONINFORMATION);<BR>&nbsp; #endif<BR>&nbsp; break;<BR>&nbsp;case ErrFormTanslation:<BR>&nbsp; #if&nbsp;def _DEBUG<BR>&nbsp;&nbsp; try<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; for(long i=0;i&lt;(*m_pConn)-&gt;Errors-&gt;Count;i++)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; ErrorPtr pErr;<BR>&nbsp;&nbsp;&nbsp;&nbsp; pErr=(*m_pConn)-&gt;Errors-&gt;GetItem(i);<BR>&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(pErr-&gt;Description);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; catch(...)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; MessageBox(NULL,"数据库连接未知错误,无法捕捉具体错误信息!","错误",MB_ICONINFORMATION);<BR>&nbsp;&nbsp; }<BR>&nbsp; #else<BR>&nbsp;&nbsp;&nbsp; MessageBox(NULL,"数据库执行任务失败,请检查数据库。","任务失败",MB_OK|MB_ICONINFORMATION);<BR>&nbsp; #endif<BR>&nbsp; break;<BR>&nbsp;default:<BR>&nbsp; break;<BR>&nbsp;}<BR>}</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P><FONT color=#9709f7>/////////////// CRecordsetValus</FONT></P>
<P><BR>CBBRstValues::CBBRstValues()<BR>{<BR>&nbsp;;<BR>}</P>
<P>CBBRstValues::CBBRstValues(_ConnectionPtr* pConn,_RecordsetPtr* pRs)<BR>{<BR>&nbsp;ASSERT(pConn);<BR>&nbsp;ASSERT(pRs);<BR>&nbsp;m_prsThis=pRs;<BR>&nbsp;m_pConn=pConn;<BR>}</P>
<P>CBBRstValues::CBBRstValues(CBBAdoConnection* pBBadoConn,_RecordsetPtr* pRs)<BR>{<BR>&nbsp;CBBRstValues(pBBadoConn-&gt;GetConnection(),pRs);<BR>}</P>
<P>CBBRstValues::~CBBRstValues()<BR>{<BR>&nbsp;;<BR>}</P>
<P>void CBBRstValues::InitConnectAndRst(_ConnectionPtr *pConn, _RecordsetPtr *pRs)<BR>{<BR>&nbsp;ASSERT(pConn);<BR>&nbsp;ASSERT(pRs);<BR>&nbsp;m_prsThis=pRs;<BR>&nbsp;m_pConn=pConn;<BR>}</P>
<P>void CBBRstValues::InitConnectAndRst(CBBAdoConnection *pBBAdoConn, _RecordsetPtr *pRs)<BR>{<BR>&nbsp;InitConnectAndRst(pBBAdoConn-&gt;GetConnection(),pRs);<BR>}</P>
<P>BOOL CBBRstValues::GetValueLong(long *lVal, _variant_t &amp;vIndex)<BR>{<BR>&nbsp;_variant_t value;<BR>&nbsp;try{</P>
<P>&nbsp; if((*m_prsThis)==NULL||(*m_prsThis)-&gt;State==adStateClosed)&nbsp; <BR>&nbsp; {</P>
<P>#ifdef _DEBUG<BR>&nbsp;&nbsp; AfxMessageBox("记录集未打开!");<BR>#else<BR>&nbsp;&nbsp; MessageBox(NULL,"无法读取数据库资料,可能数据库连接已经断开,请重新连接、然后重试。","连接问题",MB_ICONINFORMATION);<BR>#endif<BR>&nbsp;&nbsp; return FALSE;<BR>&nbsp; }</P>
<P>&nbsp; if((*m_prsThis)-&gt;adoEOF)<BR>&nbsp; {<BR>&nbsp;&nbsp; lVal=0;<BR>&nbsp;&nbsp; return FALSE;<BR>&nbsp; }</P>
<P>&nbsp; value=(*m_prsThis)-&gt;GetCollect(vIndex);&nbsp; <BR>&nbsp;}<BR>&nbsp;catch(_com_error)<BR>&nbsp;{<BR>&nbsp; ReportError();<BR>&nbsp; return FALSE;<BR>&nbsp;}<BR>&nbsp;catch(...)<BR>&nbsp;{<BR>&nbsp; AfxMessageBox("数据库字段访问未知错误!请检查数据库是否改动。",MB_ICONINFORMATION);<BR>&nbsp; return FALSE;<BR>&nbsp;} </P>
<P>&nbsp;if(VerifyVTData(value))&nbsp; <BR>&nbsp;{<BR>&nbsp; *lVal = long(value);<BR>&nbsp;}<BR>&nbsp;else<BR>&nbsp;{<BR>&nbsp; *lVal=0;<BR>&nbsp;}</P>
<P>&nbsp;return TRUE;<BR>}</P>
<P>BOOL CBBRstValues::GetValueStr(char *cVal, _variant_t &amp;vIndex, int nFieldLen)<BR>{<BR>&nbsp;char * c=NULL;<BR>&nbsp;_variant_t value;<BR>&nbsp;DATE dt;<BR>&nbsp;CString str;<BR>&nbsp;COleDateTime da;<BR>&nbsp;<BR>&nbsp;<FONT color=#9709f7>// 检查是数组<BR>&nbsp;// VERIFY(sizeof(cVal)&lt;1);<BR>&nbsp;</FONT>memset(cVal,0,sizeof(cVal));<BR>&nbsp;try<BR>&nbsp;{<BR>&nbsp; if((*m_prsThis)==NULL||(*m_prsThis)-&gt;State==adStateClosed)<BR>&nbsp; {<BR>#ifdef _DEBUG<BR>&nbsp;&nbsp; AfxMessageBox("记录集未打开!");<BR>#else<BR>&nbsp;&nbsp; MessageBox(NULL,"无法读取数据库资料,可能数据库连接已经断开,请重新连接、然后重试。","连接问题",MB_ICONINFORMATION);<BR>#endif<BR>&nbsp;&nbsp; return FALSE;<BR>&nbsp; } </P>
<P>&nbsp; if((*m_prsThis)-&gt;adoEOF)<BR>&nbsp; {<BR>&nbsp;&nbsp; cVal[0]='\0';<BR>&nbsp;&nbsp; return FALSE;<BR>&nbsp; }<BR>&nbsp; value = (*m_prsThis)-&gt;GetCollect(vIndex);<BR>&nbsp;}<BR>&nbsp;catch(_com_error)<BR>&nbsp;{<BR>&nbsp; ReportError();<BR>&nbsp; <FONT color=#9709f7>// AfxMessageBox("数据库字段访问错误!");<BR>&nbsp; </FONT>return FALSE;<BR>&nbsp;}<BR>&nbsp;catch(...)<BR>&nbsp;{<BR>&nbsp; AfxMessageBox("数据库字段访问未知错误!请检查数据库是否改动。",MB_ICONINFORMATION);<BR>&nbsp; return FALSE;<BR>&nbsp;} <BR>&nbsp;<BR>&nbsp;if(VerifyVTData(value))<BR>&nbsp;{<BR>&nbsp; switch(value.vt)<BR>&nbsp; {<BR>&nbsp;&nbsp; case VT_BSTR:<BR>&nbsp;&nbsp;&nbsp; c = (char *)_com_util::ConvertBSTRToString( V_BSTR(&amp;value) ); <BR>&nbsp;&nbsp;&nbsp; if(VerifyVTData(c))<BR>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; if(nFieldLen&lt;=0)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(cVal,(char*)c);<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strncpy(cVal, (char*)c, nFieldLen);<BR>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp; delete c;<BR>&nbsp;&nbsp;&nbsp; c=NULL;<BR>&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp; case VT_I4: <BR>&nbsp;&nbsp; case VT_DECIMAL:&nbsp; <BR>&nbsp;&nbsp; case VT_UI4:<BR>&nbsp;&nbsp; case VT_I8:<BR>&nbsp;&nbsp; case VT_UI8:<BR>&nbsp;&nbsp; case VT_INT:<BR>&nbsp;&nbsp; case VT_UINT:<BR>&nbsp;&nbsp;&nbsp; long lVal;<BR>&nbsp;&nbsp;&nbsp; lVal = long(value);<BR>&nbsp;&nbsp;&nbsp; ltoa(lVal,cVal,10);&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp; case VT_DATE:&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; dt=value.date;<BR>&nbsp;&nbsp;&nbsp; da=COleDateTime(dt);&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;<FONT color=#9709f7> // str=da.Format("%Y-%m-%d %H:%M:%S");<BR></FONT>&nbsp;&nbsp;&nbsp; str=da.Format("%Y-%m-%d ");<BR>&nbsp;&nbsp;&nbsp; c=new char[64];<BR>&nbsp;&nbsp;&nbsp; memset(c,0,sizeof(char)*64);<BR>&nbsp;&nbsp;&nbsp; strcpy(c,str.GetBuffer(0));<BR>&nbsp;&nbsp;&nbsp; str.ReleaseBuffer();<BR>&nbsp;&nbsp;&nbsp; if(VerifyVTData(c))<BR>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; if(nFieldLen&lt;=0)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(cVal,(char*)c);<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strncpy(cVal, (char*)c, nFieldLen);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cVal[nFieldLen]='\0';<BR>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp; delete c;<BR>&nbsp;&nbsp;&nbsp; c=NULL;<BR>&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp; default:<BR>#ifdef _DEBUG<BR>&nbsp;&nbsp;&nbsp; AfxMessageBox("未处理的字段数据类型,请处理!");<BR>#else<BR>&nbsp;&nbsp;&nbsp; break;<BR>#endif<BR>&nbsp;&nbsp;&nbsp; break;<BR>&nbsp; }<BR>&nbsp;}</P>
<P>&nbsp;else<BR>&nbsp;{<BR>&nbsp; cVal[0]='\0';<BR>&nbsp;}<BR>&nbsp;return TRUE;<BR>}</P>
<P>BOOL CBBRstValues::GetValueLong(long *lVal, long lIndex)<BR>{<BR>&nbsp;_variant_t vIndex(lIndex);<BR>&nbsp;return GetValueLong(lVal,vIndex);<BR>}</P>
<P>BOOL CBBRstValues::GetValueLong(long *lVal, LPCSTR lpszIndex)<BR>{<BR>&nbsp;_variant_t vIndex(lpszIndex);<BR>&nbsp;return GetValueLong(lVal,vIndex);<BR>}</P>
<P>BOOL CBBRstValues::VerifyVTData(char *pData)<BR>{<BR>&nbsp;if(pData == NULL)<BR>&nbsp;{<BR>&nbsp; return FALSE;<BR>&nbsp;}<BR>&nbsp;return TRUE;<BR>}</P>
<P>BOOL CBBRstValues::VerifyVTData(_variant_t &amp;value)<BR>{<BR>&nbsp;if(value.vt == VT_NULL)<BR>&nbsp;{<BR>&nbsp; return FALSE;<BR>&nbsp;}<BR>&nbsp;return TRUE;<BR>}</P>
<P>BOOL CBBRstValues::GetValueStr(CString&amp; str,LPCSTR lpszFieldName,int nFieldLen<FONT color=#9709f7>/*=-1*/</FONT>)<BR>{<BR>&nbsp;_variant_t vIndex(lpszFieldName);<BR>&nbsp;return GetValueStr(str,vIndex,nFieldLen);<BR>}</P>
<P>BOOL CBBRstValues::GetValueStr(CString&amp; str,UINT nFieldIndex,int nFieldLen<FONT color=#9709f7>/*=-1*/</FONT>)<BR>{<BR>&nbsp;_variant_t vIndex((long)nFieldIndex);&nbsp; <BR>&nbsp;return GetValueStr(str,vIndex,nFieldLen);<BR>&nbsp;<BR>}</P>
<P>BOOL CBBRstValues::GetValueStr(CString&amp; str,_variant_t &amp;vIndex,int nFieldLen<FONT color=#9709f7>/*=-1*/</FONT>)<BR>{<BR>&nbsp;TCHAR buffer[1024];<BR>&nbsp;if(nFieldLen &gt; 1023) <BR>&nbsp; nFieldLen = 1023;<BR>&nbsp;<BR>&nbsp;BOOL bResult=GetValueStr((char*)buffer,vIndex,nFieldLen);<BR>&nbsp;str.Format(buffer);<BR>&nbsp;str.TrimRight();<BR>&nbsp;return bResult;<BR>}</P>
<P>BOOL CBBRstValues::GetValueFloat(float* fVal,_variant_t &amp;vIndex)<BR>{<BR>&nbsp;_variant_t value; <BR>&nbsp;try<BR>&nbsp;{<BR>&nbsp; if((*m_prsThis)==NULL||(*m_prsThis)-&gt;State==adStateClosed)<BR>&nbsp; {<BR>&nbsp; <BR>#ifdef _DEBUG<BR>&nbsp;&nbsp; AfxMessageBox("记录集未打开!");<BR>#else<BR>&nbsp;&nbsp; MessageBox(NULL,"无法读取数据库资料,可能数据库连接已经断开,请重新连接、然后重试。","连接问题",MB_ICONINFORMATION);<BR>#endif<BR>&nbsp;&nbsp; return FALSE;<BR>&nbsp; }<BR>&nbsp; <BR>&nbsp; if((*m_prsThis)-&gt;adoEOF)<BR>&nbsp; {<BR>&nbsp;&nbsp; fVal=0;<BR>&nbsp;&nbsp; return FALSE;<BR>&nbsp; }</P>
<P>&nbsp; value=(*m_prsThis)-&gt;GetCollect(vIndex);&nbsp;&nbsp; <BR>&nbsp;}<BR>&nbsp;catch(_com_error)<BR>&nbsp;{&nbsp; <BR>&nbsp; ReportError();<BR>&nbsp; return FALSE;<BR>&nbsp;}<BR>&nbsp;catch(...)<BR>&nbsp;{<BR>&nbsp; AfxMessageBox("数据库字段访问未知错误!请检查连接数据库结构是否已经更改。",MB_ICONINFORMATION);<BR>&nbsp; return FALSE;<BR>&nbsp;}</P>
<P>&nbsp;if(VerifyVTData(value))<BR>&nbsp;{<BR>&nbsp; *fVal = float(value);<BR>&nbsp;}<BR>&nbsp;else<BR>&nbsp;{<BR>&nbsp; *fVal = 0;<BR>&nbsp;}<BR>&nbsp;return TRUE;<BR>}</P>
<P><BR>BOOL CBBRstValues::GetValueFloat(float* fVal,long lIndex)<BR>{<BR>&nbsp;_variant_t vIndex(lIndex);<BR>&nbsp;return GetValueFloat(fVal,vIndex);<BR>}</P>
<P>BOOL CBBRstValues::GetValueFloat(float* fVal,CString&nbsp; strIndex)<BR>{<BR>&nbsp;_variant_t vIndex(strIndex);<BR>&nbsp;return GetValueFloat(fVal,vIndex);<BR>}</P>
<P>BOOL CBBRstValues::GetValueStr(char *cVal,long lIndex,int nFieldLen)<BR>{ <BR>&nbsp;_variant_t vIndex;<BR>&nbsp;vIndex=_variant_t(lIndex);<BR>&nbsp;return GetValueStr(cVal,vIndex); <BR>}</P>
<P><BR>BOOL CBBRstValues::GetValueStr(char *cVal,CString strIndex,int nFieldLen)<BR>{ <BR>&nbsp;_variant_t vIndex;<BR>&nbsp;vIndex=_variant_t(strIndex); <BR>&nbsp;return GetValueStr(cVal,vIndex); <BR>}</P>
<P><BR>void CBBRstValues::ReportError()<BR>{<BR>#ifdef _DEBUG<BR>&nbsp;try<BR>&nbsp;{<BR>&nbsp; for(long l=0;l&lt;(*m_pConn)-&gt;Errors-&gt;Count;l++)<BR>&nbsp; {<BR>&nbsp;&nbsp; ErrorPtr pErr;<BR>&nbsp;&nbsp; pErr=(*m_pConn)-&gt;Errors-&gt;GetItem(l);<BR>&nbsp;&nbsp; AfxMessageBox(pErr-&gt;Description);<BR>&nbsp; }&nbsp; <BR>&nbsp;}<BR>&nbsp;catch(...)<BR>&nbsp;{<BR>&nbsp; AfxMessageBox("字段错误对象访问错误,请检查书写是否正确。");<BR>&nbsp;}<BR>#else<BR>&nbsp;MessageBox(NULL,"字段访问发生错误,请确认数据库结构没有改动。","字段访问",MB_ICONINFORMATION);<BR>#endif<BR>&nbsp;<FONT color=#9709f7>// AfxMessageBox("数据库字段访问错误!"); <BR></FONT>}</P>
<P>BOOL CBBRstValues::GetValText(CString &amp;strText, CString &amp;strFieldName)<BR>{<BR>&nbsp;_bstr_t varChunk;<BR>&nbsp;_bstr_t varNotes;<BR>&nbsp;long lngTotalsize,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lngOffSet = 0,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lngChunkSize = 100; <BR>&nbsp;_variant_t vFieldName = _variant_t(strFieldName);<BR>&nbsp;lngTotalsize = (*m_prsThis)-&gt;Fields-&gt;Item[vFieldName]-&gt;ActualSize/2; <BR>&nbsp;if (lngTotalsize &lt;= 0)<BR>&nbsp; return FALSE;</P>
<P>&nbsp;try<BR>&nbsp;{<BR>&nbsp; while (lngOffSet &lt; lngTotalsize)<BR>&nbsp; {<BR>&nbsp;&nbsp; varChunk = (*m_prsThis)-&gt;Fields-&gt;Item[vFieldName]-&gt;GetChunk(lngChunkSize);<BR>&nbsp;&nbsp; varNotes = varNotes + varChunk;<BR>&nbsp;&nbsp; lngOffSet = lngOffSet + lngChunkSize;<BR>&nbsp; }<BR>&nbsp; strText=(char*)varNotes;<BR>&nbsp;}<BR>&nbsp;catch(_com_error)<BR>&nbsp;{<BR>&nbsp; ReportError();<BR>&nbsp; return FALSE;<BR>&nbsp;}<BR>&nbsp;catch(...)<BR>&nbsp;{</P>
<P>#ifdef _DEBUG<BR>&nbsp; AfxMessageBox("获取Text字段未知错误");<BR>#endif<BR>&nbsp; return FALSE;<BR>&nbsp;}</P>
<P>&nbsp;return TRUE;<BR>}</P>
<P>&nbsp;</P>
<P><FONT color=#9709f7>// 上面代码,还有没有完善的地方,更完善的代码,在以后会发表,现在我已经做成了一个DLL,并而还有一些示例文件,需要DLL和示例文件的,请与我联系。EMail: <A href="mailto:seesi@china.com">seesi@china.com</A></FONT></P>
<P>&nbsp;</P>
<P>&nbsp;</P><br><br>
</DIV></div></div>
<script src='../../../get_readnum.asp?id=
7607
'></script>
</center></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -