五、探索ActiveX数据对象(ADO)
在这一节里,将接触到微软的一个数据库新技术,也就是所谓的ActiveX数据对象(ADO)。你将学习如何安装和使用ADO ActiveX控件、如何在你的窗体中使用绑定控件显示数据库记录和字段、以及如何编写程序代码来管理ADO事务。另外,你还将学习使用一个特殊的工具来生成你自己的ActiveX数据对象,这个工具就是数据环境设计器(Data Environment Designer)。这些技巧将有助于独立地管理Microsoft Access数据库、企业内部网数据库、以及在World Wide Web上的分布式数据库对象。
1、ADO内幕
ADO是Microsoft处理关系数据库和非关系数据库中信息的最新技术(关系数据库管理系统用表来操纵信息,但并非所有的数据源都遵从这一模式)。ADO没有完全取代你在前面已经使用过的现有数据库技术——数据访问对象(DAO),但是它确实把DAO的编程扩展到了新的领域。ADO基于微软最新的被称为OLE DB的数据访问模式。它是专门为了给大范围的商业数据源提供访问而设计的,包括传统的关系数据库表、电子邮件系统、图形格式、Internet资源等等。ADO比DAO所需的内存更少,所以它更适合于大流量和大事务量的网络计算机系统。
三种数据库编程方式
这些年以来,Microsoft已经为Visual Basic编程人员提供了三种不同的数据库编程方式,Visual Basic 6全面支持其中的每一种方式。请掌握这些缩写。
DAO——数据访问对象(DAO)方式是允许程序员操纵Microsoft Jet数据库引擎的第一个面向对象的接口。Jet数据库引擎是一种用来访问Microsoft Access表和其它数据源的记录和字段的技术。对于单一系统的数据库应用程序来说,DAO依然很受欢迎并且非常有效;在中等规模工作组的网络中,DAO也有少量的应用。
RDO——远程数据对象(RDO)方式是提供给开放数据库互连(ODBC)数据源的面向对象的接口。RDO是开发Microsoft SQL Server、Oracle、和其它大型关系数据库应用程序的绝大多数数据库开发者使用的对象模型。
ADO——ActiveX数据对象(ADO)方式是DAO和RDO方式的继承者,它也有一个类似的对象模式。在ADO方式中,可编程对象展示了你的计算机上所有可获取的本地和远程数据源。在Visual Basic 6专业版中,通过使用新的ADO控件、通过把数据对象绑定到内置控件和ActiveX 控件、通过创建DHTML应用程序、以及通过使用新的数据环境设计器等方法,你都可以访问这些可编程数据对象。
Microsoft建议Visual Basic程序员在用Visual Basic创建新的数据库应用程序时使用ADO方法,而且Microsoft在Visual Basic 6的专业版中已经包含了几种专门为支持ADO而设计的特性。然而,ADO是一种刚刚出现的技术,只有当你牢固的掌握了前面已经讨论过的基本数据库编程概念之后,你才能去探索它。这些概念包括:使用内置的数据控件、用绑定控件显示数据、用事件过程管理记录和字段、用FlexGrid控件显示和排序记录等等。当你升级到ADO时,你将会以全新的角度去看待数据库信息。
2、使用ADO ActiveX控件
按照ADO的设计方案,ADO控件没有DatabaseName(数据库名称)属性让你直接连接到计算机中的某个数据库文件上。取而代之的是,ADO控件包括一个ConnectionString(连接字符串)属性让你连接到计算机上某个ActiveX数据源。一系列的对话框会帮助你完成这种连接,并且,你可以通过使用数据环境设计器(Data Environment Designer)在已有数据源基础上建立新的数据对象的方法来定制连接过程。(本课后面你就会学到如何完成这项任务)。
一旦你理解了ADO和DAO在实际应用中的区别,你就会发现ADO控件与内置的数据(Data)控件十分的相似。在下面这部分中,将学习如何将ADO控件添加到工具箱中、如何设置ConnectionString(连接字符串)属性、以及如何在你的窗体中用几个绑定控件显示数据库记录。你也会掌握ADO程序代码的基本用法。
使用ADO ActiveX控件的基本步骤如下:
安装ADO控件
ADO控件是个ActiveX控件,在程序中使用该控件之前,必须首先把它添加到工具箱中(Microsoft ADO Data Control 6.0 )。
创建ADO对象并绑定控件
就像前面内容中使用的数据(Data)控件一样,ADO控件用四个箭头创建了数据库的导航装置。程序运行时,当此对象可见并且连接到适当的数据库后,你就可以单击最左面的箭头移动到数据库的第一条记录,最右面的箭头移动到数据库的最后一条记录,中间两个箭头让你分别移动到前一条记录或后一条记录。
创建数据源名称
如果使用的是Data(数据)控件,只需要简单地把数据控件的DatabaseName属性设置为你系统中的一个合法数据库的路径名称,就可以把它连接到数据库上了。但是,ADO的设计者为了将来的灵活性,要求完成更多的预处理步骤。这需要通过创建一个ActiveX数据对象来描述将要连接到的数据库记录。当创建数据对象时,可以有三个选项:你可以创建一个OLE DB文件;也可以创建一个ODBC数据源名称(DSN)文件;还可以建立一个OLE DB连接字符串。数据环境设计器(Data Environment Designer)正是为帮助你创建ActiveX数据对象而专门设计的(在本课后面部分你将会试一试这个设计器)。当然,你也可以通过使用ADO控件的ConnectionString属性来创建所需的文件。
在下面的练习中,将建立数据库文件和ADO控件ConnectionString属性之间的连接。为了简化连接并且提供必需的ActiveX数据对象,将要创建一个ODBC数据源名称文件。只需为你计划使用的每一个数据源创建一个数据源名称(.dsn)文件,只创建一次即可。在此之后,就可以反复使用它来指向相同的数据表。
设置ConnectionString属性
1)单击窗体中的ADO对象,打开属性窗口,单击ConnectionString属性字段中的按钮。系统将会显示一个属性页(Property Pages)对话框,如下图所示:

