望麓自卑—湖南大学最具潜力的校园传媒

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2121|回复: 4

[资源共享] 『编程笔记系列』ADO数据访问模型初学者入门

[复制链接]
发表于 2005-10-25 14:52:16 | 显示全部楼层 |阅读模式
ADO(ActiveXDataObjects)是Microsoft提供和建议使用的新型的数据访问接口,具体实现为Automation。这样,程序员可以在各种支持Automation的开发环境下方便地访问ADO对象,如VisualBasic、VisualC++、VisualJ++及Delphi等。ADO被实现为OLEDB之上的一个薄层,这使得ADO可以有更快的访问速度,更易使用,同时更节省资源。值得注意的是,对于VisualStudio6.0的用户而言,现在提供的ADO2.0要比VisualStudio5.0时代的ADO1.5更加完整。这意味着程序员可以更为广泛地使用ADO接口,甚至在所有的基于Windows平台的数据访问中使用它。比如对RDS(前身是ADC)的支持,可以方便的构建高效的Web应用。

  一、对ADO对象的主要操作

  对ADO对象的主要操作,同DAO、RDO库的实现基本相同。主要包括6个方面:

  1.连接到数据源。这是可选的、通常涉及ADO的Connection对象。

  2.向数据源提交命令。通常涉及ADO的Command对象。在查询中可以与参数对象(Parameter)协同使用。

  3.执行命令,比如一个SELECT脚本。

  4.如果提交的命令有结果返回,可以通过ADO的Recordset对象对结果进行操作,数据存储在缓存中。

  5.如果合适,可将缓存中被修改的数据更新到物理的存储上。

  6.提供错误检测。通常涉及ADO的Error对象。

  以程序员的视角来看,ADO、DAO和RDO三者的对象名称不很相同。但使用ADO对象要比DAO和RDO简单得多。最主要的一点在于,程序员不用像在使用DAO和RDO那样要从对象模型的顶层开始一步步的创建子对象。因此,ADO提供了一种更灵活的编程方式。

  二、ADO中主要对象的功能

  Connection对象,表示了一个到数据源的会话。使用Connection对象的成员,可以使用相应的属性打开到数据源的连接,设置游标的位置,设置默认的当前数据库,设置将使用的OLEDBProvider,直接提交SQL脚本等。值得注意的是,在提交SQL脚本的任务时,不用创建一个Command对象,就可完成查询。另外,对Connection对象的创建是同其他对象无关的。Command对象,可被用于查询数据库并返回结果在Recordset对象中。也可以进行批操作和操纵数据库的结构,当然,这需要使用的OLEDBProvider提供相应的支持。此外,可以将一个激活的Connection对象绑定到Command对象的ActiveConnection属性,这使得多个Command对象实例可以共用一个Connection对象。

  Recordset对象,用来封装查询的结果,可称为结果集。

  Field对象,用来表达一行结果中各子段的类型和值。

  Error对象,用来检测和判断在数据库操作中出现的错误,比如连接失败。 在ADO中,许多对象名后多了一个\"s\",比如Error->Errors,Field->Fields等等。添加\"s\"意味着是相应对象的Collection(集合)对象,比如Errors是Error对象的Collection对象。Collection有点像数组(Array),但不同的是,Collection可以以不同类型的数据或对象作为自己的元素,而数组中的各元素通常都是相同类型的。所以,在看到一个对象名最后是\"s\",通常表明这是一个Collection对象,比如Errors中的各元素是由Error对象的实例组成的。

  三、简单的例子

  现在,我们在经过了前面的铺垫后,终于可以进入写代码的过程了。下面是一系列在VisualBasic中编写的代码片段,其中对ADO的操纵完全用代码来实现。在开始前,请不熟悉ActiveXAutomation的读者牢记,我们正在使用的,是被实现为ActiveXAutomation的ADO组件。1.打开Connect.ion对象

  打开一个到数据源的连接,即Connection对象的VB代码如下:


Dim cn As ADODB.Connection
’声明ADODB.Connection对象变量
Dim strCN As String
’声明存放连接串的字符串变量
Set cn= New Connection
’实例化Connection对象
’生成连接串(ConnectionString)
strCN=\"rovider=Microsoft.Jet.Oledb.3.51;
UserID=Admin;\"&_
\"DataSource=D:\\MicrosoftVisual
Studio\\VB98\\Nwind.mdb;\"
cn.Open strCN ’调用Connection对象的方法Open连接数据源

  以上代码在访问ADO对象时,使用了前绑定(Early-bind),实现前绑定需要从VisualBasic的Project菜单下选择Reference菜单项,并选择MicrosoftActiveXDataObjects2.0Library。在程序中声明的strCN变量中,连接串属性Provider标识了OLEDBProvider为OLEDBProviderforMicrosoftJet,因为我们访问的是MicrosoftAccess数据文件,使用MicrosoftJetEngine可以获得比ODBC更好的性能。在试验以上代码时有两个地方要注意。首先,要根据系统安装的OLEDBProviderforMicrosoftJet服务选择相应版本,可能是3.51,也可能是4.0。在本例中使用的是3.51版本。如果使用4.0版本,首先需要将Provider属性改为\"Microsoft.Jet.Oledb.4.0\";其次,DataSource属性标识了所要访问的数据文件的路径,要根据自己的安装情况作出适当的调整。文件Nwind.mdb通常被VisualStudio默认安装,一般放在Visual Basic的工作目录下。

  除了OLEDB Provider for MicrosoftJet以外,Visual Studio6.0还提供了以下的OLEDBProvider,如下所示。

OLEDB Provider类型 数据源类型  
Microsoft OLEDB Provider for ODBC databases
Microsoft OLEDB Provider for Microsoft Index Server Microsoft(r) Index Server
Microsoft OLEDB Provider for Microsoft Active Directory Service Microsoft(r) Active Directory Service
Microsoft OLEDB Provider for SQLServer Microsoft(r) SQLServer Microsoft OLEDB Provider for Oracle
Oracle databases

  这意味着使用ADO接口可以方便地访问以上的各种数据源,要做的就是选择适当的OLEDB Provider。除了使用Connection对象的Open方法以外,还可通过Recordset对象的Open方法快捷地创建到数据源的连接。这充分体现了ADO的灵活性。

  2.创建Command对象


