zoukankan      html  css  js  c++  java
  • Visual C++中的ADO编程

    摘  要:本文介绍了微软推出的以ActiveX技术为基础的ADO数据存取技术,分析了ADO的工作原理,并用Visual C++说明了ADO数据访问技术的实现方法。

    关键字:ADO;连接对象;OLE DB;数据存取;记录集

    ADO(ActiveX Date Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术。ADO 技术基于COM(Component Object Model),具有COM组件的诸多优点,可以用来构造可复用应用框架,被多种语言支持,能够访问包括关系数据库、非关系数据库及所有的文件系统。另 外,ADO还支持各种客户/服务器模块与基于Web的应用程序,具有远程数据服务RDS(Remote Data Service)的特性,是远程数据存取的发展方向。

    1  ADO的工作原理

    ADO 封装了OLE DB所提供的接口,是基于OLE DB模型之上的更高层应用,比起OLE DB提供者,ADO的接口可以使程序员在更高级别上同数据交互,并且保留了MFC/ODBC和DAO的特性。ADO技术不仅可以应用于关系数据库,也可以 应用于非关系数据库。可以用统一的方法对不同的文件系统进行访问,大大简化了程序编制,增加了程序的可移植性。

    1.1 ADO的对象

    ADO接口是基于对象集合的,通常比OLE DB对象使用简单。ADO对象不依靠对象层次,大多数情况下,可以简单地创建并只使用需要处理的对象,而不必担心创建许多其他的“父”对象。

    1.2 ADO编程模型[3]

    ADO中的编程模型一般由一个动作序列组成。ADO提供了一组类,可以简化在C++代码中建立这种序列的处理。

    1)接到一个数据源。

    2)定对该数据源的一个查询。

    3)执行该查询。

    4)把查询数据检索到一个能够在C++代码中很容易访问的对象中。

    5)如果需要,则更新该数据源,以反映对该数据的编辑。

    6)提供检测错误的一般方法。

    一般来说,我们需要使用上面提到的ADO编程模型中的所有步骤。但是ADO具有很大的灵活性,根据需要也可以只使用模型中的一部分。例如,我们可以创建一个新的记录集对象,并在代码中为其赋值,不必连接到某个数据源,也不必执行任何查询语句,甚至还可以把记录集对象传送给其它过程或应用程序。

    2         用Visual C++开发ADO应用程序

    使用Visual C++6.0为开发ADO应用程序而提供的动态链接库来开发数据库应用程序,可以灵活地控制应用程序。在进行ADO编程之前我们先建立一个Access数据库MyProject.mdb。

    Visual C++中ADO编程的基本步骤和具体方法。

    1)生成应用程序框架并初始化OLE/COM库环境  

    我们可以使用AfxOleInit()来初始化OLE/COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,代码如下:

    BOOL CADOTestInstance() { AfxOleInit();…}

    2)引入ADO库文件

    Visual C++中通过在程序中使用预编译指令#import来告诉编译器将此指令中指定的动态链接库引入工程中,并从动态链接库中取出其中的对象和信息,产生msado15.tlh和ado15.tli两个头文件来定义ADO库。

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

     #import

    "c:/program files/common files/system/ado/msado15.dll"

    no_namespace

     rename("EOF","adoEOF")
        程序的第三行指示ADO 对象不使用名称空间。在有些应用程序中,由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。如果要使用名称空间,则 可把第三行程序修改为: rename_namespace("AdoNS")。第四行代码将ADO中的EOF(文件结束)更名为adoEOF,以避免与定义了自己的EOF的其他 库冲突。  

    值得注意的是您的环境中msado15.dll不一定在这个目录下,请按实际情况修改。另外,在编译的时候可能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告。

    msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned

    3)创建ADO与数据源的连接

    ADO与数据源的连接是通过连接智能指针来创建的。

    首先我们需要添加一个指向Connection对象的指针,然后调用CreateInstance()来创建一个连接对象的实例,再调用Open()函数来创建与数据源的连接。

    创建ADO的连接,首先要设置ADO连接对象的ConnectionString属性,该属性提供所要连接的数据库类型、数据所处服务器、要访问的数据库和数据库访问的安全认证信息。比较专业的方法是在ConnectionString中直接提供以上信息。其大致过程如下:

    _ConnectionPtr m_pConnection;

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

    m-pConnection->Open ("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=MyProject.mdb","","",adModeUnknown);//连接数据库

    在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的,下面是该方法的原型:

    HRESULT Connection15::Open(_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )

    其中,ConnectionString为连接字串,UserID是用户名, Password是登陆密码。

    可以看出上述的连接属性设置标准随着数据源的类型不同而变化,软件用户常常不习惯这种设置方式,都希望有可视化的数据源设置方法。为此Microsoft 提供了通用数据连接文件(.UDL)来建立和测试ADO连接属性,可以和ODBC一样可视化地定义要连接的数据源,从而实现数据访问的透明性。ADO连接 对象可以很方便地使用UDL文件来连接数据源,下面的例子使用mydata.udl来创建ADO连接。

    _ConnectionPtr m_pDBConnect;

    m_pDBConnect.CreateInstance(__uuidof(Connection));

    m_pDBConnect->ConnectionString ="File Name=c:/mydir/mydata.udl";

    m_pDBConnect->Open("","","",NULL);

    这样一来无论数据源如何变化,在软件中都可以用统一的方法编程。当数据源改变时,只要双击相应的udl文件即可可视化地设置数据源,无需更改软件。

    在你所想创建UDL 文件的目录中单击右键,选择新建|Microsoft 数据连接,然后将新创建的UDL文件更改为你所希望的文件名(.UDL扩展名不能改变)。如果操作系统是Windows 2000,先创建一个文本文件,再将该文本文件的扩展名改为 "udl",然后双击所创建的UDL文件,即可视化地完成数据源的设定。

    4)执行SQL命令并取得结果记录集

    为了取得结果记录集,我们定义一个指向Recordset对象的指针,并为其创建Recordset对象的实例:

    _RecordsetPtr m_pRecordset;

    m_pRecordset.CreateInstance("ADODB.Recordset");

    在ADO中,可以有两种不同的方法执行命令,第一种是调用连接对象的Execute()函数,第二种是使用命令对象,这种方法可以用于更复杂的命令处理和使用参数化命令,下面我们逐一进行阐述。

    ①     利用Connection对象的Execute方法执行SQL命令

    Execute方法的原型如下所示:

    _RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )

    其中,CommandText是命令字串,通常是SQL命令。参数RecordsAffected是操作完成后所影响的行数, 参数Options表示CommandText中内容的类型,Options可以取如下值之一:

    adCmdText:表明CommandText是文本命令

    adCmdTable:表明CommandText是一个表名

    adCmdProc:表明CommandText是一个存储过程

    adCmdUnknown:未知

    Execute执行完后返回一个指向记录集的指针。

    下面以一个执行SQL以建立一张学生信息的表的例子说明如下:

    _variant_t RecordsAffected;

    m_pConnection->Execute("CREATE TABLE myTable(StuID INTEGER,StuName TEXT,Old INTEGER,Birthday DATETIME)",&RecordsAffected,adCmdText);

    ②     利用Command对象来执行SQL命令

    当要执行复杂的命令以及执行带参数的命令时,要使用命令对象对数据源进行操作,这需要创建命令对象并使用命令对象所提供的函数。具体过程如以下代码所示:

    _CommandPtr m_pCommand;

    m_pCommand.CreateInstance("ADODB.Command"); //创建一个命令对象

    m_pCommand->ActiveConnection = m_pConnection;

    //将建立的连接赋值给它

    m_pCommand->CommandText = "SELECT * FROM myTable";

    //指定要执行的SQL命令字符串

    m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);

    //执行命令,取得记录集

    5)记录集的遍历、更新

    ADO提供了在记录集中增加、删除和移动记录的方法,用这些方法可以很方便地遍历和更新记录集。这些方法的使用跟MFC数据库类的方法类似,这里就不再一一说明。

    6)关闭记录集与连接

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

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

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

    读到此处相信读者已经熟悉ADO操作数据库的大致流程了,最后值得指出的是因为ADO是COM接口,为了软件的可靠性,在打开ADO连接时,应该加入异常处理代码。

    3         结束语

    ADO技术具有易于使用、访问灵活、对磁盘和存储容量要求小、应用范围广等特点,其优越性已经在笔者用Visual C++6.0开发的电力系统接线图动态配置软件中得到了很好的体现。了解和掌握ADO技术具有深远的意义。

  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3848408.html
Copyright © 2011-2022 走看看