文章转自:http://blog.sina.com.cn/s/blog_a43aba5601014z8h.html

一、数据库操作准备

1、导入ADO动态链接库

在工程的stdafx.h中加入如下语句:

这一语句有何作用呢?其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh和msado15.tli两个C++头文件来定义ADO库,即加载ADO动态库(msado15.dll)。

其中,no_namespace表明不使用命名空间,rename("EOF","adoEOF")表明把ADO中用到的EOF改为adoEOF,防止发生命名冲突。

注意:该代码需要在一行中完成,如果写成两行或者多行,行末要加上“\”符号,表示把这几行看成一行,如本例。

2、初始化OLE/COM库环境

在基于MFC的应用里,初始化OLE/COM库环境的一个比较好的位置是在应用类的InitInstance成员函数中,而且直接使用AfxOleInit,在退出应用时,该函数也负责COM资源的释放,将此函数添加在InitInstance中的如下位置:

Return FALSE;
        }
       ......
}

说明:也可以在InitInstance中使用::CoInitialize初始化OLE/COM库环境,但须在ExitInitInstance中使用::CoUninitialize释放占用的COM资源,显然使用AfxOleInit更为方便。

3、连接数据库

在Doc\View程序中,通常在应用类(App类)中进行数据库的连接。

1)声明一个Connection指针

_ConnectionPtr m_pConnection;

注:ADO最重要的三个对象有三个:连接对象(Connection)、命令对象(Command)和记录集对象(RecordSet)。在使用这三个对象的时候,需要定义与之相对应的智能指针最后是自动进行内存释放的。

所有的智能指针都是基于_com_ptr_t模板类的,该类封装了IUnknow接口的3个方法:QueryInterface、Addref和Release。它具有自动计数的机制,即在构造对象时,自动为该对象计数加1。析构对象时,自动调用Release方法。(即该类型的指针在使用后不需要手动释放内存)(但需要调用Close方法,关闭连接或者记录集)所以智能指针会使代码更加简洁并且不易出错。

2)创建Connection对象

m_pConnection.CreateInstance(__uuidof(Connection));

m_pConnection.CreateInstance("ADODB.Connection");

上述两种方法均可。

注意:上面调用_ConnectionPtr接口指针的方法CreateInstance时,用的是“.”而非

“->”。

3)设置连接字符串,以便指定需要的连接

3.1) 使用JET数据库引擎实现对Acess2000类型的数据库info.mdb的连接

CString strSQL="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=info.mdb;User ID=admin;Passward=;";

或者

CString strSQL=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=info.mdb;User ID=admin;Passward=;");

3.2) 使用OLE DB提供者实现对SQL Server的标准安全连接串

strConnect=_T("Provider=sqloledb;Data Source=MyServerName;"

"Initial Catalog=MyDateBaseName;"

"User ID=MyUserName;Password=MyPassword;");

例程:

注意:上面设置连接字符串的时候,如果过长需要分行时,则每一行都要加上双引号,在最后加上分号即可。

如果是本地服务器,则DataSource=local或本地服务器名均可

若数据库没有设置密码,在连接字符串中可以将其省略,但User ID不能省

若数据库和程序文件不在同一文件夹下,直接写数据库名即可,在InitialCatalog中不需加上该数据库的存储器地址

3.3) 使用OLE DB提供者实现对远程SQL Server的标准安全连接串

strConnect=_T("Provider=sqloledb;Network Library=DBMSSOCN;"

"Data Source=130.120.110.001,1433;"

"Initial Catalog=MyDateBaseName;"

"User ID=MyUserName;Password=MyPassword;");

      4)、使用m_pConnection的Open方法实现对数据库的连接

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

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

4、关闭连接

一般重载App类的ExitInstace( )函数实现

调用m_pConnection的Close方法关闭连接即可

m_pConnection->Close( );

m_pConnection=NULL;

注意:由于初始化COM库调用的是AfxOleInit,这种方法初始化COM库的优点就在于资源    的释放也是自动进行的,所以不必担心资源泄漏的问题。

二、数据库操作

ADO库中包含的三个基本接口为_ConnectionPtr接口、_CommandPtr接口、_RecordsetPtr接口。

1、_ConnectionPtr接口

该接口返回一个记录集或一个空指针。

不推荐使用_ConnectionPtr接口返回一个记录集,对于要返回记录集的操作通常用_RecordsetPtr来实现,而且使用_ConnectionPtr时要想得到记录数目必须遍历所有记录,但使用_RecordsetPtr时则不需要。

2、_CommandPtr接口

该接口返回一个记录集。

它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。

在使用_CommandPtr接口时,可以利用全局_ConnectionPtr接口,也可以在_CommandPtr

接口里直接使用连接串。如果只执行一次或者几次数据库访问操作,后者是比较好的选择。但是,如果频繁访问数据库,并要返回很多记录集,那么应该使用全局_ConnectionPtr接口创建一个数据库连接,然后使用_CommandPtr接口执行存储过程和SQL语句。

       3、_RecordsetPtr接口

该接口是一个记录集对象。

与前两种对象相比,注意:可以使用Recordset对象来执行查询命令,但如果查询或者存储过程是需要参数的,这时就只能使用Command对象。

        使用Recordset对象操作数据库:

       假定已经成功使用Connection对象创建了数据源的连接,连接指针为m_pConnection。

1)创建记录集

声明记录集指针        _RecordsetPtr    m_pRecordset;

创建记录集                m_pRecordset.CreateInstance(__uuidof(Recordset));

2)打开记录集

记录集指针创建完毕后,调用该指针的Open方法打开记录集。

该函数声明如下:

HRESULT Recordset15::Open ( const _variant_t & Source,

const _variant_t & ActiveConnection,

enum CursorTypeEnum CursorType,

enum LockTypeEnum LockType,

long Options ) ;

各个参数的含义如下:

参数Source:为_variant_t类型的引用,可以为有效的Command对象、SQL语句、表名、存储过程调用等。

参数ActiveConnection:为_variant_t类型的引用,为已经建立好的连接。

参数CursorType:用于设置在打开Recordset时提供者应使用的游标类型,它可取CursorTypeEnum 中的任一值,默认值为adOpenForwardOnly。

参数 LockType:用于设置在打开Recordset时提供者应使用的锁定类型,它可取枚举LockTypeEnum中的任一值,默认值为adLockReadOnly。

参数 Options:用于设置获取Source(即Open第一个参数)的方式,其类型long。

= "select * from mytablename";

m_pRecordset->Open ( _variant_t (strSQL),

adOpenDynamic,
                                                               adCmdText ) ;

m_pConnection.GetInterfacePtr( ),
                                                                  adOpenDynamic,
                                                                  adLockOptimistic,
                                                                  adCmdTable ) ;

直接使用表名作为第一个参数,此时Options应为adCmdTable

3)遍历记录集

一般在返回记录集时,通常要遍历结果记录集,以便查看或编辑某一条记录,Recoreset指针提供了几个用于实现遍历的方法。

注意:为了避免发生异常,一般在使用MoveFirst、MovePrev之前,需要使用记录集的指针BOF属性来检测当前的记录集指针是否位于第一条记录之前;在使用MoveLast、MoveNext之前需要使用记录集指针的EOF属性来检测当前的记录集指针是否位于最后一条记录之后。

4)记录集定位

记录集接口类提供了两种定位方法:绝对定位和书签定位

前者通过设置或者获取AbsolutePosition属性即可,其值从1开始,并且当前记录为记录集中第一条记录时等于1

对于后者可以通过设置或获取BookMark属性即可

5)访问记录集

最简单的方法是直接使用如下语句:

m_pRecordset->GetCollect (字段名);

设置字段值:

m_pRecordset->PutCollect (字段名,新值);

两个方法的原型:

_variant_t GetCollect ( const _variant_t & Index )

void PutCollect ( const _variant_t & Index , const _variant_t &pvar )

其中:参数Index可以是字符串表示字段名,也可以是整型,表示字段对应的序号。

pvar表示要写入的变量值。

例如:

_variant_t var;

var=m_pRentRecordset->GetCollect(long(0));   都可以

6)记录集更新

更新记录集包括添加新的记录、编辑当前记录和删除当前记录

记录集接口指针对这三种操作分别提供了相应的方法

编辑当前记录:Edit

删除当前记录:Delete

注意:记录集接口指针针对AddNew以及Edit方法提供了Update方法,用于在数据库中更新新添加或者编辑后的记录。

