您的位置:首页 > 编程语言 > C语言/C++

基于Visual Stdio 2010的C++开发数据库基础之ADO(一)

2011-06-16 16:56 381 查看
一、ADO简介

1、ADO概述

ADO(ActiveX Data Objects)即ActiveX数据对象,是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE_DB的一个中间层,允许开发人员编写访问数据的代码,不用关心数据库是如何实现的,只关心到数据库的链接。ADO不仅支持索引顺序访问(ISAM)数据库和基于SQL的关系数据库,还支持其他数据源,可以从不同的数据源访问数据,不仅可以使用SQL查询获取数据,而且可以使用在提供程序中定义查询。

2、ADO对象模型

ADO对象模型主要由连接Connection、命令Command、记录集Recordset,。Connection表示到数据源的一个连接,有关数据操作的对象都属于连接对象。以及几个集合对象Errors、Parameters和Fileds等组成。其对象模型图如下图所示:



1)在程序中使用Connection连接访问数据源,连接是访问数据必须使用的对象,是连接对象化。ADO模型,通过Connection对象实现事务的处理。所谓事务,是指将一系列数据访问操作看做一组操作,其中的任何一个操作失败,则整套操作失败,只有当全部操作步骤都成功,事务才算成功。由于ADO是对OLE DB的封装,因此,Connection对象为连接指定数据源和使用的参数。

2)ADO模型使用Command命令对象使命令对象化,提供命令优化,并用于具体操作数据源。命令可以在数据源中插入、删除或修改数据,也可以在表中检索数据。ADO模型使用Parameter对象使参数对象化,在执行命令前,确定某些取值。之后,再使用这些取值执行命令。

3)Recordset记录集用于存储返回的数据查询集合。可查找、检索、插入、修改或删除记录,并通过其将数据的更改回传到数据库中。ADO模型使用Fileds对象使字段对象化,表示记录行的字段,每个字段具有名称、数据类型和值,其中值表示数据源中当前行的此字段的取值。

4)在执行数据库中的应用程序中随时可能发生错误,例如无法建立建立、执行命令失败等。ADO模型使用Error对象表示错误。任意给定的错误都会产生一个或多个Error对象,随后产生的错误将会放弃先前的Error对象组。

由上可知,每个ADO对象都有一组唯一的“属性”描述或控制对象的行为。属性有内置和动态两种类型。内置类型是ADO对象的一部分并且随时可用。动态属性则由特别的数据提供者添加到ADO对象的属性集合中,仅在提供者被调用时才存在。对象模型以Property对象体现属性。

另外,ADO还提供了“集合”,这是一种可方便地包含其他特殊类型对象的对象类型。使用集合的方法可按名称(文本字符串)或序号(整形数字)对集合中的对象进行检索。ADO模型中提供了4中类型的集合:

1)Connection对象具有Error集合,包含为响应与数据源有关的单一错误而创建的所有Error对象。

2)Command对象具有Parameters集合,包含应用于Command对象的所有Parameter对象。

3)Recordset对象具有Fileds集合,包含所有定义Recordset对象的Filed对象。

4)Connection、Command、Recordset和Filed对象都具有Properties集合,它包含所有属于各个包含对象的Property对象。

除了上面的对象外,ADO还引入了“事件”的概念事件是对将要发生或已经发生的某些操作的通知。在程序中可以通过捕获事件,使用事件传入的参数进行处理。ADO中主要有2种事件:

1)Connection事件:当连接中的事务开始、提交或回滚,Commands执行时,Connections开始或结束时产生的时间。在这些事件中,用户可以通过这些时间判断连接、命令或事务的执行结果。

2)Recordset事件:当在Recordset对象的记录行中进行定位,更改记录集行中的字段,更改记录集中的行,或在整个记录集中进行更改时,会触发此类事件。

二、ADO编程基本流程

1、导入ADO库

在StdAfx.h中加入如下代码:

#import "C:/Program file/common files/system/ado/msado15.dll" /

no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")

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

2、COM初始化有两种方法:

1) #include <afxdisp.h>

bool AFXAPI AfxOleInit();

