ADO编程应用(1)

ado|编程

ADO(ActiveX Data Objects)是基于组件的数据库编程接口,它是一个和编程语言无关的COM组件系统。本文主要介绍用ADO编程所需要注意的技巧和在VC下进行ADO编程的模式,并对C++ Extensions进行了简单的讨论,希望对ADO开发人员有一定的帮助作用。因为ADO是一个和编程语言无关的COM组件系统,所以这里讨论的要点适用于所有的编程语言和编程环境,比如:VB、VBScript、VC、Java等等。
编程技巧
1.显式定义对象类型
实际上,这条准则不仅适用于ADO编程,也适用于其他的与COM对象相关的编程。因为如果一开始就定义变量类型,则编译器在编译的时候就可以知道变量的类型,此时编译器实际上是采用vtable偏移的方式来得到具体的COM对象包含的方法的地址(这一点和C++中虚函数的地址获取方式类似);但如果一开始不指定变量类型的话,比如简单地采用如下的语句:
DIM myCon as Object
或者是:
DIM myCon
这样,编译器在编译的时候就不能得到变量的类型,而只能在运行的时候动态地得到方法的信息(通过使用接口IDispatch的Invoke方法来实现),如此为了得到方法的地址和相关的变量情况就需要在内部进行两次调用,无疑会降低程序的运行速度。
2.绑定列到具体的字段对象
在程序开始时就建立对字段对象的引用,可以避免在每次得到记录后,再在Recordset::Fields中进行查找而增加系统的开销。
例如,可以采用如下所示的代码:
Private Sub TblBrowse_Click()
Dim fld1 As ADODB.Field
Dim fld2 As ADODB.Field
Dim rs As ADODB.Recordset
set rs=g_cn.execute(...)
'g_cn为全局对象adodb.connection
Set fld1 = rs.Fields(“id”) '数据表的字段
Set fld2 = rs.Fields(“name”) ’数据表的字段
If rs.BOF = False Then
While rs.BOF = False
Debug.Print fld1.Value
Debug.Print fld2.Value
rs.MoveNext
Wend
End If
rs.Close
End Sub
3.用SQL语句和存储过程进行数据更新
尽管采用Recordset对象来更新数据是非常方便的,但是它的开销也大,通过数据源对象返回的查询集不仅包含了数据,而且也包含了元数据(metadata),在有些时候元数据可能比数据本身还要大,所以最好采用SQL语句来更新数据。还有要使用存储过程而不是单一的SQL语句来获取信息。因为存储过程是在服务器端执行的,只把结果返回到客户端,这样一方面可以降低网络进行数据交互的开销,另一方面使系统更加容易维护,并且能保持数据的一致性。
4.使用集合操作单条的SELECT语句
在使用游标时,最好使用集合的方法对单条的SELECT语句进行操作。Recordset::get_Collect方法和Recordset::put_Collect方法是Recordset 对象的快捷方式,可以快速地得到一个字段的值而不需要获得关于一个字段的引用。例如,可以采用如下代码:
Sub Collect()
Dim rs As New Recordset
rs.ActiveConnection = “...”
rs.Source=“一条SQL查询语句”
rs.Open
Debug.Print rs.Collect(0),rs.Collect(1),rs.Collect(2)
Debug.Print rs!au_id, rs!au_fname, rs!au_lname
End Sub
5.只查询所需要的数据
尽管很多开发人员都习惯采用“SELECT * FROM TBL”的模式进行查询,但是为了提高系统的效率,如果只需要其中某几个字段的值,最好把这几个字段直接写出来,同时需要限定返回记录集的范围(通过WHERE子句进行限定)。
6.正确选择游标的位置、类型和锁方式
如果只需要按顺序读取记录并且不需要滚动和更新记录,最好使用服务器端游标(adUseServer)、仅向前游标(adOpenForwardOnly)和读加锁(adLockReadOnly),这样可以获得最好的性能。如果需要滚动记录,采用客户端游标(adUseServer)会比采用服务器端游标所得到的性能要好,因为ADO系统默认是采用服务器端游标类型。当然如果数据集合相当大,采用服务器端游标的性能会好一些。同时需要注意:如果采用客户端游标,最好只采用读加锁(adLockReadOnly)的锁类型,因为如果需要更新数据,客户端游标引擎需要得到额外的信息(元数据),而获取这个信息的代价是非常昂贵的。
7.调整记录集对象的CacheSize属性
ADO使用记录集对象的CacheSize属性来决定提取和缓存的记录的数目,当在缓存的范围内浏览数据时,ADO就只从缓存中提取数据。当要浏览的数据超出缓存范围的时候,ADO就释放当前缓存,提取下一些记录(提取的数目为CacheSize所指定的大小),所以必须根据具体的应用程序的情况,来设定CacheSize的大小,保证得到最佳的性能。
8.定义Command对象的参数
在许多数据源中,得到参数信息和执行命令的代价几乎是一样的,所以最好自己在程序中定义好Command参数(也就是说要定义好参数的名称、类型和方向信息),避免一些从数据提供者(Provider)那里获取信息的操作。
9.使用原始的OLE DB提供者
MDAC对许多数据源提供了原始的数据提供者,比如SQL Server、Oracle和Access数据库,这样就不需要再通过ODBC来获取数据(也就是说不需要再通过ODBC驱动这一层),这样的好处是能更快地得到数据,并且能降低磁盘和内存的开销。
10.断开Connection连接
如果使用客户端游标,就要断开Connection连接。ADO有一个特征是当使用客户端游标操作Recordset记录集的时候,不需要和服务器保持联系。所以可以充分利用这个特性降低服务器端的开销(服务器就不需要维护这些连接了)。当操作完记录集需要更新时,可以重新和数据库进行连接来更新数据。为了创建一个可以断开连接的记录集,同时需要使用静态游标(adOpenStatic)和批处理的加锁模式(adLockBatchOptimistic)。下面是有关处理的VC代码:
pRs.CreateInstance(__uuid(Recordset));
pRs->CursorLoction=adUseClient;
pRs->Open(strCmdText,strConnection,adOpenStatic,adLockBatchOptimistic,adCmdText);
pRs->PutRefActiveConnection(NULL);
//对记录集对象pRs进行操作
//重新和数据库建立连接
pRs->PutRefActiveConnectio(pCon);
//批量更新数据
pRs->UpdateBatch(adAffectAll);
需要注意的是:当执行批量更新时,必须自己处理数据冲突问题,因为更新数据时,其他用户也可能同时正在对该数据进行操作。
11.使用adExecuteNoRecords选项
如果不需要返回记录,要使用adExecuteNoRecords选项。ADO 2.0包括一个新的执行选项称为adExecuteNoRecords。当使用该选项的时候,ADO就不会创建记录集对象,不设置任何游标属性。数据提供者因为不需要认证集合的属性而使性能得到优化。具体的例子如下:
con.Execute “insert into tbl values(fv1, fv2) ”, , adExecuteNoRecords
对仅有一条的执行语句采用Connection::Execute方法比使用Recordset::Open方法或者是Command::Execute方法的效果要好,因为ADO不保留任何命令状态的信息,因此执行性能就有所改进。
12.使用session/connection缓冲池
因为数据库的打开和关闭非常消耗系统资源,因此,使用连接池对基于多层的应用的性能会有很大的提高。当使用MDAC的时候,开发人员本身并不需要考虑对数据库连接的缓存,MDAC会自动处理它。连接池在两个层次上提供支持:OLE DB sessions和ODBC连接。如果使用ADO,数据库连接会自动被OLE DB session缓冲池所缓存;如果使用ODBC,可以利用在ODBC数据源管理中新的连接缓冲池选项对ODBC缓冲进行设置。
实现方法
我们知道,在VB下进行基于ADO的编程相对比较简单,只要通过reference加载了适当的类型库后,就可以正常地调用ADO对象。但是对于VC下的基于ADO的数据库开发就稍微复杂一些。VC中实现对ADO操作通常有三种方法:
●#import方法;
●利用MFC OLE的ClassWizard;
●通过Windows API中COM相关的函数。
在这三种方法中,#import是最方便的方法,它允许产生一个类似VB的类结构,使程序开发变得很方便。下面分别介绍这三种方法。
1.#import方法
在#import方法中,需要提供所要包含的类型库的路径和名称,VC能够自动产生一个对GUIDs的定义,以及自动生成对ADO对象的封装。对任何引用的类型库,VC会在编译的时候自动生成两个文件:
●头文件(.tlh):包含了所列举的类型和对类型库中对象的定义;
●实现文件(.tli):对类型库对象模型中的方法产生封装。
例如,在stdafx.h文件中增加对msado15.dd的#import之后,VC会产生msado15.tlh和msado15.tli两个文件。
#import能够使用一个新的类_com_ptr_t,它也被称为智能指针。智能指针能够自动执行QuyerInterface、AddRef和Release函数。
下面的代码演示了如何使用#import在应用中实现对ADO的操作:
#import “c:\program files\co

