我使用ActiveX Data Object(ADO)是从1.5版本开始,那已经是一个非常古老的版本了。现在的版本中,许多东西都发生了变化。从每一次版本升级中我都学到许多新的东西。这些东西你不能全部从书本上找到,或者至少可以说,不能从一个地方找到。 

  我在这里精心选择和总结了这些ADO开发要点和技巧。其中有些问题可能就是你一直念念不忘的问题;有些是你从来不曾了解的技术;还有一些只是分门别类地展示ADO开发的知识精华。 
一、共享连接对象 
  把连接字符串传递给Command、Recordset或者Record对象时,每次你都是在隐含地命令ADO创建一个Connection对象: 
Dim rec1 As ADODB.Record
Dim rec2 As ADODB.Record
Dim rec3 As ADODB.Record

Set rec1 = New ADODB.Record
rec1.Open "localstart.asp", "URL=http://localhost/"
Set rec2 = New ADODB.Record
rec2.Open "global.asa", "URL=http://localhost/"
Set rec3 = New ADODB.Record
rec3.Open "iisstart.asp", "URL=http://localhost/"
' 执行一些操作
rec1.Close
rec2.Close
rec3.Close

Set rec1 = Nothing
Set rec2 = Nothing
Set rec3 = Nothing
  为了节省资源,你应该先创建一个Connection对象,然后把它传递给所有要求活动连接的对象。也就是说,上面的代码应该改成下面这种形式: 
Dim con As ADODB.Connection
Dim rec1 As ADODB.Record
Dim rec2 As ADODB.Record
Dim rec3 As ADODB.Record
Set con = New ADODB.Connection
con.Open "URL=http://localhost/"
Set rec1 = New ADODB.Record
rec1.Open "localstart.asp", con
Set rec2 = New ADODB.Record
rec2.Open "global.asa", con
Set rec3 = New ADODB.Record
rec3.Open "iisstart.asp", con
' 执行一些操作'
rec1.Close
rec2.Close
rec3.Close
con.Close
Set rec1 = Nothing
Set rec2 = Nothing
Set rec3 = Nothing
Set con = Nothing
二、读取ConnectionString属性 
  从任何已经打开的Connection对象中,包括由Recordset、Command、或者Record对象的ActiveConnection属性返回的Connection对象,你总是可以读取到ConnectionString属性。 
Dim com As ADODB.Command
Dim rst As ADODB.Recordset
Set com = New ADODB.Command
com.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=NWind.mdb;"
com.CommandText = "SELECT * FROM Customers"
Set rst = com.Execute
MsgBox com.ActiveConnection.ConnectionString
rst.Close
Set rst = Nothing
Set com = Nothing
  上述代码运行时,你将从消息框看到如下输出: 
Provider=Microsoft.Jet.OLEDB.4.0;
Password="";
User ID=Admin;
Data Source=NWind.mdb;
Mode=Share Deny None;
Extended Properties="";
Jet OLEDB:System database="";
Jet OLEDB:Registry Path="";
Jet OLEDB:Database Password="";
Jet OLEDB:Engine Type=4;
Jet OLEDB:Database Locking Mode=0;
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";
Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;
Jet OLEDB:Don't Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=False;
Jet OLEDB:SFP=False
  现在你就可以分析这个字符串,找出有关该连接的特定信息,比如当数据库被压缩时它是否会被加密(Jet OLEDB:Encrypt Database属性)。 
三、使用动态属性 
  Connection对象的Properties集合可用来设置供应商特有的选项,比如SQL Server的OLE DB驱动程序的Prompt动态属性。 
Dim con As ADODB.Connection
Set con = New ADODB.Connection
con.Provider = "SQLOLEDB"
con.Properties("Prompt") = adPromptAlways
con.Open
' 提示用户选择数据库'
con.Close
Set con = Nothing
  上述代码运行时,用户将看到一个对话框,这个对话框允许用户选择要登录到哪一个数据库。 
四、明智地选择游标位置 
  选择游标的位置时,你必须考虑对于当前连接来说哪些服务比较重要。 
  如果数据提供者的服务正是你所需要的,你应该使用服务器端游标。这些服务是数据源驱动程序提供的服务,它们通常具有非常好的可伸缩性。另外,通过保留服务器端游标,你无需象使用客户端游标那样总是把全部的数据发送到客户端。 
  另一方面,本地游标服务,例如Microsoft数据形状服务for OLE DB,能够提供一些客户端游标特有的服务。要让这些服务能够起作用,数据必须发送到本地机器上,正如数据形状服务所要求的一样。 
  你可以用Connection.CursorLocation属性设置游标的位置,但选择应该明智、慎重。 