当返回true时,初始化成功;返回flase时,初始化失败,可能是由于已经安装的OLE系统DLL版本不匹配。

AfxOleInit()函数的相关知识参见http://msdn.microsoft.com/zh-cn/library/e91aseaz

2)使用CoInitialize(NULL)

HRESULT CoInitialize(LPVOID pvReserved);

其中pvReserved可选,保留时为NULL

其返回值为:S_OK(在当前线程中COM库初始化成功)、S_FALSE(当前线程中的COM库已经初始化过了,无需初始化)、RPC_E_CHANGED_MODE(A previous call to CoInitializeEx specified the concurrency model for this thread as multithread apartment (MTA). )。

有关CoInitialize函数更多的细节 参见http://msdn.microsoft.com/en-us/library/ms886303.aspx

3、连接数据库

声明一个Connection对象的智能指针,并对其进行实例化

_ConnectionPtr m_pAppConn;

hResult=m_pAppConn.CreateInstance(_T("ADODB.Connection"));

连接数据库

m_pAppConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source =.//DataBase//aa.mdb","","",adModeUnknown);

参数Data Source为数据源路径

connection对象的Open方法的函数原型如下:

Open(ConnectionString, UserID, Password, Options);

其中

(1)ConnectionString:可选字符串,包含连接信息使用可选的 ConnectionString 参数指定连接字符串,它包含由分号分隔的一系列 argument = value 语句。ConnectionString 属性自动继承用于 ConnectionString 参数的值,因此可在打开之前设置 Connection 对象的 ConnectionString 属性,或在 Open 方法调用时使用 ConnectionString 参数设置或覆盖当前连接参数。
ADO支持ConnectionString属性的四个参数,任何其他参数将直接传递到提供者而不经过ADO处理。ADO支持的参数如下:
参数 说明
1)Provider= 指定用来连接的提供者名称,默认为MSDASQL(Microsoft OLE DB Provider for ODBC),关闭连接时Provider属性为 读/写,打开连接时该属性为只读。
File Name= 指定包含预先设置连接信息的特定提供者的文件名称(例如,持久数据源对象)。

Provider=表示连接提供者。

默认为MSDASQL,即Microsoft OLE DB Provider for ODBC;

当为Microsoft OLE DB Provider for Microsoft Index Server时,Provider=MSIDXS;

当为Microsoft OLE DB Provider for Microsoft Active Directory Service时,Provider=ADSDSOObject;

当为OLE DB Provider for Microsoft Jet时,Provider=Microsoft.Jet.OLEDB.4.0;

当为Microsoft OLE DB Provider for SQL Server时,Provider=SQLOLEDB;

当为Microsoft OLE DB Provider for Oracle时,Provider=MSDAORA;

当为Microsoft Data Shaping Service for OLE DB时,Provider=MSDataShape

当为Microsoft OLE DB Persistence Provider时,Provider=MSPersist

当为Microsoft OLE DB Remoting Provider时,Provider=MS Remote

2)File Name= 指定包含预先设置连接信息的特定提供者的文件名称(例如,持久数据源对象)。
3)Remote Provider= 指定打开客户端连接时使用的提供者名称。(仅限于远程数据服务)
4)Remote Server= 指定打开客户端连接时使用的服务器的路径名称。(仅限于远程数据服务)

(2)UserID:可选,字符串,包含建立连接时所使用用户名。
(3)Password 可选,字符串,包含建立连接时所使用密码。
(4)Options 可选,ConnectOptionEnum 值。决定该方法是在连接建立之后(异步)还是连接建立之前(同步)返回。可以是如下某个常量:
常量 说明
adConnectUnspecified (默认)同步打开连接。
adAsyncConnect 异步打开连接。ConnectComplete 事件可以用于决定连接何时可用。
在对打开的 Connection 的操作结束后,可使用 Close 方法释放所有关联的系统资源。关闭对象并非将它从内存中删除;可以更改它的属性设置并在以后再次使用 Open 方法打开它。要将对象完全从内存中删除,可将对象变量设置为 Nothing。

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

声明一个记录集对象的智能指针并对其进行实例化