Dim cmd As ADODB.Command

Set cmd=New Command’实例化Command对象

  3.执行查询

  以Command对象为例。


Dim rs As New ADODB.Recordset

Set cmd.ActiveConnection=cn’绑定激活的Connection对象实例

cmd.CommandText=\"SELECT*from Customers\"’生成SQL脚本

Set rs=cmd.Execute’执行查询

  上述的代码仅仅是一种查询途径,此外,ADO的Connection对象的Execute方法和Recordset对象的Open方法也提供了查询能力。返回的结果可以被保存在一个Recordset对象实例中以便后续的数据处理和操纵。例如:


Dim rs As NewADODB.Recordset

rs.Open cmd,cn,adOpenDymanic,adLockBatchOptimistic

  另外在SQL脚本的生成方式上,通常可以借助Parameters/Parameter对象来完成。

  4.显示和操纵数据

  查询结果由Recordset对象封装。对数据的操纵可以通过Recordset对象提供的成员(属性和方法)来完成。


rs.MoveFirst

Do While Not rs.EOF’判断EOF标记属性(Endoffile)

Debug.Print rs!CustomerID & vbTab & rs!CompanyName & _

vbTab & rs!ContactName & vbTab & rs!ContactTitle

rs.MoveNext’将游标指针移到下一条记录

Loop

  上述代码将Recordset中的各行记录打印在Visual Basic的Immediate Window中。为了看到打印的结果,可以在上述代码之后,增加一条Stop语句,以便进入Debug状态。

  5.更新记录

  使用Recordset对象来完成Update操作。

  rs.Close’关闭之前建立的结果集

  ’打开新的结果集,具有写操作权限


rs.Open\"Customers\",cn,adOpenDynamic,adLockOptimistic,adCmdTable

rs.MoveFirst’虽无必要,但可能是一个良好的习惯

rs!CompanyName=\"Microsoft\"’对相应字段赋予新值

rs.Update’在物理存储上生效

  除了Update以外,写操作还包括AddNew(添加一条新记录)和Delete(删除一条新记录)。另外,Recordset支持批处理,但这些特征需要由低层的OLEDBProvider支持。当写操作出现错误时,可根据错误描述(访问ADO的Error或VisualBasic的Err对象)来判断原因。另一个需要注意的是,当使用Recordset对象完成写操作时,需要预先指定Recordset对象实例非只读。

  6.收尾工作

  在这个阶段应该显式的释放相应的资源,如果不做的话,通常VisualBasic会自动释放和回收资源。但对于一个有良好编程习惯的程序员来说,应该主动地做收尾工作,就像下面的代码一样。


rs.Close

Set rs=Nothing

Set cmd=Nothing

cn.Close

Set cn=Nothing
 楼主| 发表于 2005-10-25 14:54:11 | 显示全部楼层
VB中的ADO对象编程
2001年5月10日  