时间: 2024-12-02 09:22:25

ADO编程应用(1)的相关文章

基本的 ADO 编程模型

ado|编程 基本的 ADO 编程模型 ADO 提供执行以下操作的方式: 连接到数据源.同时,可确定对数据源的所有更改是否已成功或没有发生. 指定访问数据源的命令,同时可带变量参数,或优化执行. 执行命令. 如果这个命令使数据按表中的行的形式返回,则将这些行存储在易于检查.操作或更改的缓存中. 适当情况下,可使用缓存行的更改内容来更新数据源. 提供常规方法检测错误(通常由建立连接或执行命令造成). 在典型情况下,需要在编程模型中采用所有这些步骤.但是,由于 ADO 有很强的灵活性,所以最后只需执

使用对象的 ADO 编程模型

ado|编程|对象 使用对象的 ADO 编程模型 ADO 的目标是访问.编辑和更新数据源,而编程模型体现了为完成该目标所必需的系列动作的顺序.ADO 提供类和对象以完成以下活动: 连接到数据源 (Connection),并可选择开始一个事务. 可选择创建对象来表示 SQL 命令 (Command). 可选择在 SQL 命令中指定列.表和值作为变量参数 (Parameter). 执行命令 (Command.Connection 或 Recordset). 如果命令按行返回,则将行存储在缓存中 (R

ADO 编程模型详细资料

ado|编程 ADO 编程模型详细资料 以下元素是 ADO 编程模型中的关键部分: 连接 命令 参数 记录集 字段 错误 属性 集合 事件 连接 通过"连接"可从应用程序访问数据源,连接是交换数据所必需的环境.通过如 Microsoft Internet Information Server 作为媒介,应用程序可直接(有时称为双层系统)或间接(有时称为三层系统)访问数据源. 对象模型使用 Connection 对象使连接概念得以具体化. "事务"用于界定在连接过程中

ADO编程应用(2)

ado|编程 下面是一个简单的采用了#import方法的基于ADO应用的示例代码: #include <windows.h> #import <msado15.dll> rename("EOF", "adoEOF") void main() { HRESULT hr = S_OK; //因为没有在#import中指定no_namespace,所以必须采用ADODB::这样的形式来定义变量类型 ADODB::_RecordsetPtr Rs1

oracle-Delphi使用ADO编程时候报错,急求解释

问题描述 Delphi使用ADO编程时候报错,急求解释 1C Delphi使用ADO进行数据库编程时,执行SQL会报错,下面是详细的说明 有三种方式拼接SQL **方式1会报错**:ORA-00937: not a single-group group function adoquery.Close; adoquery.SQL.Text := 'select count(*) icount from testtable where testno = :no and testname = :nam

【转】VC++ ADO编程入门简介

VC++ ADO编程入门简介  一.ADO简介    ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API.DAO.RDO都要容易使用,并不失灵活性.本文将详细地介绍在VC下如何使用ADO来进行数据库应用程序开发,并给出示例代码.    本文示例代码     二.基本流程    万事

VC++ ADO编程入门简介

一.ADO简介    ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API.DAO.RDO都要容易使用,并不失灵活性.本文将详细地介绍在VC下如何使用ADO来进行数据库应用程序开发,并给出示例代码.    本文示例代码     二.基本流程    万事开头难,任何一种新技术对于初学者

Visual C++ ADO数据库编程入门(上)

ado|c++|visual|编程|数据|数据库   ADO 是目前在Windows环境中比较流行的客户端数据库编程技术.ADO是建立在OLE DB底层技术之上的高级编程接口,因而它兼具有强大的数据处理功能(处理各种不同类型的数据源.分布式的数据处理等等)和极其简单.易用的编程接口,因而得到了广泛的应用.而且按微软公司的意图,OLE DB和ADO将逐步取代 ODBC和DAO.现在介绍ADO各种应用的文章和书籍有很多,本文着重站在初学者的角度,简要探讨一下在VC++中使用ADO编程时的一些问题.我

Visual C++ ADO数据库编程入门(下)

ado|c++|visual|编程|数据|数据库  10.邦定数据 定义一个绑定类,将其成员变量绑定到一个指定的记录集,以方便于访问记录集的字段值. (1). 从CADORecordBinding派生出一个类: class CCustomRs : public CADORecordBinding{BEGIN_ADO_BINDING(CCustomRs)ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname, sizeof(m_szau_fnam