_RecordsetPtr m_pRecordset;

m_pRecordset.CreateInstance("ADODB.Recorset");

SQL命令的执行可采用多种形式:

(1)利用Connection对象的Execute方法执行SQL命令,其方法原型如下:

Execute(_bstr_t CommandText,VARIANT *RecordsAffected,long Options)

其中:

CommandText是命令字符串,通常是SQL命令

RecordsAffected是操作完成后所影响的行数

Options表示CommandText中内容的类型,Options可以取如下值:

adCmdText:表明CommandText是文本命令

adCmdTable:表明CommandText是一个表名

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

adCmdUnknown:未知

该函数执行完后返回一个记录集指针。

(2)利用Command对象来执行SQL命令

_CommandPtr m_pCommand;

m_pCommand.CreateInstance("ADODB.Command");

_variant_t vNULL;

vNULL.vt = VT_ERROR;

vNULL.secode = DISP_E_PARAMNOTFOUND; //定义为无参数

m_pCommand->ActiveConnection = m_pConnection;

m_pCommand->CommandText = "SELECT * FROM users"; //命令字串

//执行命令,去的记录集

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

(3)直接用Recordset对象进行查询去的记录集

_RecordsetPtr m_pRecordset;

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open("SELECT * FROM users",_variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

Open方法的原型如下:

HRESULT recordset.Open(const _variant_t &Source, const _variant_t &ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options);

其中:

1)Source 参数是一个_Variant_t,用来计算有效的 Command 对象、命令文本(例如 SQL 语句)、表名称、存储过程调用、URL 、文件名或包含持久存储的 Recordset 的 Stream 对象。如果 Source 是一个文件路径名,那么它可以是完整路径(“C:/dir/file.rst”)、相对路径(“../file.rst”)或 URL(“http://files/file.rst”)。还可在 Recordset 对象的 Source 属性中指定此信息并将 Source 参数保留为空。

2)ActiveConnection参数是已经建立好的连接,可将 Connection 对象或连接字符串作为 ActiveConnection 参数传入

3)CursorTypeEnum参数是游标类型,它是一个枚举类型。其取值范围为:

adOpenUnspecified:指出一个光标类型的不确定值,利用这个光标类型,可以查询OLEDB允许什么样的光标存取。

adOpenForwardOnly:指出使用该连接所形成的光标只允许向前存取,而且在建立了一个连接之后,其他用户所做的更改看不见,主要用于报表。

adOpenKeyset:键盘光标指出所有移动都是允许的,但是其他用户添加的新纪录在建立连接之后对程序来说都是看不见的,对现存记录所做的更改和已删除的记录在建立连接之后都是 可见的。

adOpenDynamic:动态光标是其他用户所做的添加、更改和删除都看得见。而且,在整个记录集中的所有的移动类型都是允许的。

adOpenStatic:静态光标激活所有的移动类型,但在建立连接之后,其他用户所做的任何更改都是看不见得。

4)LockType是锁类型,它是一个枚举类型,其取值范围为:

adLockUnspcified:未指定

adLockReadOnly:只读记录集

adLockPessimistic:数据在更新时锁定其他所有动作,这是最安全的锁定机制。

adLockOptimistic:只有在实际的更新命令中锁定记录,锁定状态维持时间最短,因此,使用的最频繁

adLockBatchOptimistic:在数据库执行批量操作使用,是一个非常不安全的记录锁定形式,但是在应用程序需要处理许多记录时经常使用。

5)Option,长整型值,用于指示提供者如何计算 Source 参数(如果它代表的不是 Command 对象),或从以前保存 Recordset 的文件中恢复 Recordset。其取值范围为:

adCmdText:提示提供者应该将Source作为命令的文本定义来计算

adCmdText:提示ADO生成SQL查询以便从在Source中命名的表中返回所有行。

adCmdTableDirect:指示提供者更改从在Source中命名的表中返回所有行。

adCmdStoreProc:提示提供者应将Source视为存储过程

adCmdUnknown:指示Source参数中的命令类型未知。

5、关闭记录集与连接

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

m_pConnection->Close();

m_pRecordset->Close();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: