VC/MFC数据库新任版主zyq5945(竹叶青)在数据库版开设帖子整理的一些ADO数据库入门与例子,为了表示支持我在其中回复了一个自己平时用的ado操作数据库的类。怎奈论坛对回帖字数有限制,结果只贴了头文件......不过竹叶青版主邀请我把这个类整理到博客里以便分享,我觉得这个办法不错。不过既然要整理到博客里就应该更正式一些,所以花些时间规范了一下这个类,并且制作了一个简单的使用范例,也算是对竹版的支持,对数据库版的一点小小的贡献吧。
好久没写博客了,其实应该多说两句介绍一下这个类和其简单的使用。不过自己在数据库方面确实知之甚少,这个类其实也是抄来的,只不过在自己的使用过程中“本土化”了一下,呵呵。所以就不班门弄斧了,直接上代码吧,希望能对有志于涉足于数据库应用技术的同僚们有所帮助,按竹版的话说算是“入门实例”吧。
使用范例
本例中操作的数据库为ACCESS2003,操作方式为本地连接,数据库带密码
类实现代码
头文件
view plaincopy to clipboardprint?#pragma once #include "math.h" #import "MSADO15.DLL" rename_namespace("ADOWE") rename("EOF","EndOfFile") using namespace ADOWE; class CDBAdo { public: _CommandPtr 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_strErrorMsg;} 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 IsConnecting(); 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 GetReturnValue(); 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 lpcsrFieldName, 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(LPCTSTR 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); }; #pragma once
#include "math.h"
#import "MSADO15.DLL" rename_namespace("ADOWE") rename("EOF","EndOfFile")using namespace ADOWE;
class CDBAdo{public: _CommandPtr 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_strErrorMsg;}
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 IsConnecting();
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 GetReturnValue();
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 lpcsrFieldName, 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(LPCTSTR 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);};
实现文件
view plaincopy to clipboardprint?#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(); 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 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(hResult); } 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 strUserID, 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 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.Format(_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(); //连接数据库 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::CloseConnection() { 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) 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==0x80004005) 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; } catch(_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_ptrRecordset==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->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(comError); } } 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>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, long 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(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->CursorLocation = 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(_com_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); } return false; } long CDBAdo::GetReturnValue() { try { _ParameterPtr ptrParam; long lParameterCount = m_ptrCommand->Parameters->Count; for(long i=0; i<lParameterCount; i++) { ptrParam = m_ptrCommand->Parameters->Item[i]; if(ptrParam->Direction==adParamReturnValue) return ptrParam->Value.lVal; } } 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 = (WORD)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_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; switch(vtFld.vt) { case VT_BOOL: { nValue = vtFld.boolVal; break; } case VT_I2: case VT_UI1: { nValue = vtFld.iVal; break; } case VT_NULL: case VT_EMPTY: { nValue = 0; break; } default: nValue = vtFld.iVal; } return true; } catch(_com_error& comError) { RecordErrorMsg(comError); } return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, BYTE& bValue) { bValue = 0; try { _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; switch(vtFld.vt) { case VT_BOOL: { bValue = (vtFld.boolVal!=0)?1:0; break; } case VT_I2: case VT_UI1: { bValue = (vtFld.iVal>0)?1:0; break; } case VT_NULL: case VT_EMPTY: { bValue = 0; break; } default: bValue = (BYTE)vtFld.iVal; } return true; } catch(_com_error& comError) { RecordErrorMsg(comError); } return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, UINT& ulValue) { ulValue = 0L; try { _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) ulValue = vtFld.lVal; return true; } catch(_com_error& comError) { RecordErrorMsg(comError); } return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, DOUBLE& dbValue) { dbValue=0.0L; try { _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; switch(vtFld.vt) { case VT_R4:dbValue = vtFld.fltVal;break; case VT_R8:dbValue = vtFld.dblVal;break; case VT_DECIMAL: { dbValue = vtFld.decVal.Lo32; dbValue *= (vtFld.decVal.sign==128)?-1:1; dbValue /= pow((float)10,vtFld.decVal.scale); } break; case VT_UI1:dbValue = vtFld.iVal;break; case VT_I2: case VT_I4:dbValue = vtFld.lVal;break; case VT_NULL: case VT_EMPTY:dbValue = 0.0L;break; default:dbValue = vtFld.dblVal; } return true; } catch(_com_error& comError) { RecordErrorMsg(comError); } return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, LONG& lValue) { lValue = 0L; try { _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) lValue = vtFld.lVal; return true; } catch(_com_error& comError) { RecordErrorMsg(comError); } return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, DWORD& dwValue) { dwValue = 0L; try { _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) dwValue = vtFld.ulVal; return true; } catch(_com_error& comError) { RecordErrorMsg(comError); } return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, __int64& llValue) { llValue = 0L; try { _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) llValue=vtFld.lVal; return true; } catch(_com_error& comError) { RecordErrorMsg(comError); } return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, COleDateTime& Time) { try { _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; switch(vtFld.vt) { case VT_DATE: { COleDateTime TempTime(vtFld); Time = TempTime; }break; case VT_EMPTY: case VT_NULL:Time.SetStatus(COleDateTime::null);break; default: return false; } return true; } catch(_com_error& comError) { RecordErrorMsg(comError); } return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, bool& bValue) { try { _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value; switch(vtFld.vt) { case VT_BOOL:bValue=(vtFld.boolVal==0)?false:true;break; case VT_EMPTY: case VT_NULL:bValue = false;break; default:return false; } return true; } catch(_com_error& comError) { RecordErrorMsg(comError); } return false; }
本文来自博客,转载请标明出处:http://blog.csdn.net/xianglitian/archive/2010/05/22/5617173.aspx