AddNew方法:用于添加新纪录(该添加是直接在表的末尾续加的),该方法可以使用参数,在参数中指定要添加的新纪录;也可以不使用参数,而在后面使用PutCollect方法,并需使用Update函数保存新纪录。

Update方法:用于保存从调用AddNew方法以来所作的任何更改。

m_pRecordset->PutCollect("单位地址",_variant_t(m_strComAddr));

//更新数据库-将新纪录存入数据库
        m_pRecordset->Update();

7)记录集关闭

在对记录集的操作完成后,必须及时关闭记录集。

{

m_pRecordset ->Close( );

m_pRecordset =NULL;

}

MFC中使用ADO方式连接数据库的更多相关文章

  1. VC++中使用ADO方式操作ACCESS数据库

    ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为 ...

  2. MFC中使用ADO进行数据库操作

    参考FROM:http://hi.baidu.com/sunkanghome/item/e1fda510b3186359f1090ee2 数据库与数据库编程: 当前各种主流数据库有很多,包括Oracl ...

  3. 通过ADO方式连接数据库

    首先你正确安装了MySQL的数据库驱动程序(mysql-connector-odbc-5.1.6-win32.msi )或者64位的 本地连接: 1.在桌面上新建一个空的文本文件mysql.txt,重 ...

  4. 在MFC里面使用ADO访问微软的ACCESS数据库 实现增删改查

    声明:百度以外的公司可以自由转载该文. 正如我上一篇博文提到,ADO这货和MFC没有任何关系,ADO 是一个独立的组件.所以为了使用ADO 我们就要把ADO引入到MFC中. ADO是硬盘上的表现形式是 ...

  5. 第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

    第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform ...

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

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

  7. MFC 中 Tooltip 实现的几种方式

    方法一:利用CWnd本身自身支持的tooptip来实现,这种方法适用给控件增加tooltip,非常方便和简单方法如下:1.在窗口中增加消息映射ON_NOTIFY_EX(TTN_NEEDTEXT, 0, ...

  8. VC中使用ADO操作数据库的方法 SQL2000

    (1).引入ADO类 #import "c:\program files\common files\system\ado\msado15.dll" \ no_namespace \ ...

  9. VC中使用ADO操作数据库的方法

    源地址:http://blog.csdn.net/xiaobai1593/article/details/7459862 准备工作: (1).引入ADO类 #import "c:\progr ...

随机推荐

  1. 推荐Mac软件Alfred

    实在忍不住推荐这个软件了, 身边的朋友们逐渐都在使用Mac OS了,每次我都会推荐Alfred这个软件.推荐来推荐去挺蛮烦的,干脆写篇文章, 下次有朋友新入手Macbook,我就直接附送本文章链接一枚 ...

  2. MySQL 查询结果保存为CSV文件

    MySQL支持将查询结果直接导出为文本格式,格式如下: into outfile '导出的目录和文件名'                  指定导出的目录和文件名 fields terminated ...

  3. Python Udp Socket

    socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...

  4. Run Loops

    Run Loops Run loops是线程相关的的基础框架的一部分.一个run loop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件.使用run loop的目的是让你的线程在有工作的时 ...

  5. While reading XXX pngcrush caught libpng error: N

    错误一:   While reading /XXX/XXX/XXX/img1.png pngcrush caught libpng error:   Not a PNG filCould not fi ...

  6. iOS应用崩溃日志分析-备用

    作为一名应用开发者,你是否有过如下经历?   为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! ...

  7. Android中写入读取XML

    获取XML文件的基本思路是,通过getResources().getXml()获的XML原始文件,得到XmlResourceParser对象,通过该对象来判断是文档的开头还是结尾,是某个标签的开始还是 ...

  8. perl 登录某网站

    <pre name="code" class="html">use Net::SMTP; use LWP::UserAgent; use HTTP: ...

  9. sql server Convert 的函数的用法 转换成浮点数

    SELECT a.ijjdid ,b.ICYDID 订单ID,b.CCYDH 订单编号,b.CWYDH 委印单号,b.CYJMC 印件名称,b.CYJLX 印件类型,b.CYWDWMC 客户名称,b. ...

  10. poj2752 Seek the Name, Seek the Fame

    Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...