原创:Cody

   那天听到一位同学说他的女朋友是学新闻的可也学会了数据库,可学计算机的自己却还是不会,总觉得有点汗颜.在各网站的论坛上,也常看到网友对数据库的一些操作很难把握.我想简单的介绍一下VB中关于ADO对象的一些常识,供同学们参考.其实本人也是刚刚懂了一点,拼凑出这篇文章,希望高手们看了不要见笑,但同时也希望对初学者有所帮助.

   ADO是ActiveX Data Objects 的缩写,是一项新的数据库的存取技术.相对于VB5.0中的DAO他具有更为简化的对象模型,无论是存取本地的还是远程的数据,都提供了一致的接口.就我本人而言,ADO的确比DAO要好用得多.

   今天只就ADO的对象模型谈一谈.ADO定义了一个可编程的对象集合.ADO对象模型如图所示:







   对于ADO其中对象来说,我觉得比较重要的是:Command,Connection,Recordset对象.

   虽然严格的说这是不准确的,但根据我的实际经验确实如此.下面就分别来谈一下.

   (1) Connection对象
   Connection对象用于建立与数据库的连接.通过连接可从应用程序访问数据源.它保存诸如指针类型,连接字符串,查询超时,连接超时和缺省数据库这样的连接信息.

   (2) Command对象
   在建立Connection后,可以发出命令操作数据源.一般情况下,Command对象可以在数据库中添加,删除或更新数据,或者在表中进行数据查询.Command对象在定义查询参数或执行一个有输出参数的存储过程时非常有用.

   (3) Recordset对象
   Recordset对象只代表一个记录集,这个记录集是一个连接的数据库中的表,或者是Command对象的执行结果返回的记录集.在ADO对象模型中,是在行中检查和修改数据的最主要的方法,所有对数据的操作几乎都是在Recordset对象中完成的.Record对象用于指定行,移动行,添加,更改,删除记录.

   下面就具体地说说如何用ADO存取数据:

   在实际编程过程中使用ADO的一个典型的存取数据的步骤为:
  (1) 连接数据源
  (2) 打开记录集对象
  (3) 使用记录集
  (4) 断开连接

   那么具体怎么是用呢?分别来看.(我在最后将给出一个完整的使用ADO的实例给大家参考.)

   (1) 如何连接数据源
   利用Connection对象可以创建一个数据源的连接.应用的方法是Connection对象的Open方法.
   语法:
   Connection对象.Open ConnectionString, UserID, PassWord, OpenOptions
   其中:
   Connection对象为你定义的Connection对象的实例;
   ConnectionString为可选项,包含了连接的数据库的信息;
   UserID 可选项,包含建立连接的用户名;
   PassWord为可选项,包含建立连接的用户密码;
   OpenOptions为可选项,假如设置为adConnectAsync,则连接将异步打开.

   (2)打开记录集对象
   实际上记录集返回的是一个从数据库取回的查询结果集.因此他有两种打开方法:一种使用记录集的Open方法,另一种是用Connection对象的Execute方法.

   (a)记录集的Open方法
   语法:
   Recordset.Open Source, ActiveConnection, CursorType, LockType, Options
   其中:
   Recordset为所定义的记录集对象的实例.
   Source可选项,指明了所打开的记录源信息.可以是合法的命令,对象变量名,SQL语句,表名,存储过程调用,或保存记录集的文件名.
   ActiveConnection可选项,合法的已打开的Connection对象的变量名,或者是包含ConnectionString参数的字符串.
   CursorType可选项,确定打开记录集对象使用的指针类型.
   LockType可选项 确定打开记录集对象使用的锁定类型.

   (b)Connection对象的Execute方法
   语法:
   Set recordset=Connection.Execute(CommandText,RecordsAffected,Options)
   参数说明:
   CommandText 一个字符串,返回要执行的SQL命令,表名,存储过程或指定文本.
   RecordsAffected 可选项,Long类型的值,返回操作影响的记录数.
   Options 可选项,Long类型值,指明如何处理CommandText参数.
   介绍完了如何打开数据库下面说说怎么使用吧.

   (3)使用记录集

   (a)添加新的记录:
   在ADO中添加新的记录用的方法为:AddNew 它的语法为:
   Recordset.AddNew FieldList, Values
   Recordset为记录集对象实例
   FieldList为一个字段名,或者是一个字段数组.
   Values为给要加信息的字段赋的值,如果FiledList为一个字段名,那么Values应为一个单个的数值,假如FiledList为一个字段数组,那么Values必须也为一个个数,类型与
   FieldList相同的数组.
   再用完AddNew方法为记录集添加新的记录后,应使用UpDate将所添加的的数据存储在数据库中.不过你最好在用UpDate方法之前使用CancelUpdate方法来取消该项操作.

   (b)修改记录集
   其实修改核对记录集中的数据重新赋值没有什么太大的区别,只要用SQL语句将要修改的字段的一个数据找出来重新赋值就可以了.这里不再细说了.

   (c)删除记录
   在ADO中删除记录集中的数据的方法为elete方法,这与DAO对象的方法相同,但是在ADO中它的能力增强了,可以删掉一组记录了.
   它的语法如下:
   Recordset.Delete AffectRecords
   其中的,AffectRecords参数是确定Delete方法作用的方式的,它的取值如下:
   adAffectCurrent 只删除当前的记录
   adAffectGroup 删除符合Filter属性设置的那些记录.为了一次能删除一组数据,应设置Filter属性.

   (d)查询记录
   在ADO中查询的方法很灵活,有几种查询的方法.
   ●使用连接对象的Execute方法执行SQL命令,返回查询记录集.
   ●使用Command对象的Execute方法执行CommandText属性中设置的SQL命令,返回查询记录集.
   第一个方法的具体语法在前面数据连接时已经介绍过了,下面就第二方法具体说一下.
   Command对象的Execute方法的语法如下:
   Command.Execute RecordsAffected, Parameters, Options '不返回记录集
   或者 Set Rscordset=cmmnad.Execute(RecordsAffected,Parameters,Options) '返回记录集
   CommandText的语法为:
   Command.CommandText=stringvariable
   其中: stringvariable为字符串变量,包含SQL语句,表名或存储过程.

   (4) 断开连接
   在应用程序结束之前,应该释放分配给ADO对象的资源,操作系统回收这些资源并可以再分配给其他应用程序.
   使用的方法为:Close方法.
   语法如下:
   Object.Close ' Object为ADO对象

   好了,说了那么多的理论,下面我们就应用一下吧!
   下面我给出一个我自己写的实例,是一个用户登录,注册,密码修改,用户删除的应用小程序.你也可以到本版的下载仓库中下载.  

   具体实现方法:
   在本程序中包括了四个窗体.
      一个用于用户登录,名字为:FormDengLu;
      一个用于用户注册,名字为:FormZhuCe;
      另一个为用于用户修改密码,名字为:FormXiuGai;
      最后一个用于用户删除,名字为:FormShanChu.

   下面进行ADO对象的定义与设置,不过在这之前你必须在工程中引用ADO对象.

   定义ADO对象:

   Dim ZhuCe As ADODB.Connection ' ZhuCe为连接对象
      Dim rstZhuCe As ADODB.Recordset 'rstZhuCe为记录集对象
      Dim cmmZhuCe As ADODB.Command 'cmmZhuCe为命令对象
   在Form_Load过程中应进行如下的ADO设置:
      Set ZhuCe = New ADODB.Connection '设置连接对象实例
      ZhuCe.CursorLocation = adUseClient
      '打开数据源连接
      ZhuCe.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=App.Path\注册.mdb"
      '设置记录集对象实例
      Set rstZhuCe = New ADODB.Recordset
      Set rstZhuCe.ActiveConnection = ZhuCe
      '打来记录集
      rstZhuCe.Open "select * from 注册", ZhuCe, adOpenStatic, adLockOptimistic
      '设置命令对象实例
      Set cmmZhuCe = New ADODB.Command
      Set cmmZhuCe.ActiveConnection = ZhuCe
      添加新的用户信息(原码)
      If TextYongHuMing.Text = "" Or TextMiMa.Text = "" Or _
        TextTiShiWenTi.Text = "" Or TextTiShiDaAn.Text = "" Then
        MsgBox "笔添信息没有添完,请输入完全", vbOKOnly + vbExclamation, "提示"
      Else
        If TextJiaoYan.Text = TextMiMa.Text Then
           rstZhuCe.MoveLast '记录集中的移动方法,指针移动到记录集的末尾
           rstZhuCe.AddNew '添加新的记录
           rstZhuCe!用户名 = TextYongHuMing.Text
           rstZhuCe!密码 = TextMiMa.Text
           rstZhuCe!姓名 = TextXingMing.Text
           rstZhuCe!昵称 = TextNiCheng.Text
           rstZhuCe!联系地址 = TextLianXiDiZhi.Text
           rstZhuCe!邮政编码 = TextYouBian.Text
           rstZhuCe!OICQ = TextOICQ.Text
           rstZhuCe!电子邮件 = TextMail.Text
           rstZhuCe!呼机 = TextHuJi.Text
           rstZhuCe!手机 = TextShouJi.Text
           rstZhuCe!密码提问 = TextTiShiWenTi.Text
           rstZhuCe!提问答案 = TextTiShiDaAn.Text
           rstZhuCe!电话号码 = TextDianHua.Text
           rstZhuCe.Update '将上面所有的信息存储到数据库中
           MsgBox "注册成功", vbOKOnly + vbInformation, "注册成功"
        Else
           MsgBox "校验密码与密码不一致,请重新输入", vbOKOnly + vbExclamation, _
              "密码错误"
           TextMiMa.Text = ""
           TextJiaoYan.Text = ""
        End If
      End If

   下面为修改用户密码(在此中我并没用到上面提到的两种方法,但是这种方法也很简单,实际上应该是属于第一种方法.

   代码如下:
   Dim a As String
   Dim b As String
   If TextYongHuMing.Text = "" Or TextMiMa.Text = "" Or TextJiaoYanMiMa.Text = "" Or TextXinMiMa.Text = "" Then
      MsgBox "修改信息填写不完全,请重新填写!", vbOKOnly + vbInformation, "修改错误"
      TextYongHuMing.Text = ""
      TextMiMa.Text = ""
      TextJiaoYanMiMa.Text = ""
      TextXinMiMa.Text = ""
   Else
      If TextXinMiMa.Text <> TextJiaoYanMiMa.Text Then
        MsgBox "校验密码与新密码不一致,请重新填写!", vbOKOnly + vbExclamation, "密码错误"
        TextJiaoYanMiMa.Text = ""
        TextXinMiMa.Text = ""
      End If
        a = "select 用户名,密码 from 注册 where 用户名 =&#39;" & _
           TextYongHuMing.Text & _
           "&#39; AND 密码 = &#39;" & _
           TextMiMa.Text & "&#39;;"
      rstZhuCe.Open a, ZhuCe, adOpenKeyset, adLockOptimistic
      rstZhuCe!密码 = TextXinMiMa.Text
      MsgBox "密码修改成功,您的新密码是:" & rstZhuCe!密码 & "!", vbOKOnly + vbInformation, "修改成功"
   End If
   也许你这样看起来的确实有点麻烦,不过你可以去下载全部程序,那样看起来比较简单!

   下面是用户的删除.

   代码如下:
   Dim a As String
   Dim ok As Integer
   Dim i As Integer
   rstZhuCe.MoveFirst
   For i = 0 To rstZhuCe.RecordCount - 1
      If rstZhuCe!用户名 = ComboYongHuMing.Text And rstZhuCe!密码 = TextMiMa.Text Then
        ok = MsgBox("你确定真的要将此用户删除吗?", vbOKCancel + vbQuestion, "提示")
        If ok = 1 Then
           rstZhuCe.Delete adAffectCurrent &#39;删除所找到的用户
           MsgBox "此用户已经成功删除!", vbOKOnly + vbInformation, "删除成功"
        End If
      End If
      rstZhuCe.MoveNext
   Next I

   好了到此为止,我向大家介绍了一下ADO对象的简单知识与基本用法,并赋上我的一点经验供大家参考.
 楼主| 发表于 2005-10-25 14:57:18 | 显示全部楼层
ADO三大对象的属性、方法、事件及常数 一
--------------------------------------------------------------------------------
作者:不详  来源于:中国VB网  发布时间:2004-11-2
Connection对象


属性


属性名称 数据类型和用途

Attributes 可读写Long类型,通过两个常数之和指定是否使用保留事务(retainning transactions)。常数adXactCommitRetaining表示调用CommitTrans方法时启动一个新事务;常数adXactAbortRetaning表示调用RollbackTrans方法时启动一个新事务。默认值为0,表示不使用保留事务。

CommandTimeout 可读写Long类型,指定中止某个相关Command对象的Execute调用之前必须等待的时间。默认值为30秒。

ConnectionString 可读写String类型,提供数据提供者或服务提供者打开到数据源的连接所需要的特定信息

ConnectionTimeout 可读写Long类型,指定中止一个失败的Connection.Open方法调用之前必须等待的时间,默认值为15秒。

CursorLocation 可读写Long类型,确定是使用客户端(adUseClient)游标引擎,还是使用服务器端(adUseServer)游标引擎。默认值是adUseServer。

DefaultDatabase 可读写String类型,如果ConnectString中未指定数据库名称,就使用这里所指定的名称,对SQL Server而言,其值通常是pubs

IsolationLevel 可读写Long类型,指定和其他并发事务交互时的行为或事务。见IsolationLevel常数

Mode Long类型,指定对Connection的读写权限。见Mode常数

Provider 可读写String类型,如果ConnectionString中未指定OLE DB数据或服务提供者的名称,就使用这时指定的名称。默认值是MSDASQL(Microsoft OLE DB Provider for ODBC)。

State 可读写Long类型,指定连接是处于打开状态,还是处于关闭状态或中间状态。见State常数

Version 只读String类型,返回ADO版本号。


注意:上面所列出的大多数可读写的属性,只有当连接处于关闭状态时才是可写的。


只有当用户为Connection对象用BeginTrans...CommitTrans...RollbackTrans方法定义了不遗余力,事务隔离程度的指定才真正有效。如果有多个数据库用户同时执行事务,那么应用程序中必须指定如何响应运行中的其他事务。


方法


方法 用途

BeginTrans 初始化一个事务;其后必须有CommitTrans和/或RollbackTrans相呼应

Close 关闭连接

CommitTrans 提交一个事务,以完成对数据源的永久改变(要求使用之前必须调用了BeginTrans方法)

Execute 人SELECT SQL语句返回一个forward-only Recordset对象,也用来执行那些不返回Recordset语句,如INSERT、UPDATE、DELETE查询或DDL语句

Open 用连接字符串来打开一个连接

OpenSchema 返回一个Recordset对象以提供数据源的结构信息(metadata)

RollbackTrans 取消一个事务,恢复对数据源做的临时性改变(要求使用之前必须调用了BeginTrans方法)


注:只有Execute、Open和OpenSchema三个方法才能接受变元参数。Execute的语法为:

cnnName.Execute strCommand,[lngRowsAffected[,lngOptions]]

strCommand的值可以是SQL语句、表名、存储过程名,也可以是数据提供者所能接受的任意字符串。为了提高性能,最好为lngOptions参数指定合适的值(详见lngOptions参数用到的常数),以使提供者解释语句时不用再去判定其类型。可选参数lngRowsAffected将返回INSERT、UPDATE或DELETE查询执行以后所影响的数目。这些查询会返回一个关闭的Recordset对象。一个SELECT查询将返回lngRowsAffected值为0并且返回带有一行或多行内容的打开的forward-only Recordset。


事件


事件名称 触发时机

BeginTransComplete BeginTrans方法执行以后。

Private Sub cnnName_BeginTransComplet(ByVal TransactionLevel As Long,ByVal pError As ADODB.Error,adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)

CommitTransComplete CommitTrans方法执行以后

Private Sub Connection1_CommitTransComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)

