MFC使用ADO操作数据库

1. ADO概述

ADO是Microsoft为最新和最强大的数据访问范例OLE DB而设计的,是一个便于使用的应用程序层接口。ADO使您能够编写应用程序以通过OLE. DB提供者访问和操作数据库服务器中的数据。ADO最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为ADO,是用了一个比较熟悉的暗喻,OLE自动化接口。

OLE DB是一组“组件对象模型”(COM)接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。OLE DB为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,OLE DB并不局限于ISAM、Jet甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如Microsoft Exchange中的数据。但是,OLE DB应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。所需要的API应该是一座连接应用程序和OLE DB的桥梁,这就是 ActiveX Data Objects (ADO)。

2. 利用ADO操作总体思路

  1. 引入ADO库文件;
  2. 初始化OLE/COM库;
  3. 用Connection对象连接数据库;
  4. 利用建立好的连接,利用Recordset对象取得结果记录集进行查询、处理;
  5. 使用完毕后关闭连接释放对象。

3. 在VC++中使用ADO的步骤

1. 引入ADO库文件

使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:

#import "c:\program files\common files\system\ado\msado15.dll" \no_namespaces \ rename("EOF" adoEOF")

其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。现在不需添加另外的头文件,就可以使用ADO接口了。

2. 初始化OLE/COM库环境

必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。

BOOL CADODataBase1App::InitInstance()

{

AfxEnableControlContainer();

//初始化OLE DLLs

if (!AfxOleInit())   //这就是初始化COM库

{

AfxMessageBox("初始化OLE DLL失败!");

return FALSE;

}

}

3. 使用_ConnectionPtr接口

_ConnectionPtr主要是一个连接接口,取得与数据库的连接。它的连接字符串可以是自己直接写,也可以指向一个ODBC DSN,首先我们需要添加一个指向Connection对象的指针_ConnectionPtr m_pConnection。

_ConnectionPtr m_pConnection;//在头文件stdAfx.h建立连接对象指针

在ADO操作中建议语句中要常用try...catch()来捕获错误信息,因为它有时会经常出现一些意想不到的错误。

BOOL CADODataBase3Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

…………(前面省略)

HRESULT hr;

try

{

hr = m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象

if(SUCCEEDED(hr))

{

hr = m_pConnection->Open("student","","",adModeUnknown);//连接数据库

}

}

catch(_com_error e)                                                                      //捕捉异常