五、明智地选择游标类型 
  选择游标的类型与选择游标的位置同样重要。游标共有四种类型,每一种类型都有各自的优点和缺点。 
  Static游标(静态游标)提供了数据在给定时刻的一个快照。在这种类型的游标中,数据改动(包括其他用户的数据增加或者删除操作)总是不可见。static游标用来制作报表很理想,因为制作报表需要有数据的一个一致的、不会变化的视图,但static游标不一定速度最快。由于数据的改变不会显示出来,对于每一个使用static游标的连接,服务提供者必须分别为它创建和维护一份给定时刻的数据副本。 
  Forward Only游标(只能向前的游标)与静态游标基本相同,不同之处在于你只能向前移动访问数据,但不能向后。与Static游标相比,这个限制有利于提高性能,但它仍旧要求数据源维护一个数据的临时副本,使得其他用户对数据的改动不会影响你的数据。 
  Dynamic游标(动态游标)允许你看到其他用户对数据的修改和删除操作,而且你可以在整个记录集之内自由地移动。与Static和Forward Only游标不同,Dynamic游标不要求数据源维护一份数据的静态映像,因此Dynamic游标要比前两种游标快。 
  最后一种游标类型是Keyset游标(键集游标)。Keyset游标与Dynamic游标非常相似,不同之处在于你不能看到其他用户新增的记录。在Keyset游标中,其他用户删除的记录也将不可访问。和Dynamic游标一样,Keyset游标中你也可以看到其他用户的修改。Keyset游标可能要比Dynamic游标快,这是因为Keyset游标不需要经常地去检查是否有新记录加入、是否有记录被删除(因为新增的记录不可见,被删除的记录变成不可访问)。 
  考虑每一个理由,然后再选择适合你的游标类型。 
六、手工构造参数 

  当性能因素很重要时,请手工定义参数: 
Dim con As ADODB.Connection
Dim com As ADODB.Command
Dim par As ADODB.Parameter
Dim rst As ADODB.Recordset
Set con = New ADODB.Connection
con.Open "Provider=SQLOLEDB;" & "Server=localhost;" _
& "Initial Catalog=Northwind;" & "User ID=sa;"
Set com = New ADODB.Command
Set com.ActiveConnection = con
Set par = com.CreateParameter ("CategoryName", adVarWChar, _
adParamInput, 15)
com.Parameters.Append par
Set par = com.CreateParameter ("OrdYear", adVarWChar, _
adParamInput, 4)
com.Parameters.Append par
com.CommandText = _
"EXECUTE SalesByCategory 'Produce', '1997'"
Set rst = com.Execute
' 执行一些操作'
rst.Close
con.Close
Set com = Nothing
Set rst = Nothing
Set con = Nothing
  采用手工方式定义参数之后,ADO不必为了找出存储过程的参数列表而去查询数据源。当用户只执行一个查询过程且对存储过程执行时间要求不高时,这一点不是很重要;但是,如果用户要执行大量的存储过程,而且希望能够立即得到答案,那么这一点就很重要了。 
七、用Stream对象构造缓存 
  Stream对象可以在没有物理数据源的情况下使用。你可以利用这个对象在本地机器的内存中创建缓存。用法很简单,只需先创建Stream对象的实例,然后就可以开始写入数据: 
Dim str As ADODB.Stream
Set str = New ADODB.Stream
str.Open
str.WriteText "这是文本信息,"
str.WriteText "我们希望它保留在"
str.WriteText "内存中。", adWriteLine
str.WriteText "这是第二"
str.WriteText "行", adWriteLine
MsgBox "缓存中共有" & _
str.Size & "个字符"
str.Position = 0
MsgBox "缓存内容: " & str.ReadText
str.Close
  另外,你还可以用Stream对象处理二进制数据,只需用Write和Read方法取代操作文本的WriteText和ReadText方法。把数据放入缓存之后,你可以用SaveToFile方法永久保存数据。 
八、检查警告信息 
  Connection对象的Errors集合不仅用来报告数据提供者在执行某个操作时出现的错误,而且它还用于指示执行操作过程中出现的非致命性警告信息。 
  Connection.Open、Recordset.CancelBatch、Recordset.Resync以及Recordset.UpdateBatch方法,还有Recordset.Filter属性,都有可能产生警告信息。 
  要检测数据提供者的警告信息(或错误信息),请在使用上述任何方法启动某个操作之前调用Connection.Errors.Clear方法;操作完成后,用Errors集合的Count属性检查是否存在任何警告信息。 
