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