2)单击列表中的第二个选项按钮“使用ODBC数据资源名称(Use ODBC Data Source Name)”。
将创建一个引用zgda.mdb数据库的数据源名称文件。创建之后,无论现在还是将来,你都可以使用这个文件。
3)单击Use ODBC Data Source Name选项按钮右边的“新建New”按钮。你会看到如下图所示的对话框(它是一系列对话框中的第一个对话框):

这个对话框询问你打算如何共享你在此Visual Basic程序中访问的数据库。
第一个选项“文件数据源(File Data Source)”表示其它计算机上的用户可以共享你的数据库(通过网络或Internet)。这个选项可以给你相当大的灵活性,但对于单用户系统的数据库应用程序来说是没有必要的。
第二个选项“用户数据源(User Data Source)”表示数据库只驻留你正在使用的物理机器上,这个数据库只由你(知道你用户名的人)来使用。在本课中你可以选择第二个选项,因为你只给自己创建一个简单的示例。
第三个选项“系统数据源(System Data Source)”表示数据库驻留在你正在工作的计算机上,那些使用你的计算机并且以不同的用户名登录的人,也可以获取你的数据库。(在一些Windows的工作站上,这是一种非常流行的工作方式)。
4)单击第二个选项按钮(User Data Source),然后单击Next按钮。
如下图所示,系统将提示当连接到数据库时,你想使用哪一个数据库驱动程序。有很多种格式都可以被支持。

5)选择Microsoft Access数据库驱动程序,单击Next按钮继续。
Visual Basic将会总结你所做的选择,并请求你单击Finish按钮继续配置你的数据源名称文件。
6) 单击Finish按钮。
系统显示名称为ODBC Microsoft Access 安装的对话框。该对话框让你命名你的数据源名称文件、选择你要连接到的数据库、并且定制你的连接。
7) 在“数据源名(Data Source Name)”文本框中输入zgda。
在后面,当你在“属性页(Property Pages)”对话框中被提示输入DSN文件名时,你就用zgda。
8) 单击“选择(Select)”按钮,浏览目录,单击zgda.mdb数据库,然后单击OK。你的对话框如下图所示:

9) 单击OK关闭此对话框。
“属性页(Property Pages)”对话框将会重新出现。你刚刚创建了一个新的DSN文件,因此剩下的工作只是在“使用数据源名称(Use ODBC Data Source Name)”选项下面的下拉列表框中选择DSN。
10) 单击“使用数据源名称(Use ODBC Data Source Name)的下拉列表框,单击zgda。
11) 单击“属性页(Property Pages)”对话框中的OK按钮来完成你的连接。Property Pages对话框被关闭,条目DSN = zgda将显示在属性窗口中ConnectionString属性的后面。

虽然创建数据源名称文件需要几步额外的操作,但是这个过程使你在你配置和建立每一个数据库连接时有了最大限度的自由。当你开始用Visual Basic来管理复杂的数据库时,你一定会对数据源名称文件所提供的灵活性和一致性大加赞赏。
将ADO数据绑定到文本框对象上
1) 在属性窗口中显示ADO对象(adodc1)的属性,单击RecordSource属性名称右边的按钮。再次出现“属性页(Property Pages)”对话框,单击“命令类型(Command Type)”下拉列表框,选择2-adCmdTable。Visual Basic使用DSN文件打开zgda.mdb数据库,并且将表的名称加载到“表或存储过程名称(Table Or StoredProcedure Name)”下拉列表框中。
2) 单击“表或存储过程名称(Table Or StoredProcedure Name)”下拉列表框,选择“基本信息表”表。

3) 单击OK,完成RecordSource选择。
在属性窗口中,RecordSource属性后面将会出现表名基本信息表”。

4)将数据绑定到控件上。
将Text1对象、Text2对象的DataSource属性分别都设置为Adodc1,Text1对象的DataField属性设置为“姓名”, Text2对象的DataField属性设置为“职称”(可以添加更多的文本框以显示更多的字段)。
5)将窗体保存为文件MyAdoCtrl.frm,将工程保存为文件MyAdoCtrl.vbp。并运行ADO控件演示程序。
3、编写ADO程序代码
管理ActiveX数据对象的事件过程是使用ADO方式访问数据库的数据库应用程序的核心。在很多方面,ActiveX数据对象通过ADO控件显示的方法、属性和事件前面使用的Data控件处理的方法、属性和事件很相似。例如,两种方式下你都可以通过记录集操纵信息,记录集中保存着正在处理的数据库信息。
下面的练习中,将把ADO程序代码输入到一个称之为AdoData的框架程序中。AdoData程序是在本课前面创建的AdoCrtl程序的基础上修改而成的。在修改后的窗体中,AdoData允许用户通过两个新的Next和Previous命令按钮来访问数据库记录,它还允许你双击列表框中的字段名称把所有此字段的数据库记录复制到一个文本文件中(例如,你可以通过一次双击将所有的LastName字段内容复制到文本文件中)。在这个工程中,我已经为你创建了完整的用户界面——你只要输入程序代码即可。
例题:创建MyAdoData程序
1)将上面的练习“另存为”“MyAdoData”工程和窗体,用新的名称保存窗体和工程,保留原来的文件,这样以后你就可以重新练习了。
2)在窗体上添加命令按钮、标签和列表框控件,如下图。