{

CString errormessage;

errormessage.Format("连数据库失败!\r\n错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);                                   //显示错误信息

}

4. 使用_RecordsetPtr接口

_RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。首先,在头文件stdAfx.h中建立记录集对象m_pRecordset。

_RecordsetPtr m_pRecordset; //在头文件stdAfx.h中建立记录集对象

利用m_pRecordset对象取得结果记录集进行查询、处理前,同样使用try...catch()来捕获错误信息。

try

{

m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

}                                  //从数据库中打开表

catch (_com_error e)

{

CString strError;

strError.Format("警告:打开数据表异常。错误信息:%s",e.ErrorMessage());

AfxMessageBox(strError);

return;

}

记录集的遍历、处理:

获取记录集的记录数

_variant_t RecordsAffected;

m_pRecordset=m_pConnection->Execute("SELECT COUNT(*) FROM studentinfo",&RecordsAffected,adCmdText);

_variant_t vIndex = (long)0;

_variant_t vCount = m_pRecordset->GetCollect(vIndex); //取得第一个字段的值放入vCount变量

count=vCount.lVal;

移到第一条记录

m_pRecordset->MoveFirst();

curNo=1;

m_Status.Format("共有%d条记录,当前第%d条",count,curNo);

UpdateData(false);

ShowRecord();//显示记录

移到下一条记录

m_pRecordset->MoveNext();

curNo++;

if(m_pRecordset->adoEOF)

{

m_pRecordset->MoveLast();

}

m_Status.Format("共有%d条记录,当前第%d条",count,curNo);

UpdateData(false);

ShowRecord();//显示记录

移到上一条记录

m_pRecordset->MovePrevious();

curNo--;

if(m_pRecordset->BOF)

{

m_pRecordset->MoveFirst();

}

m_Status.Format("共有%d条记录,当前第%d条",count,curNo);

UpdateData(false);

ShowRecord();//显示记录

移到最后一条记录

m_pRecordset->MoveLast();

curNo=count;

m_Status.Format("共有%d条记录,当前第%d条",count,curNo);

UpdateData(false);

ShowRecord();//显示记录

删除当前记录

void CADODataBase3Dlg::OnRemove()

{

// TODO: Add your control notification handler code here

m_pRecordset->Delete(adAffectCurrent);

OnRadio3();       //删除操作

}

修改记录

m_pRecordset->PutCollect("stuNo",_variant_t(m_strNumber));

m_pRecordset->PutCollect("stuName",_variant_t(m_strName));

m_pRecordset->PutCollect("stuSex",_variant_t(m_strSex));

m_pRecordset->PutCollect("stuAddress",_variant_t(m_strAddress));

m_pRecordset->Update();//提交记录

m_Status="成功修改了一条记录!";

UpdateData(false);

在编辑框中显示记录

void CADODataBase3Dlg::ShowRecord()

{

m_strNumber=(char*)_bstr_t(m_pRecordset->GetCollect("stuNo"));

m_strName=(char*)_bstr_t(m_pRecordset->GetCollect("stuName"));

m_strSex=(char*)_bstr_t(m_pRecordset->GetCollect("stuSex"));

m_strAddress=(char*)_bstr_t(m_pRecordset->GetCollect("stuAddress"));

UpdateData(false);

}

5. 关闭连接释放对象

记录集或连接都可以用Close()方法来关闭:

m_pRecordset->Close();//关闭记录集对象

m_pConnection->Close();//关闭连接对象

至此,利用ADO已经可以实现对数据库的操作,接下来就是对程序框架的完善。

4. 编程步骤

1. 启动Visual C++6.0,生成一个基于对话框的应用程序,将该程序命名为ADODataBase3;

2. 在对话框界面上放置显示记录列表控件和添加、删除记录用的的编辑、按钮控件,具体设置参加代码中对话框资源部分;

3. 使用Class Wizard为添加、修改数据库记录的按钮添加消息响应函数;

4. 添加成程序代码,编译运行程序。

5. 最终界面如下:

MFC使用ADO操作数据库相关推荐

  1. 使用ADO操作数据库时一个好用的VARIANT类!

    inline CString VTOCSTR(VARIANT *v) {  if(v->vt==VT_BSTR)  {   CString str((LPCWSTR)v->bstrVal) ...

  2. [转]VC++下使用ADO操作数据库

    (1).引入ADO类 1 2 3 #import "c:program filescommon filessystemadomsado15.dll" no_namespace re ...

  3. 用MFC类来操作数据库的方法

    MFC ODBC将ODBC API封装在类CDatabase.CRecordSet.CFieldExchange.CRecordView和CDBException中 使用MFC ODBC开发数据库应用 ...

  4. c++ ado操作mysql_利用ADO在C++下操作access数据库

    一.ADO简介 ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口, 是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB, ...

  5. ado 阿里云 mysql_ADO 操作数据库(一)--Ado简介

    ADO是微软一套访问数据源的对象组件模型(COM),它是MDAC(微软数据访问组件)的一部分,MDAC结构如下图: 图.1 MDAC结构图 ADO在编程语言与OLE DB间提供了一个中间层这就允许程序 ...

  6. ODBC OLEDB ADO等数据库访问技术

    花了点时间理了一下数据库访问技术相关的东西,一般地,一个数据库产品的发布后,相应地,会为开发者提供一套访问改数据库的接口,比如MySql提供的C API,可以通过这些数据库产品本身的API进行数据库操 ...

  7. ado批量执行sql mysql_C++ 使用 ADO 批量操作数据库

    使用ADO操作数据库时,如果想要批量插入数据,或者修改数据,可以参考下面的代码:_RecordsetPtr pRecord; pRecord.CreateInstance("ADODB.Re ...

  8. MFC,ADO方式实现数据库操作

    参考: MSDN数据访问编程 (MFC/ATL): https://msdn.microsoft.com/zh-cn/library/kd4ck1tt.aspx?f=255&MSPPError ...

  9. vs2012 MFC连接及操作access(2007)数据库(ADO)

    最近想写个图书管理软件,用到了数据库,但是由于是小白,弄了好半天才把数据库搞明白.虽然网上有一些教程,但大多都是长长的文字叙述,所以想写一个图文版的连接教程并把这两天的经验记录下来. 1.首先打开ac ...

最新文章

  1. MySql配置方法,批处理进行MySql配置
  2. 征集 | 国家标准《信息安全技术 健康医疗信息安全指南》征求意见
  3. React+dva+webpack+antd-mobile 实战分享(二)
  4. 盘点2020国内本科开设人工智能专业高校
  5. 使用VoiceFliter-Lite改进设备上的语音识别
  6. ChipKill内存技术
  7. vb 获取系统声音的电平_质量好的背景音乐系统套装效果图
  8. python xlwings 切片_Python xlwings库学习笔记(1)
  9. MoguBlog(蘑菇博客)v5.3发布,前后端分离博客系统
  10. 清华大学计算机系研究生培养方案,清华大学计算机科学与技术系攻读硕士学位研究生培养方案...
  11. 【学习求职必备】微软亚洲研究院和它的10大AI黑科技
  12. 前端开发 html第三课 列表 超链接 相对路径 图片
  13. linux qemu的使用教程,详解QEMU网络配置的方法
  14. office2020与2016版的不同_Office2016与Office2019,这两个版本有些什么区别
  15. 解决方案:集团型施工企业安全生产数字化管理系统
  16. 织梦dede:memberlist增加会员级别名称
  17. Jmeter 之 Beanshell 用法
  18. htonl,htons 和 ntohs相关问题
  19. DDR SDRAM随路时钟
  20. 【x86架构】MCA

热门文章

  1. NOIP2018游记(更新完毕)
  2. 洛谷P2888 [USACO07NOV]牛栏Cow Hurdles
  3. c# 子窗口与父窗口之间的传值
  4. 解决有效时间的字段的知识查询
  5. 大熊君学习html5系列之------Online Offline(在线状态检测)
  6. jquery $.ajax
  7. 使用Oracle 10g的Logminer挖掘日志
  8. 在线YAML转XML工具
  9. 调整步长支持跨数据库的ID唯一性弊端
  10. 关闭Windows Defender保护