- 浏览: 41962 次
- 性别:
- 来自: 大连
最新评论
连接ACCESS为例:
//头文件 #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); }; //实现文件 [cpp] view plaincopyprint?#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; }
发表评论
-
c++操作符优先级总结
2013-12-03 14:47 792优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有 ... -
Qt状态机实例
2013-12-03 14:01 1099#include <QApplication> ... -
c++数据类型的隐形转换
2013-09-02 09:51 1676(1)隐式转换发生的时机:当传递给操作符或者函数的参数与指定类 ... -
C中的野指针
2013-08-30 16:11 1048讨论一 什么是野指针 ... -
STL学习(转)
2012-08-28 15:38 1440STL就是Standard Template Libr ... -
STL详解
2012-08-28 14:33 1748STL概述 STL的一个重要 ... -
c++的三种继承(转)
2012-08-23 18:47 1084http://blog.csdn.net/wang_lime ... -
MFC OpenGL标签云 (转)
2012-08-22 11:21 1262初识标签云是在去年年末,一看到这个应用我就特别感兴趣。还记 ... -
派生类的构造函数(转)
2012-08-20 18:05 989派生类的数据成员由所 ... -
元算符重载时友元函数和成员函数的选择
2012-08-18 20:14 1411一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好 ... -
C++面试题(转)
2012-08-16 17:25 8171.是不是一个父类写了一个virtual 函数,如果子类覆盖它 ... -
8皇后问题c++的递归实现
2012-08-16 16:18 1494最近用C++递归形式实现了8皇后问题,可能效率有点低 #i ... -
c++实现的一些排序算法
2012-08-15 11:37 1389最近用c++简单实现了一些排序算法,记下来,以便以后用到 ... -
mfc 常用控件使用方法及常见数据类型转换
2012-04-18 20:31 2098最近做了几个mfc小程序,想把我们经常用到而又经常忘记的的小知 ...
相关推荐
给出了MFC使用ADO读写Access数据库实例 ,包括具体实现思路,和相关的实现代码
MFC使用ADO读写Access数据库实例-免费
通过这个MFC ADO连接SQL Server 2005的实例,我们可以了解到如何在MFC应用程序中使用ADO进行数据库操作的基本流程。这包括初始化COM环境、创建和配置数据库连接、执行SQL查询、处理查询结果以及清理资源。开发者可以...
在MFC项目中使用ADO访问SQL Server数据库,首先需要配置连接字符串。连接字符串包含了数据库服务器的位置、身份验证方式以及目标数据库等信息。 - **Integrated Security**:表示使用Windows身份验证。 - 示例:`...
在MFC中使用ADO(ActiveX Data Objects)来读写Access数据库是一种常见的数据库操作方式,特别是对于Visual C++开发者而言。ADO提供了一个简单且高效的接口,允许开发者与各种数据库进行交互,包括Access。以下是...
在本文中,我们将深入探讨如何使用MFC(Microsoft Foundation Classes)和ADO(ActiveX Data Objects)来连接并操作MySQL数据库。MFC是微软提供的一种C++库,它为Windows应用程序开发提供了丰富的支持,而ADO则是一...
在MFC中创建DataAdo项目对话框,在资源视图上加上一个list control控件,变量名m_list,Styles View设为Report。在项目DataAdo文件下创建db1的ACESS数据库,表名为表1,字段名称姓名、性别。 1、在stdafx.h头文件...
### VS2010中MFC的ADO方式访问数据库 #### 一、概述 Microsoft Foundation Classes(MFC)是Visual C++的一个类库,用于简化Windows应用程序开发过程。MFC支持多种技术,其中包括ActiveX Data Objects(ADO),一...
mfc ado 数据库实例 mfc /vc6.0ado连接数据库的实例例程
本资源“MFC ADO数据库编程分解实例”特别适合初学者,旨在帮助他们理解和掌握如何在MFC环境中利用ADO进行数据库操作,包括增、删、查、改四大基本功能。 首先,让我们深入了解一下MFC和ADO: 1. **MFC**:这是一...
在本文中,我们将深入探讨如何在MFC(Microsoft Foundation Classes)应用程序中利用ADO(ActiveX Data Objects)来访问数据库,并将数据展示在CListCtrl控件中。这是一套高效且直观的方式,适用于开发需要与数据库...
在使用MFC(Microsoft Foundation Classes)进行数据库应用开发时,ADO(ActiveX Data Objects)提供了一种简单且灵活的方式来访问数据库,尤其是对于那些不熟悉底层技术如OLE DB和COM的开发者。ADO是建立在OLE DB之...
例如,“第21章 ADO数据库编程”很可能包含了一系列的实例,讲解如何使用MFC ADO进行数据库操作,包括连接数据库、执行查询、处理结果集等步骤。 总之,MFC ADO为VC程序员提供了一种高效、灵活的数据库访问方式,...
通过本教程提供的"基于MFC的ADO数据库分解实例",你将能够逐步学习如何在MFC应用程序中使用ADO进行数据库操作。这个实例将涵盖创建数据库连接、编写SQL查询、处理结果集以及数据的增删改查等核心功能,对初学者来说...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来实现对ActiveX Data Objects (ADO) 数据库的基本操作。对于那些刚开始接触数据库编程的开发者来说,这是一个很好的起点,因为MFC提供了一种...
MFC程序设计详细实例 第21章 ADO数据库编程MFC程序设计详细实例 第21章 ADO数据库编程MFC程序设计详细实例 第21章 ADO数据库编程MFC程序设计详细实例 第21章 ADO数据库编程MFC程序设计详细实例 第21章 ADO数据库编程...
在本文中,我们将深入探讨如何使用Visual C++(VC++)结合ActiveX Data Objects(ADO)来连接并操作Microsoft Access数据库。这是一个常见的编程任务,对于开发Windows桌面应用程序来说尤其重要,因为ADO提供了一种...
在使用MFC进行Windows应用程序开发时,经常需要对数据进行操作,因此,通过MFC利用ADO进行SQL Server数据库连接便成为一种常见的需求。 ### 实现步骤 1. **创建MFC项目**:在VC6.0中创建一个基于对话框的MFC应用...
在MFC应用中,使用ADO(ActiveX Data Objects)来操作数据库是一种常见的方式。ADO是微软提供的一个高层级的数据访问接口,它建立在OLE DB之上,简化了对数据库的访问,支持多种编程语言,包括C++。以下是关于MFC与...