ConnectComplete 成功建立到数据源的Connection之后

Private Sub Connection1_ConnectComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)

Disconnect Connection关闭之后

Private Sub Connection1_Disconnect(adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)

ExecuteComplete 完成Connection.Execute或Command.Execute之时

Private Sub Connection1_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)

InfoMessage 一个Error对象被添加到ADODB.Connectio.Error集合之时

Private Sub Connection1_InfoMessage(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)

RollbackTransComplete RollbackTrans方法执行之后

Private Sub Connection1_RollbackTransComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)

WillConnect 即将调用Connection.Open方法之时

Private Sub Connection1_WillConnect(ConnectionString As String, UserID As String, Password As String, Options As Long, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)

WillExecute 即将调用Connection.Execute或Command.Execute方法之时

Private Sub Connection1_WillExecute(Source As String, CursorType As ADODB.CursorTypeEnum, LockType As ADODB.LockTypeEnum, Options As Long, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)


注:其中的adStatus参数所用到的常数的名称和含义详见adStatus所用的常数


常数


IsolationLevel常数


常数 含义

adXactCursorStability 只允许读其他事务已提交的改变(默认值)

adXactBrowse 允许读其他事务未提交的改变

adXactChaos 本事务不会覆盖其他位于更高隔离程度的事务所做的改变

adXactIsolated 所有事务相互独立

adXactReadCommitted 等同于adXactCursorStability

adXactReadUncommitted 等同于adXactBrowse

adXactRepeatableRead 禁止读其他事务的改变

adXactSerializable 等同于adXactIsolated

adXactUnspecified 不能确定提供者的事务隔离程度


Mode常数


常数 含义

adModeUnknown 未指定数据源的连接许可权(默认值)

adModeRead 连接是只读的

adModeReadWrite 连接是可读写的

adModeShareDenyNone 不拒绝其他用户的读写访问(Jet OLE DB Provider的默认值)

adModeShareDenyRead 拒绝其他用户打开到数据源的读连接

adModeShareDenyWrite 拒绝其他用户打开到数据源的写连接

adModeShareExclusive 以独占方式打开数据源

adModeWrite 连接是只写的


State常数


常数 含义

adStateClosed Connection(或其他对象)是关闭的(默认值)

adStateConnecting 正在连接数据源的状态

adStateExecuting Connection或Command对象的Execute方法已被调用

adStateFetching 返回行(row)到Recordset对象

adStateOpen Connection(或其他对象)是打开的(活动的)


Execute方法中lngOption参数用到的常数


Command类型常数 含义

adCmdUnknown Command类型未定(默认值),由数据提供者去判别Command语法

adCmdFile Command是和对象类型相应的文件名称

adCmdStoredProc Command是存储过程名称

adCmdTable Command是能产生内部SELECT * FROM TableName查询的表名称

adCmdTableDirect Command是能直接从表中获取行内容的表名称

adCmdText Command是一条SQL语句


ADODB事件处理子过程参数adStatus所用的常数


常数 含义

adStatusCancel 操作被用户取消

adStatusCnatDeny 操作不能拒绝其他用户对数据源的访问

adStatusErrorsOccurred 操作导致错误并已送到Errors集合中

adStatusOK 操作成功

adStatusUnWantedEvent 操作过程中一个未预料到的事件被激活
 楼主| 发表于 2005-10-25 14:57:35 | 显示全部楼层
ADO三大对象的属性、方法、事件及常数 二
--------------------------------------------------------------------------------
作者:不详  来源于:中国VB网  发布时间:2004-11-2
Command对象


Command对象的主要目的是执行参数化的存储过程。其形式要么是临时准备(prepared),要么是持久的预编译(precompiled)过的SQL语句。如果想(存储)一个或多个查询以供在同一Connection上多次执行,Command对象也是很有用的。当想创建Recordset时,一种高效的方法是绕过Command对象而采用Recordset.Open方法。


属性


属性名称 数据类型和用途

ActiveConnection 指针类型,指向Command所关联的Connection对象。对于现存的已打开连接,可使用Set cmmName.ActiveConnection=cnnName。另外,也可以不用相关Connection对象名称而使用有效的连接字符串去创建一个新的连接。默认值为Null。

CommandText 可读写String类型。为ActiveConnection指定一条SQL语句、表名、存储过程名或提供者能接受的任意字符串。CommandType属性的值决定了CommandText属性值的格式。默认值为空字符串:""

CommandTimeout 可读写Long类型,指定中止一个Command.Execute调用之前必须等待的时间。这时的值优先于Connection.ComandTimeout中的设定值。默认值为30秒。

CommandType 可读写Long类型,指定数据提供者该如何解释CommandText属性值。CommandType等效于Connection.Execute方法中的可选参数lngOption。详见CommandType所用到的常数。默认值为adCmdUnkown.

Name 可读写String类型,指定Command的名称。

Prepared 可读写Boolean类型,判断数据源是否把CommandText中的SQL语句编译为prepared statement(一种临时性存储过程)。prepared statement仅存活于Command的ActiveConnection生命周期中。许多客户/服务器RDBMS,包括SQL SERVER,都支持prepared statement。如果数据源不支持prepared statement,则把该属性设为True,将导致一个自陷错误。

State 可读写Long类型,指定Commnad状态。见State常数。


