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技术具有深远的意义。

  • 相关阅读:
    .NET Core依赖注入集成Dynamic Proxy
    MediatR-进程内的消息通信框架
    03-EF Core笔记之查询数据
    02-EF Core笔记之保存数据
    01-EF Core笔记之创建模型
    EF Core 基础知识
    CQRS+ES项目解析-Equinox
    CQRS+ES项目解析-Diary.CQRS
    不要让事实妨碍好故事:Facebook精准广告产品与硅谷创业揭秘,4星奇书《混乱的猴子》
    会讲故事的前物理学家万维钢解读、推荐过的书24本,好书一半
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3848408.html
Copyright © 2011-2022 走看看