九、事务嵌套 
  使用Jet OLE DB provider时,你可以嵌套事务,最多五层。使用多层事务将赋予你空前的数据控制能力。 
Dim con As ADODB.Connection
Dim iLevel As Integer
Set con = New ADODB.Connection
con.CursorLocation = adUseClient
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=NWind.mdb;"
con.BeginTrans
' 改动 1
con.BeginTrans
' 改动 2
con.BeginTrans
' 改动 3
iLevel = con.BeginTrans
' 改动 4
MsgBox "Level " & iLevel
con.CommitTrans
con.RollbackTrans
con.CommitTrans
con.CommitTrans
con.Close
Set con = Nothing
  在上面这个例子中,改动1和2将成功,改动3和4无效。改动4表面上已经被提交,但由于第三层事务回退,从而导致所有它里面的事务都被回退。 
十、重视数据形状 
  我要为你介绍的最后一则技巧是不要轻视Microsoft Data Shaping Service for OLE DB的力量。Data shaping(数据形状)允许你聚合多个SQL语句,构造出层次型的记录集。在层次型记录集中,单个字段能够指向整个子记录集。 
  例如,如果有两个来自Biblio数据库的表Publishers和Titles(Biblio数据库是Microsoft的一个示例,可以从这里下载),你可以按照下面介绍的方式构造SQL命令,把它们连接到一个记录集。 
SELECT Publishers.Name, Titles.Title
FROM Publishers 
INNER JOIN Titles ON 
Publishers.PubID=Titles.PubID
ORDER BY Publishers.Name, Titles.Title;
  前面几个记录如下所示: 
Name (Pub) Title
-------------- -----------------------------
A K PETERS A Physical Approach to Col...
A K PETERS Colour Principles for C...
A SYSTEM PUBNS C Plus Plus Reference Card
A SYSTEM PUBNS C Reference Card
AA BALKEMA Planning With Linear Progr...
AARP Thesaurus of Aging Termin...
ABACUS Access 2.0 Programming Bible
ABACUS Advanced Access Programming
  可以看到,这个记录集中存在大量的重复数据。利用数据形状技术,我们能够极大地减小结果数据的规模大小。下面的表被发送到客户端,并传递给数据形状游标服务。 
Name (Publisher)
------------------------------------
A K PETERS
A SYSTEM PUBNS
AA BALKEMA
AARP
ABACUS
Title
------------------------------------
A Physical Approach to Color...
Colour Principles for Computer...
C Plus Plus Reference Card
C Reference Card
Planning With Linear Programming
Thesaurus of Aging Terminology : ...
Access 2.0 Programming Bible
Advanced Access Programming
  在数据形状游标服务中,这两个表通过Chapters字段类型连接成一个层次结构,Chapters字段类型用来访问子记录集。 
Dim con As ADODB.Connection
Dim rstPubs As ADODB.Recordset
Dim rstTitles As ADODB.Recordset
Dim sShape As String
Set con = New ADODB.Connection
Set rstPubs = New ADODB.Recordset
con.Provider = "MSDataShape"
con.Open "Data Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=Biblio.mdb;"
sShape = "SHAPE {SELECT Name, PubID " _
& " FROM Publishers} " _
& " APPEND ({SELECT Title, PubID " _
& " FROM Titles} " _
& " As PubTitles " _
& " RELATE PubID TO PubID) "
rstPubs.Open sShape, con
Do Until (rstPubs.EOF)
Debug.Print rstPubs!Name
Set rstTitles = rstPubs("PubTitles").Value
Do Until (rstTitles.EOF)
Debug.Print " " & rstTitles!Title
rstTitles.MoveNext
Loop
rstPubs.MoveNext
Loop
rstPubs.Close
con.Close
Set rstPubs = Nothing
Set con = Nothing
  运行上面的代码时,我们将看到如下输出: 
A K PETERS
A Physical Approach to Color...
Colour Principles for Computer...
A SYSTEM PUBNS
C Plus Plus Reference Card
C Reference Card
AA BALKEMA
Planning With Linear Programming
AARP
Thesaurus of Aging Terminology : ...
ABACUS
Access 2.0 Programming Bible
Advanced Access Programming
  可以看到,数据形状的功能非常强大。 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-124419/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-124419/