注意:最好每次都为CommandType指定的一个合适的常数值,否则会降低系统运行的效率。


方法


方法 用途

Createparameter 在执行该方法之前,必须首先声明一个ADODB.Parameter对象。调用语法为:

cmmName.CreateParameter [strName[,lngType[,lngDirection[,lngSize[,varValue]]]]]

Execute 调用语法同Connection.Execute大致相同。


常数


State常数


常数 含义

adStateClosed Connection(或其他对象)是关闭的(默认值)

adStateConnecting 正在连接数据源的状态

adStateExecuting Connection或Command对象的Execute方法已被调用

adStateFetching 返回行(row)到Recordset对象

adStateOpen Connection(或其他对象)是打开的(活动的)


CommandType所用到的常数


Command类型常数 含义

adCmdUnknown Command类型未定(默认值),由数据提供者去判别Command语法

adCmdFile Command是和对象类型相应的文件名称

adCmdStoredProc Command是存储过程名称

adCmdTable Command是能产生内部SELECT * FROM TableName查询的表名称

adCmdTableDirect Command是能直接从表中获取行内容的表名称

adCmdText Command是一条SQL语句
 楼主| 发表于 2005-10-25 14:57:54 | 显示全部楼层
ADO三大对象的属性、方法、事件及常数 三
--------------------------------------------------------------------------------
作者:不详  来源于:中国VB网  发布时间:2004-11-2
Recordset对象


属性


属性名称 数据类型和用途

AbsolutePage 可读写Long类型,要么是设置或返回当前记录所处的页面序号,要么是一个PositionEnum常数,见AbsolutePage用到的常数。在获取或设置AbsolutePage的值之前,必须先设定PageSize的值。AbsolutePage是从1开始计数的。如果当前记录位于第一页时,AbsolutePage的返回值为1,对AbsolutePage设置将使当前记录指针指向指定页的第一条记录。

AbsolutePosition* 可读写的Long类型(从1开始计数),设置或返回当前记录年处的位置。AbsolutePosition的最大取值是RecordCount属性的值。

ActiveCommand 可读写的String类型,Recordset所关联的先前打开的Command对象名称

ActiveConnection 指针类型,指向Recordset所关联的先前打开的Connection对象,或指向一条完整有效的ConnectionString串值。


BOF* 只读Boolean类型,若为True,表明记录指针已位于Recordset第一条记录之前,并且没有了当前记录

Bookmark* 可读写Variant类型,返回对特定记录的引用或使用一个Bookmark值使记录指针指向特定记录

CacheSize* 可读写Long类型,指定本地Cache中所存的记录条数,最小(默认值)为1。若增加了CacheSize的值,则在流动Recordset以获取更多记录时,能减少与服务器的通信次数。

CursorLocation 可读写Long类型,指定可流动游标的位置,即CursorType是位于客户端还是位于服务器端,见CursorLocation用到的常数。默认值是使用OLE DB数据源提供的游标。

CusrsorType* 可读写Long类型,指定Recordset游标的类型,见CursorType用到的常数,默认值是forward-only游标

DataMember 指针类型,指向关联的DataEnvironment.Command对象

DataSource 指针类型,指向关联的DataEnvironment.Connection对象

EditMode* 只读Long类型,返回Recordset的编辑状态,见EditMode用到的常数

EOF* 只读Boolean类型,若为True,表明记录指针已超出Recordset的最后一条记录,并且没有了当前记录。

Filter* 可读写Variant类型,要么是一条件表达式(一条有效的SQL WHERE子句但又不出现保留字WHERE),要么是指向特定记录的Bookmark数组,要么是一个Filter常数,详见Filter用到的常数。

LockType* 可读写Long类型,指定打开Recordset所使用的记录锁定方法。默认值是只读,对应于forward-only游标的只读特性。见LockType属性用到的常数。

MarshalOptions 可读写Long类型,指定客户端改动后,应返回哪个记录集合,此属性仅适合于不常见的ADOR.Recordset对象,此对象是RDS.ADOR.Recordset对象成员之一。

MaxRecords* 可读写Long类型,指定SELECT查询或存储过程返回的最大记录条数,默认值为0,即全部返回

PageCount 只读Long类型,返回Recordset所有的页数,必须设定了PageSize的值,PageCount的返回值才是真正有意义的。如果Recordset不支持PageCount属性,则返回值为-1

PageSize 可读写Long类型,设置或返回一个逻辑页所包含的记录条数。使用逻辑页可把大的Recordset分解为多个易处理的小部分。通常的做法是把PageSize设为DataGrid、MsFlexGrid或层次型的FlexGrid控件所能显示的记录条数。PageSize和锁定Jet(2k)或锁定SQL Server(6.5版及更早版本,2k;7.0版,8k)数据库时用到的表页面大小无关

PersistFormat 可读写Long类型,设置或返回由调用Save方法所创建的Recordset文件的格式。当前仅有一个值adPersistADTG(默认格式:Advanced Data TableGram)

RecordCount* 只读Long类型,如果Recordset支持近似定位或支持书签,则返回带可流动游标的Recordset所含有的记录数;如果不支持,必须使用MoveLast方法以取得确实覆盖了所有记录的准确的RecordCount数值。如果forward-only类型Recordset有一条或多条记录,Recordset返回-1(True),任何类型的空的Recordset都将返回0(False)

Sort* 可读写String类型,包含一条不含保留字ORDER BY的SQL ORDERY BY子句,用以指定Recordset的排序方式

Source* 可读写String类型,可以是SQL语句、表名、存储过程名或相关Command对象名。如果提供了Command对象名,则Source将返回Command.CommandText的值。利用Open方法的参数lngOptions可以指定提供给Source值的类型

State 可读写Long类型,为对象状态常数之一。见State常数

Status 只读Long类型,表明对Recordset进行批处理或其他多记录(bulk)操作后的状态。见Status属性用到的常数


注意:上表所列属性是ADODB.Recordset对象的标准属性,即那些被关系数据库的大多数通用OLE DB数据提供者所支持的属性。带星号的属性表示它与DAO.Recordset或rdoResultset对象的相应属性完全一样或很接近。