3)双击窗体中的Next命令按钮,在代码窗口中打开Command1_Click事件过程,在Sub和End Sub语句之间输入下列程序代码:
Private Sub Command1_Click() If Not Adodc1.Recordset.EOF Then '如果不是最后一条记录,则移到下一条记录 Adodc1.Recordset.MoveNext Else Adodc1.Recordset.MoveFirst End If End Sub
程序说明:这段简单的程序检验EOF属性,如果当前记录不是数据库中的最后一条记录,它将通过MoveNext方法使ADO对象前进到下一条记录。在移动记录之前检验EOF(文件末尾)属性,你就可以避免当ADO控件试图移到最后一条记录后面时所发生的运行错误。
在这个程序中,ADO控件通过Adodc1对象体现出来的,它连接到数据库zgda.mdb中的“基本信息表”上。作为Adodc1对象的成员,RecordSet属性在内存中保存着“基本信息表”表,同时,它还提供了对数据和命令的访问。这个对象集并不是你表中的真实数据,它只是在你的应用程序运行时创建的表中数据的副本。对象集可以是一个表的原样的副本,也可以是一个查询结果或其它选择操作的结果。
4)双击窗体中的Previous命令按钮,在代码窗口中打开Command2_Click事件过程,在Sub和End Sub语句之间输入下列程序代码:
Private Sub Command2_Click() If Not Adodc1.Recordset.BOF Then '如果不是第一条记录,则移到前一条记录 Adodc1.Recordset.MovePrevious Else Adodc1.Recordset.MoveLast End If End Sub
程序说明:这个事件过程是为Previous按钮编写的代码,当用户单击它时将移动到上一条记录。如果BOF(文件头)属性值为True(真),程序将会忽略MovePrevious方法,因为如果当前记录已经是第一条记录的话,再试图移动到前一条记录将会引发运行错误。
5)在代码窗口中打开Form_Load事件过程,在Sub和End Sub语句之间输入下列程序代码:
Private Sub Form_Load() For i = 1 To Adodc1.Recordset.Fields.Count - 1 '用字段名称填充列表框 List1.AddItem Adodc1.Recordset.Fields(i).Name Next i Label1.Caption = "Total records:" & Adodc1.Recordset.RecordCount '显示记录的总数 End Sub
程序说明:Form_Load事件过程完成了两项工作。它把“基本信息表”表中的每个字段的名称添加到列表框对象中(List1),用第一个标签对象(Lable1)显示数据库中记录的总数。这两项工作都是完全利用ADO对象的属性来完成的。
利用字段集能得到字段的数量和每一个字段的名称。你可以通过Fields对象的索引名称来访问表中的字段。例如,Fields(2)表示表中的第二个字段。通过一个For...Next循环对数据库中的每一个字段执行一次,我把每个字段的名称复制到下拉列表框对象中,这样就可以使用户以后通过双击来选择它们了。
可以使用RecordCount属性在窗体中显示记录的总数。这个值可以让用户知道如果他们选择双击在列表框对象中的字段名,那么将有多少条记录被写到磁盘上。为了使这个值处于可管理的范围内,我已经把zgda.mdb数据库长度限制在9条记录(当把10,000条字段信息从某一个数据库(如Biblio.mdb数据库)写入文本文件之前,用户应该三思而后行)。
6)在代码窗口中打开List1_DblClick事件过程,在Sub和End Sub语句之间输入下列程序代码:
Private Sub List1_DblClick() Const myFile = "c:\temp\names.txt" '创建常量来保存文本文件名称 Open myFile For Append As #1 '以添加方式打开文件(支持多字段) Print #1, String$(30, "-") '打印一条虚线 Adodc1.Recordset.MoveFirst '移到第一条记录 x = List1.ListIndex + 1 '选中项目 '对数据库中的每一条记录,把字段信息写入磁盘 For i = 1 To Adodc1.Recordset.RecordCount Print #1, Adodc1.Recordset.Fields(x).Value Adodc1.Recordset.MoveNext Next i '打印成功信息,关闭文件 MsgBox Adodc1.Recordset.Fields(x).Name & " field written to " & myFile Close #1 Adodc1.Recordset.MoveFirst End Sub
程序说明:List1_DblClick事件过程通过在磁盘上创建一个名为Names.txt的文本文件,处理了实际的存贮过程。首先该例程声明了一个常量来保存文件的路径名称。然后用Append(添加)模式打开文件,目的是为了在文件中存贮多条字段信息,而不会将前面的内容覆盖掉。使用MoveFirst方法将记录集移到表中的第一条记录。然后,通过使ListIndex属性值加1来确定用户在列表框中双击的字段,并把它赋值给变量x。ListIndex是一个非常有用的属性,它包含了列表中被选中项目的序号。由于列表框的实际索引值是从零(0)开始的,所以要把序号加1。
使用下面的程序语句把实际的字段值写入磁盘:
Print #1,Adodc1.Recordset.Fields(x).Value
正像前面已经学过的那样,Fields集合的Name属性包含着选中字段的名称。而使用Value属性可用来访问存贮在字段中的实际文本。Print语句将这个值写入文本文件。对数据库中每一个匹配的字段,这个操作都将重复执行。
7)保存、运行并检查c:\temp\names.txt文件。
4、使用数据环境设计器来创建ActiveX数据对象
在本课前面部分,创建了一个数据源名称(DSN)文件,用它把Students.mdb数据库和ADO数据控件连接在一起。由这个文件提供的ActiveX数据对象允许你创建事件过程来显示和选取数据库中Students表的字段信息。在Visual Basic6.0专业版中,你也可以通过一个称为数据环境设计器(Data EnviromentDesigner)的新工具来创建你自己的定制ActiveX数据对象。数据环境设计器允许你创建对象命令,这些对象命令可以通过有效的新方法来定制和重新组织数据库表、字段和记录。下图显示了数据源、ADO命令对象和使用ADO资源的程序之间的关系(当前选中的是Microsoft Access命令对象 - 它只是可连接选项中的一个)。