ADO技巧精华10则(转)相关推荐

  1. 《PS技巧精华全部在这里!》

    <PS技巧精华全部在这里!> 照片名称:调出照片柔和的蓝黄色-简单方法. 1.打开原图素材,按Ctrl + J把背景图层复制一层,点通道面板,选择蓝色通道,图像 >应用图像,图层为背 ...

  2. 无法保存关闭文件 苹果电脑 显示正在保存_技巧精华第5期,带你了解DXF文件、Shift键、SHX形文件、工作空间...

    CAD技巧精华❺|原创:就说我在开发区 CAD这种工具软件最大的特点就是入门容易提高难,在使用过程中伴随着各种问题的出现,往往有"横看成岭侧成峰,远近高低各不同"的困惑. 实际上, ...

  3. 项目销售实用技巧(精华,销售,售前必看)

    项目销售实用技巧(精华,销售,售前必看) 前言 一 项目前期的电话交流 二 项目急迫性的鉴定 三 初次见面需要注意到的几件事情 1 初次见面的礼仪 2 对于客户组中各个人员的角色定位(职务定位和项目角 ...

  4. Python实战技巧(10)Python解析邮件

    Python实战技巧(1)Python字典类型数据如何递归地通过点'.'的方式访问 Python实战技巧(2)Python的pdb调试代码方法详解 Python实战技巧(3)多版本兼容安装部署(py2 ...

  5. MATLAB小技巧(10)圆形检测实例

    MATLAB小技巧(10)圆形检测实例 前言 一. MATLAB仿真 二. 仿真结果 三. 小结 前言 MATLAB进行图像处理相关的学习是非常友好的,可以从零开始,对基础的图像处理都已经有了封装好的 ...

  6. Python偷懒小技巧-提高10倍工作效率

    说明:增加代码的描述力,可以成倍减少你的LOC,做到简单,并且真切有力 观点:少打字=多思考+少出错,10代码行比50行更能让人明白,以下技巧有助于提高10倍工作效率 1. 交换变量值时避免使用临时变 ...

  7. Tomcat配置技巧Top 10

    作者:Jason Brittain & Ian F. Darwin 出处:http://www.orielly.com/ ; 译者:陈光 编者按:现在开发Java Web应用,建立和部署Web ...

  8. 计算机搞笑技巧,分享10个最常用的电脑操作技巧,你能掌握几个?

    Hi,大家好,我是小雨!许多人都接触过电脑,都使用过电脑,但是你对电脑了解多少?比如对最常使用的键盘,你又了解多少?除了正常的打字之外,键盘上边边角角的那些按键都是做什么用的? 上图是标准键盘上一些不 ...

  9. WebApp开发技巧精华总结

    本文转载自51CTO,原文链接:Click me 自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词-WebApp(意为基于WEB形式的应用程序,运行在高 ...

最新文章

  1. 一大波物联网僵尸正在袭来,都有啥安全保护方法?
  2. 如何解决“HttpException (0x80004005): 超过了最大请求长度”问题
  3. ubuntu cmake交叉编译时报错:没有那个文件或目录
  4. vue3.0js 非prop属性的值和setup函数的使用
  5. java调用reader的nextInt_Java中如何从键盘输入内容: import java.util.Scanner; .nextLine(); .hasNextInt();...
  6. 趣文:如果编程语言是车
  7. 求解这个矩阵形式的HTML5线性方程组
  8. mysql中的各种函数(日期函数、字符串函数、数学函数...)
  9. 《我也能做CTO之程序员职业规划》之六:灵商
  10. [Xcode 实际操作]五、使用表格-(8)自定义UITableView单元格Accessory样式(附件图标)
  11. php 查看session 时间,php中session过期时间设置及session回收机制介绍
  12. android ukey,Tenorshare 4uKey for Android
  13. action、gitter
  14. USB Type-C PD快充简介
  15. 雷达探测项目仿真代码(Matlab代码实现)
  16. Java 知识点整理-7.StringBuffer类+冒泡排序+选择排序+二分法+Arrays类+基本数据类型的包装类
  17. 解决container_linux.go:262: starting container process caused:
  18. 【NLP】关键词共现/属性共现矩阵
  19. 隆云通土壤ORP传感器
  20. Windows下的很多程序都有十分漂亮的菜单

热门文章

  1. BiliLocal 播放器播放腾讯视频加弹幕
  2. 2021款12.9英寸iPad Pro相比旧款电池容量更大
  3. Hive查询报partion错误
  4. 不同cpu服务器虚拟迁移,案例五:虚拟机迁移报错CPU不兼容
  5. 【python8】股票查询系统
  6. 汉诺塔(Hanoi)移动步骤问题
  7. K近邻算法的基本原理和代码
  8. 年轻人的第一本深度学习面试书
  9. web项目的三层结构: 视图层,业务逻辑层,持久层
  10. qpython3安装第三方库_【工具篇】python pip安装第三方库