1、ado方式操作数据库类ado方式操作数据库类 VC/MFC数据库新任版主zyq5945(竹叶青)在数据库版开设帖子整理的一些ADO数据库入门与例子,为了表示支持我在其中回复了一个自己平时用的ado操作数据库的类。怎奈论坛对回帖字数有限制,结果只贴了头文件.不过竹叶青版主邀请我把这个类整理到博客里以便分享,我觉得这个办法不错。不过既然要整理到博客里就应该更正式一些,所以花些时间规范了一下这个类,并且制作了一个简单的使用范例,也算是对竹版的支持,对数据库版的一点小小的贡献吧。 好久没写博客了,其实应该多说两句介绍一下这个类和其简单的使用。不过自己在数据库方面确实知之甚少,这个类其实也是抄来的,只不
2、过在自己的使用过程中“本土化”了一下,呵呵。所以就不班门弄斧了,直接上代码吧,希望能对有志于涉足于数据库应用技术的同僚们有所帮助,按竹版的话说算是“入门实例”吧。使用范例本例中操作的数据库为ACCESS2003,操作方式为本地连接,数据库带密码 类实现代码头文件cpp view plaincopy#pragma once #include math.h #import MSADO15.DLL rename_namespace(ADOWE) rename(EOF,EndOfFile) using namespace ADOWE; class CDBAdo public: _CommandPtr
3、m_ptrCommand; /命令对象 _RecordsetPtr m_ptrRecordset; /记录集对象 _ConnectionPtr m_ptrConnection; /数据库对象 CString m_strConnect, /连接字符串 m_strErrorMsg; /错误信息 public: CDBAdo(void); CDBAdo(void); void DetectResult(HRESULT hResult); void RecordErrorMsg(_com_error comError); CString GetLastError()return m_strErrorM
4、sg; bool CreateInstance(); bool SetConnectionString(CString strDriver, CString strIP, WORD wPort, CString strCatalog, CString strUserID, CString strPassword); bool SetConnectionString(CString strDriver, CString strDataSrc, CString strPassword); bool OpenConnection(); bool CloseConnection(); bool IsC
5、onnecting(); void ClearAllParameters(); void AddParamter(LPCTSTR lpcsrName, ADOWE:ParameterDirectionEnum Direction, ADOWE:DataTypeEnum Type, long lSize, _variant_t & vtValue); void SetSPName(LPCTSTR lpcsrSPName); bool ExecuteCommand(bool bIsRecordset); bool Execute(LPCTSTR lpcsrCommand); long Ge
6、tReturnValue(); bool OpenRecordset(char* szSQL); bool CloseRecordset(); bool IsRecordsetOpened(); bool IsEndRecordset(); void MoveToNext(); void MoveToFirst(); void MoveToLast(); long GetRecordCount(); bool GetFieldValue(LPCTSTR lpcsrFieldName, WORD& wValue); bool GetFieldValue(LPCTSTR lpcsrFiel
7、dName, CString& strValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, INT& nValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, BYTE& bValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, LONG& lValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, DWORD& dwValue); bool GetFieldValue(L
8、PCTSTR lpcsrFieldName, UINT& ulValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, DOUBLE& dbValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, _int64& llValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, COleDateTime& Time); bool GetFieldValue(LPCTSTR lpcsrFieldName, bool& bValue
9、); ; 实现文件cpp view plaincopy#include StdAfx.h #include DBAdo.h CDBAdo:CDBAdo(void) m_strConnect = _T(); m_strErrorMsg = _T(); /初始化 COM CoInitialize(NULL); CDBAdo:CDBAdo(void) /关闭连接 CloseConnection(); /释放对象 if(m_ptrCommand!=NULL) m_ptrCommand.Release(); if(m_ptrRecordset!=NULL) m_ptrRecordset.Release(
10、); if(m_ptrConnection!=NULL) m_ptrConnection.Release(); bool CDBAdo:CreateInstance() /创建对象 m_ptrCommand.CreateInstance(_uuidof(Command); m_ptrRecordset.CreateInstance(_uuidof(Recordset); m_ptrConnection.CreateInstance(_uuidof(Connection); if(m_ptrCommand=NULL) m_strErrorMsg = _T(数据库命令对象创建失败); return
11、 false; if(m_ptrRecordset=NULL) m_strErrorMsg = _T(数据库记录集对象创建失败); return false; if(m_ptrConnection=NULL) m_strErrorMsg = _T(数据库连接对象创建失败); return false; /设置变量 m_ptrCommand->CommandType = adCmdStoredProc; return true; void CDBAdo:DetectResult(HRESULT hResult) if(FAILED(hResult) _com_issue_error(hRe
12、sult); void CDBAdo:RecordErrorMsg(_com_error comError) _bstr_t bstrDescribe(comError.Description(); m_strErrorMsg.Format(TEXT(ADO 错误:0x%8x,%s), comError.Error(), (LPCTSTR)bstrDescribe); bool CDBAdo:SetConnectionString(CString strDriver, CString strIP, WORD wPort, CString strCatalog, CString strUserI
13、D, CString strPassword) CString strProvider, strPWD, strUID, strData, strDataSrc; strProvider.Format(_T(Provider=%s;), strProvider); strPWD.Format(_T(Password=%s;), strPassword); strUID.Format(_T(User ID=%s;), strUserID); strData.Format(_T(Initial Catalog=%s;), strCatalog); strDataSrc.Format(_T(Data
14、 Source=%s,%ld;), strIP, wPort); /构造连接字符串 m_strConnect = strProvider+strPWD+_T(Persist Security Info=True;)+strUID+strData+strDataSrc; return true; bool CDBAdo:SetConnectionString(CString strDriver, CString strDataSrc, CString strPassword) CString strProvider, strDataSource, strPWD; strProvider.Form
15、at(_T(Provider=%s;), strDriver); strDataSource.Format(_T(Data Source=%s;), strDataSrc); strPWD.Format(_T(Jet OLEDB:DataBase Password=%s;), strPassword); /构造连接字符串 m_strConnect = strProvider+_T(User ID=Admin;)+strDataSource+strPWD; return true; bool CDBAdo:OpenConnection() try /关闭连接 CloseConnection();
16、 /连接数据库 DetectResult(m_ptrConnection->Open(_bstr_t(m_strConnect), , , adModeUnknown); m_ptrConnection->CursorLocation = adUseClient; m_ptrCommand->ActiveConnection = m_ptrConnection; return true; catch(_com_error& comError) RecordErrorMsg(comError); return false; bool CDBAdo:CloseConnec
17、tion() try CloseRecordset(); if(m_ptrConnection!=NULL)&&(m_ptrConnection->GetState()!=adStateClosed) DetectResult(m_ptrConnection->Close(); return true; catch(_com_error& comError) RecordErrorMsg(comError); return false; bool CDBAdo:IsConnecting() try /状态判断 if(m_ptrConnection=NULL)
18、 return false; if(m_ptrConnection->GetState()=adStateClosed) return false; /参数判断 long lErrorCount = m_ptrConnection->Errors->Count; if(lErrorCount>0L) ErrorPtr pError = NULL; for(long i=0; i<lErrorCount; i+) pError = m_ptrConnection->Errors->GetItem(i); if(pError->Number=0x80
19、004005) return false; return true; catch(_com_error& comError) RecordErrorMsg(comError); return false; bool CDBAdo:OpenRecordset(char* szSQL) try /关闭记录集 CloseRecordset(); m_ptrRecordset->Open(szSQL, m_ptrConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); return true; c
20、atch(_com_error& comError) RecordErrorMsg(comError); return false; bool CDBAdo:CloseRecordset() try if(IsRecordsetOpened() DetectResult(m_ptrRecordset->Close(); return true; catch(_com_error& comError) RecordErrorMsg(comError); return false; bool CDBAdo:IsRecordsetOpened() if(m_ptrRecords
21、et=NULL) return false; if(m_ptrRecordset->GetState()=adStateClosed) return false; return true; bool CDBAdo:IsEndRecordset() try return (m_ptrRecordset->EndOfFile=VARIANT_TRUE); catch(_com_error& comError) RecordErrorMsg(comError); return true; void CDBAdo:MoveToNext() try m_ptrRecordset-&g
22、t;MoveNext(); catch(_com_error& comError) RecordErrorMsg(comError); void CDBAdo:MoveToFirst() try m_ptrRecordset->MoveFirst(); catch(_com_error& comError) RecordErrorMsg(comError); void CDBAdo:MoveToLast() try m_ptrRecordset->MoveLast(); catch(_com_error& comError) RecordErrorMsg(c
23、omError); long CDBAdo:GetRecordCount() try if(m_ptrRecordset=NULL) return 0; return m_ptrRecordset->GetRecordCount(); catch(_com_error& comError) RecordErrorMsg(comError); return 0; void CDBAdo:ClearAllParameters() try long lParamCount = m_ptrCommand->Parameters->Count; if(lParamCount&g
24、t;0L) for(long i=lParamCount; i>0; i-) _variant_t vtIndex; vtIndex.intVal = i-1; m_ptrCommand->Parameters->Delete(vtIndex); catch(_com_error& comError) RecordErrorMsg(comError); void CDBAdo:AddParamter(LPCTSTR lpcsrName, ADOWE:ParameterDirectionEnum Direction, ADOWE:DataTypeEnum Type, l
25、ong lSize, _variant_t & vtValue) ASSERT(lpcsrName!=NULL); try _ParameterPtr Parameter = m_ptrCommand->CreateParameter(lpcsrName, Type, Direction, lSize, vtValue); m_ptrCommand->Parameters->Append(Parameter); catch(_com_error& comError) RecordErrorMsg(comError); void CDBAdo:SetSPName
26、(LPCTSTR lpcsrSPName) try m_ptrCommand->CommandText = lpcsrSPName; catch(_com_error& comError) RecordErrorMsg(comError); bool CDBAdo:ExecuteCommand(bool bIsRecordset) try /关闭记录集 CloseRecordset(); /执行命令 if(bIsRecordset) m_ptrRecordset->PutRefSource(m_ptrCommand); m_ptrRecordset->CursorLo
27、cation = adUseClient; DetectResult(m_ptrRecordset->Open(IDispatch*)m_ptrCommand, vtMissing, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified); else m_ptrConnection->CursorLocation = adUseClient; DetectResult(m_ptrCommand->Execute(NULL, NULL, adExecuteNoRecords); return true; catch(_co
28、m_error& comError) RecordErrorMsg(comError); return false; bool CDBAdo:Execute(LPCTSTR lpcsrCommand) try m_ptrConnection->CursorLocation = adUseClient; m_ptrConnection->Execute(lpcsrCommand, NULL, adExecuteNoRecords); return true; catch(_com_error& comError) RecordErrorMsg(comError); r
29、eturn false; long CDBAdo:GetReturnValue() try _ParameterPtr ptrParam; long lParameterCount = m_ptrCommand->Parameters->Count; for(long i=0; i<lParameterCount; i+) ptrParam = m_ptrCommand->Parameters->Itemi; if(ptrParam->Direction=adParamReturnValue) return ptrParam->Value.lVal;
30、catch(_com_error& comError) RecordErrorMsg(comError); return 0; bool CDBAdo:GetFieldValue(LPCTSTR lpcsrFieldName, WORD& wValue) wValue = 0L; try _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; if(vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY) wValue = (W
31、ORD)vtFld.ulVal; return true; catch(_com_error& comError) RecordErrorMsg(comError); return false; bool CDBAdo:GetFieldValue(LPCTSTR lpcsrFieldName, CString& strValue) try _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; if(vtFld.vt=VT_BSTR) strValue = (char*)_bstr_t(vtFld); strValue.TrimLeft(); return true; return false; catch(_com_error& comError) RecordErrorMsg(comError); return false; bool CDBAdo:GetFieldValue(LPCTSTR lpcsrFieldName, INT& nValue) nValue = 0; try _variant_t vtFld = m_ptrRec
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1