作为一个练习,我们将使用数据环境设计器来创建一个定制的ActiveX数据对象。
创建定制的数据环境
为应用程序创建包含ActiveX数据对象的定制数据环境,需要按如下步骤进行操作:
1) 在Visual Basic的Project(工程)菜单中单击Add Microsoft DataEnvironment 6.0菜单项
如果没有Add Microsoft Data Environment 6.0菜单项,那么就请单击More ActiveX Designers。
Visual Basic将“数据环境设计器”加入你的工程中。这个特殊的数据管理部件允许你创建一个新的ActiveX数据对象,并且在你的工程中使用它们。
如下图所示,你首先将会看到一个叫做Connection1 Properties的对话框,它提示你输入数据源信息。

2)指定连接源。右击Connection1,选择“属性”,出现一个熟悉的界面,和前面一样,建立数据库的连接。
数据环境窗口是一个通用的显示窗口,从中可以观察到当前建立的连接和ADO命令集。Connection1是选中建立的数据库连接。这个连接允许你来调整数据库中表、字段和记录的访问方式。
3)在数据环境工具栏中单击(或右击Connection1),选中Add Command(添加命令)按钮。

Add Command按钮将会在数据环境中创建一个新的ActiveX数据对象“Command1(你可以在属性窗口中重新设置它的Name属性)”。为了设置这个数据对象特有的属性,Visual Basic显示Command1 Properties(属性)窗口。
4)右击Command1,选择“属性”,单击Database Object(数据库对象)选项按钮右边的下拉列表框,单击Table类型(通过选择Table,你告诉数据环境你希望创建一个表对象);单击Object Name(对象名称)下拉列表框,然后单击你希望连接的表(本例为“基本信息表”)。

5)单击OK,在数据环境中创建Command1命令。新的ADO命令显示在Command1文件夹中。单击Command1指令左边的加号,展开表并查看它的字段。

你刚刚创建了一个新的ActiveX数据对象,你可以在当前工程中使用它或在任何其它你添加了这个数据环境设计器的工程中使用它。数据环境设计器被保存在一个特殊的以.dsr为扩展名的文件中(缺省情况下为DataEnvironment1.dsr)。现在,让我们把这个文件保存到磁盘中,这样在其它工程中你也可以使用它了。
在你的应用程序中引用ADO命令
如同ADO控件绑定ActiveX数据对象一样,数据环境设计器中的ADO命令也可以在绑定控件和事件过程中使用。
例如,在你刚才建立的工程中,添加一个文本框控件,文本框控件的DataSource属性选中DataEnvironment1对象、DataMember属性选择Command1命令,但在运行时,只显示数据库中的第一条记录。
相似的,你可以使用程序代码来访问ADO命令的全部记录。例如,要利用你在上面创建的DataEnvironment1对象在数据库表中移到下一条记录,你可以添加一个命令按钮,并输入如下代码:
Private Sub Command1_Click() If Not DataEnvironment1.rsCommand1.EOF Then '如果不是最后一条记录,则移到下一条记录 DataEnvironment1.rsCommand1.MoveNext Else DataEnvironment1.rsCommand1.MoveFirst End If
End Sub
在这里,Command1命令有个rs作为前缀(rsCommand1是自动生成的),这是由于它引用了由当前数据环境设计器DataEnvironment1维护的记录集。注意,粗略地说,这个命令等价于你在前面为ADO控件编写的MoveNext语句:
Adodc1.Recordset.MoveNext
在大多数情况下,通过自己的ActiveX数据对象来引用数据,将会让你的程序更加简明,并且更适合于多种数据源的要求。
|