方法


方法 用途

AddNew* 向可更新的Recordset添加一条新记录。调用语法为rstName.AddNew[{varField|avarFields},{varValue|avarValuese}],其中varField是单个字段名,avarFields是字段名数组。varValue是单个字段值,avarValue是由avarFields指定字段的值所组成的数组。调用Update方法则把新记录加到数据库的表中。如果向主关键字不是第一个字段的Recordset中添加记录,则必须在AddNew方法中指定主关键字的名称和值

Cancel 取消异步查询的执行,中止存储过程或复合SQL语句创建多个Recordset,调用语法为rstName.Cancel

CancelBatch* 取消LockEdit值为BatchOptimistic的Recordset的即将生效的批量更新操作,调用语法为:rstName.CancelBatch [lngAffectRecords],可选参数lngAffectRecords的取值见lngAffectRecords用到的常数

Clone 复制一个带有独立记录指针的Recordset对象,调用语法为:Set rstDupe=rstName.Clone()

Close 关闭Recordset对象,以后可以重新设Recordset的属性并使用Open方法来再度访问Recordset 。调用语法为:rstName.Close

Delete* 如果Recordset的LockEdit属性值未设为adLockBatchOptimistic,立刻从Recordset和相应表中删除当前记录

Find 寻找满足指定条件的记录。调用语法为:rstName.Find strCriteria [,lngSkipRecords, lngSearchDirection [,lngStart]],其中strCriteria是不含WHERE关键字的SQL WHERE子句,可选参数lngSkipRecords是应用Find前所跳过的记录数目,lngDirection指定查找方向(adSearchForward,和adSearchBackward,其中adSearchForward是默认值),可选参数lngStart指定了从哪儿开始查找,其值要么是一个Bookmark值,要么是Bookmark常数,见varStart参数用到的Bookmark常数。

GetRows 返回一个二维Variant数组(行、列),调用语法为avarname=rstName.GetRows(lngRows [,varStart[,{strFieldName|lngFieldIndex|avarFieldNames|avarFieldIndexes}]],其中lngRows是返回记录行数,varStart指定从哪儿开始查找,其值要么是一个Bookmark值,要么是Bookmark常数,见varStart参数用到的Bookmark常数。第三个参数可以是单个列(字段)的名称或索引,也可以是多个列名称或索引组成的Variant数组。如果不指定第三个参数,GetRows返回Recordset中所有列。

GetString 默认情况下,返回指定数目记录的String串值,记录间由返回代码分隔。记录内由tab分隔。调用语法为: strClip=rstname.GetString(lngRows,[, strCloumnDelimiter[,strRowDelimiter,[strNullExpr]]])。其中lngRows为返回记录行数,strColumnDelimiter为可选的列分隔符(vbTab是默认值),strRowDelimiter是可选的行分隔符(vbCr是默认值),strNullExpr是可选参数,用于碰到Null值时的替代值(默认值是空字符串)。GetString的主要用途是通过把控件的Clip属性设为strClip来处理MSFlexGrid或MSHFlexGrid控件

Move* 从当前记录移动记录指针。调用语法为:rstName.Move lngNumRecords [, varStart],其中lngNumRecords是要跳过的记录数,可选选参数varStart指定从哪开始移动。其值要么是一个Bookmark值,要么是Bookmark常数,见varStart参数用到的Bookmark常数。

MoveFirst* 移动记录指针到第一条记录,调用语法为:rstName.MoveFirst

MoveLast* 移动记录指针到最后一条记录,调用语法为:rstName.MoveLast

MoveNext 移动记录指针到下一条记录,调用语法为:rstName.MoveNext。它是能用于forward-only Recordset的唯一Move方法

MovePrevious* 移动记录指针到前一条记录,调用语法为:rstName.MovePrevious

NextRecordset 返回另外的Recordset,它通常由能产生多个Recordset的复合SQL语句(如SELECT * FROM orders;SELECT * FROM customers)或存储过程来创建。调用语法为Next=rstName.NextRecordset [(lngRecordsAffected)],其中可选参数lngRecordsAffected指定返回到rstNext中去的记录数目。如果已不存在Recordset,rstNext被设为Nothing

Open 在一个活动Command或Connection对象上打开一个Recordset,调用语法为:rstName.Open [varSource [, varActiveConnection [, lngCursorType [, lngLockType [, lngOptions]]]]]。这些参数都是可选的,

Requery 重新从表中获取Recordset的内容,等效于Close后再Open。它是一个资源集中型操作。语法为:rstName.Requery

Resync* 重新从表中获取部分Recordset内容。调用语法为rstName.Resync [lngAffectRecords],其中lngAffectRecords的取值见lngAffectRecords用到的常数。如果把该参数设为adAffectCurrent或adAffectGroup,则比adAffectAll(默认值)所耗的资源要少。

Save 创建包含Recordset永久性拷贝的文件。调用语法为rstName.Save strFileName。其中strFileName为路径和文件名。通常用.rst作为文件的扩展名。

Supports 如果数据提供者支持指定的游标相关的方法,则返回True,否则返回为False。调用语法为Supported=rstname.Supports (lngCursorOptions).关于lngCursorOptions,见Supports方法用到的常数。

Update* 使对Recordset的修改对底层数据源中的表生效。对于批量操作,Update方法只使修改对本地(Cached)Recordset生效。调用语法为rstName.Update

UpdateBatch* 合对指量类型的Recordset(LockType属性值为adBatchOptimistic,CursorType属性值为adOpenKeyset或adOpenStatic)所做的修改对底层数据源中的表生效。调用语法为rstName.UpdateBatch [lngAffectRecords],其中lngAffectRecords的取值见lngAffectrecords用到的常数。


注:ADODB.Recordset对象不支持Edit方法。为了改变ADODB.Recordset对象当前记录的一个或多个字段的值,可以先使用rstName.Fields(n).Value=varValue把相应字段的值改为所需要的值,而后执行rstName.Update即可。


事件


事件名称 触发时机

EndOfRecordset 记录指针试图移到最后一条记录之外时

FieldchangeComplete 字段值的改变完成之后

MoveComplete Move或Move...方法执行之后

RecordsChangeComplete 对单个记录编辑完成以后

RecordsetChangeComplete 缓存中的改变对底层表生效之后

WillChangField 对字段值改变之前

WillChangeRecord 对单个记录改变之前

WillChangeRecordset 缓存中的改变对底层表生效之前

WillMove Move或Move...方法执行之前


注:事件处理模块的函数头几乎都用到了adReason参数。该参数的取值见adReason参数用到的常数。


常数


AbsolutePage属性用到的常数


常数 含义

adPosUnknown 数据提供者不支持页面,Recordset为空,或数据提供者不能确定页码。

adPosBOF 记录指针定位于文件开头(BOF属性值为True)

adPosEOF 记录指针定位于文件结尾(EOF属性值为True)


CursorLocation属性用到的常数


常数 含义

adUseClient 使用客户端游标库提供的游标。ADODB.Recordset要求客户端游标

adUseServer 使用数据源提供的游标,通常(但非绝对)位于服务器上(默认值)


CursorType属性用到的常数


常数 含义

adOpenForwardonly 提供单向移动游标和只读Recordset(默认值)

adOpenDynamic 提供可滚动游标,可显示其他用户对Recordset所做的改动(包括添加新记录)

adOpenKeyset 提供可滚动游标,只隐藏其他用户所做的改动,类似于dynaset类型的DAO.Recordset

adOpenStatic 提供一个位于Recordset静态拷贝上的可滚动游标,类似于snapshot类型的DAO.Recordset,但多了可更新特性


EditMode属性用到的常数


常数 含义

adEditNone 无正在进行的编辑操作(默认值)

adEditAdd 临时添加一条记录,但尚未存入数据库的表中

adEditInProgress 当前记录中的数据已经改动,但尚未存入数据库的表中


Filter属性用到的常数


常数 含义

adFilterNone 除去已有的过滤器,显示Recordset中的所有记录(等效于把Filter属性置为空串,默认值)

adfilterAffectedRecords 只显示上次CancelBatch、Delete、Resync或UpdateBatch方法执行后所影响的记录

adFilterFetchedRecords 只当前Cache中的记录,记录条数由CacheSize来确定

adFilterPendingRecords 只显示已改动但尚未被数据源处理的记录(仅适用于批量更新模式)


LockType属性用到的常数


常数 含义

adLockRecordOnly 指定只读访问(默认值)

adLockBatchOptimistic 使用批量更新模式而不是默认的立即更新模式

adLockOptimistic 使用乐观锁(仅在更新过程中才锁定记录或页面)

adLockPessimistic 使用悲观锁(编辑或更新整个过程中均锁定记录或页面)


State常数


常数 含义

adStateClosed Connection(或其他对象)是关闭的(默认值)

adStateConnecting 正在连接数据源的状态

adStateExecuting Connection或Command对象的Execute方法已被调用

adStateFetching 返回行(row)到Recordset对象

adStateOpen Connection(或其他对象)是打开的(活动的)


Status属性用到的常数(仅适用于Batch或Bulk Recordset操作)


常数 含义

adRecOK 成功更新

adRecNew 成功添加

adRecModified 成功修改

adRecDeleted 成功删除

adRecUnmodified 无改动

adRecInvalid 未保存:Bookmark属性无效

adRecMultipleChanges 未保存:保存会影响其他记录

adRecPendingChanges 未保存:记录引用了一个等待插入操作

adRecCanceled 未保存:操作被取消

adRecCantRelease 未保存:现有记录值阻止了保存

adRecConcurrencyViolation 未保存:乐观并发锁发生了问题

adRecIntegrityViolation 未保存:操作会影响一致性

adRecMaxChangesExceeded 未保存:存在太多的等待改动

adRecObjectOpen 未保存:打开存贮对象发生冲突

adRecOutofMemory 未保存:内存不足

adRecPermissionDenied 未保存:用户权限不够

adRecSchemaViolation 未保存:记录的结构不符合数据库中的定义

adRecDBDeleted 未保存或删除:记录已被删除


lngAffectRecords参数用到的常数


Command类型常数 含义

adAffectAll 包括Recordset对象的所有记录,那些被Filter属性过滤隐藏的记录也计算在内(默认值)

adAffectCurrent 只包括当前记录

adAffectGroup 只包括那些符合当前Filter条件的记录


varStart参数用到的Bookmark常数


常数 含义

adBookmarkCurrent 从当前记录开始(默认值)

adBookmarkFirst 从第一条记录开始

adBookmarkLast 从最后一条记录开始




Supports方法用到的常数


常数 含义

adAddNew 调用AddNew方法

adApproxPosition 设置和得到Absoluteposition和AbsolutePage属性值

adBookmark 设置和得到Bookmark属性值

adDelete 调用Delete方法

adHoldRecords 获取另外的记录或改变获取记录指针的位置,但不提交未确定的改变

adMovePrevious 调用GetRows,Move,MoveFirst和MovePrevious方法(表明是一个双向可滚动游标)

adResync 调用Resync方法

adUpdate 调用Update方法

adUpdateBatch 调用UpdateBatch和CancelBatch方法




adReason参数用到的常数


常数 含义

AdRsnAddNew 调用了AddNew方法

AdRsnClose 调用了Close方法

AdRsnDelete 调用了Delete方法

AdRsnFirstChange 第一次对记录字段值做了修改

AdRsnMove 调用了Move方法

AdRsnMoveFirst 调用了MoveFirst方法

AdRsnMoveLast 调用了MoveLast方法

AdRsnMovePrevious 调用了MovePrevious方法

AdRsnRequery 调用了Requery方法

AdRsnResync 调用了Resync方法

AdRsnUndoAddNew AddNew操作被用户取消

AdRsnUndoDelete Delete操作被用户取消

AdRsnUndoUpdate Update操作被用户取消

AdRsnUpdate 调用了Update方法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

每日推荐上一条 /1 下一条

小黑屋|手机版|湖南大学望麓自卑校园传媒 ( 湘ICP备14014987号 )

GMT+8, 2024-11-24 10:33 , Processed in 0.334480 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表