数据库是一个以电子化方式存储于文件中的大量信息的有机组织的集合。你可以使用许多数据库产品建立强大的数据库,这些产品包括Microsoft Access、Microsoft FoxPro、Btrieve、Paradox和dBASE等。你还可以使用Open Database Connectivity(ODBC)型客户机/服务器数据库,比如Microsoft SQL Server等。
Visual Basic能够在多种数据库格式中读取和写入信息。
如果你经常与数据库打交道——特别是上面提到的这些数据库,那么你应当考虑使用Visual Basic作为一种改进和显示数据的强大工具。由于Visual Basic中实施了与Microsoft Access中所使用的同样的数据库技术(一种名为Microsoft Jet的数据库引擎),因此使用几十行应用程序代码你就能建立一个定制数据库应用程序。
下面,将学习如何使用Visual Basic数据对象来管理用Microsoft Access创建的一个名为zgda.mdb的数据库。该数据库包含了“基本信息表”和“工资项目表”。你将学习如何从该数据库中显示多个字段的信息,以及如何编写可以执行有用任务的程序代码,如查找记录、添加新记录、删除不用的记录以及备份文件等。
一、使用数据对象浏览Microsoft Access数据库
为了增强数据库操作能力,Visual Basic提供了三个对象,使用它们可以显示、修改数据库文件中的信息。其中最主要的对象是数据(Data)对象,它使你能够在窗体上直接访问数据库文件中的字段和记录。现在我们练习使用数据对象显示名称为zgda.mdb的Microsoft Access数据库中的信息。
字段和记录的概念
描述数据库中信息的两个重要术语是字段和记录。字段是存储在数据库中的信息类别,客户数据库中的典型字段包括客户姓名、地址、电话号码以及注释等。有关特定客户或事务的所有信息称做记录。创建数据库时,信息就输入在由字段和记录组成的表中。一般来说,记录对应于表中的行,字段对应于表中的列。
1、创建数据对象
单击工具箱中的Data(数据)控件, 将鼠标指针移动到窗体中心、靠近窗体底部的地方,用该控件绘出一个矩形。名称为Data1的数据对象显示在窗体上。
数据对象上的箭头让你在程序运行时滚动数据库中的记录。该对象还包含了一个标题(目前为Data1),你可以使用它来说明用数据对象要访问的数据库。一般来说,这个标题设置为数据库的名称。数据对象外部边缘上的第二个箭头用于移动到数据库的开始或结尾位置。
2、使用绑定控件显示数据库信息
绑定控件可以自动处理数据库信息。使用Visual Basic工具箱控件所创建的大部分对象都具有显示数据库信息的内置功能。在数据库术语中,这些对象被称为绑定控件。当一个对象的DataSource(数据源)属性与一个有效数据库名建立连接、并且其DataField(数据字段)属性与该数据库中的一个有效字段建立连接时,该对象也就绑定于该数据库了。表是当创建数据库时由你或其他人定义的一组字段和记录。
Visual Basic中的绑定控件主要有CheckBox(复选框)、ComboBox(组合框)、Image(图像框)、Label(标签)、ListBox(列表框)、PictureBox(图片框)、TextBox(文本框)等。
下面使用文本框对象显示数据。
在Visual Basic中可以完成许多复杂的数据库操作。本练习中,将显示zgda.mdb数据库的“姓名”字段(你能够真正滚动数据库并浏览数据库文件中的每个名字)。为了把“姓名”字段显示在窗体上,需要增加另外一个用于保存数据的对象。由于要显示的数据是文本数据,因此将在窗体上增加一个文本框对象(还要在文本框上方放置一个标签控件,指明文本框是个数据库字段)。最后,通过几个属性设置,建立数据对象与文本框对象之间的连接,或者说把它们绑定在一起。
下面的程序使用一个数据对象和一个文本框对象来显示zgda.mdb数据库中的一个数据库字段“姓名”。该程序演示了如何创建一个定制数据库应用程序,以便检查看你所想查看的信息。
创建文本框对象和标签对象。
在窗体上添加一个TextBox(文本框)控件和一个Label(标签)控件(这些控件就称为数据库绑定控件)。
最后界面为:
3、设置对象属性
(1)数据对象的属性
1) 在属性窗口中,确保Connect属性设置为Access(缺省设置)。Connect属性记录要使用的数据库或工作表的格式。Visual Basic能够识别的格式包括Access、Excel、Lotus 1-2-3,dBASE、FoxPro以及Paradox。
2) 在属性窗口中,通过在DatabaseName对话框中选择文件名来把DatabaseName属性设置为c:\vb6sbs\zgda.mdb(数据库存放的路径,在这里的路径只是一个参考,在实际操作时,最好和工程文件保存在同一个文件夹下)。
zgda.mdb是本练习中要打开的样本Access数据库。它包含了一系列职工有用的表、字段以及记录。
3) 在属性窗口中,单击RecordSource属性,然后单击下拉列表框上的箭头。当显示一系列数据库表时,单击列表框中的“基本信息表”。RecordSource属性用于指定要打开的数据库中的表(数据集合)。
4) Caption属性设置为“zgda.mdb”。该控件的标题变为zgda.mdb,提醒用户正在使用这个数据库。
5)RecordsetType属性为0-Table。
6)数据(Data)对象的ReadOnly(只读)属性若被设置为True,数据库中的信息就只能看而不能修改了。为使用户可以对Students.mdb数据库进行修改,可以将ReadOnly(只读)属性设置为False(假)(在该应用程序中,数据(Data)对象的ReadOnly(只读)属性被设置为False,以便完成后面的“修改数据库”的练习)。
提示:为确保原始zgda.mdb数据库完好无损,在你进行练习之前,应先对其备份。
(2)文本框对象的属性
现在设置文本框对象的DataSource属性,把文本框连接到数据对象上。
1) 在属性窗口中,单击DataSource属性,单击下拉列表框上的箭头,然后单击Data1。
2) 在属性窗口中,单击DataField属性,单击下拉列表框上的箭头,然后单击列表框中的“姓名”(这时要显示的字段)。
(3)标签对象属性
标签对象的标题修改为“姓名:”。这样,就标识出程序运行时文本框中显示的数据库字段。向窗体上增加标签来解释其它对象的作用总是个不错的想法,特别在使用数据库字段时更是如此。
将窗体保存为MyData,将工程保存为MyData,并运行程序。
单击数据对象右侧靠里面的箭头,下一个个姓名显示在文本窗口中;单击数据对象右侧靠外面的箭头。Visual Basic显示数据库中最后一个姓名; 单击数据对象左侧靠外面的箭头,Visual Basic显示数据库中第一个姓名;单击数据对象左侧靠里面的箭头。显示上一个姓名。
同样,还可以再添加文本框和标签,用以显示其它的字段,如职称、部门等等。
可见,不需编写任何代码,就可浏览表中的内容
[程序演示] [程序下载]
二、修改数据库
数据对象允许你修改数据库中的信息。为了修改Students.mdb数据库中的姓名,运行MyData程序,并滚动记录到你要修改的姓名上。然后单击文本框中的姓名,按你自己喜欢的方式编辑姓名。当改变到其它记录时,所作的修改被立即复制到原始数据库中。现在就让我们来试一试吧。
修改数据库中的姓名。
1) 单击工具条上的Start(启动)按钮运行程序。数据库中第一个姓名出现在文本框中。
2) 使用鼠标点亮第一个姓名,按Del键,然后键入Cocco(或其他姓名)。
3) 单击数据对象右侧靠里的箭头,移动到下一条记录。数据库中第一个姓名被修改为Cocco。
4) 单击数据对象左侧靠里的箭头,回到前一条记录。第一个姓名现在显示为Cocco。同时,原数据库中的数据也被修改了。
正如你所看到的那样,数据对象为你提供了快速访问已有数据库的方法。你可以显示数据库中的任何字段,并以适宜的方式处理这些信息。在随后的课程中,将学到数据对象的更多知识以及如何操作数据库记录。
三、使用Recordset对象
Recordset(记录集)对象代表你在程序中使用的数据。
在上面的程序中,曾使用一个名为RecordsetType(记录集类型)的数据属性指明数据库信息为一个表。在Visual Basic中,Recordset(记录集)是一个代表你正在程序中使用的数据库部分的对象。当把数据控件的RecordSource属性设置为表或查询的名称时,就定义了一个新的名为Recordset的对象。Recordset对象有它自己的一套特殊属性和方法,使你能查找、排序、添加和删除记录。
在下面的练习中,将使用Recordset对象在zgda.mdb数据库中按编号查找项目,并将它们显示出来。
1、在zgda.mdb中查找数据
在修改程序之前,为保护原始程序,请先以新文件名将它存盘。
1) 在文件菜单中,单击另存为窗体、另存为工程菜单项。以MyFindRec.frm、MyFindRec.vbp为文件名分别保存窗体和工程。
2)在窗体的左下方创建两个命令按钮对象,Caption属性分别设置为“查找”、“结束”。
3)添加代码。
Option Explicit
Dim prompt As String, searchSearchStr As String
Private Sub Command1_Click()
prompt$ = "输入要查找的编号:"
searchSearchStr$ = InputBox(prompt$, "搜索记录")
Data1.Recordset.Index = "Primarykey" '使用类名
Data1.Recordset.Seek "=", searchSearchStr '进行搜索。Seek方法可以查找匹配的记录。
If Data1.Recordset.NoMatch Then '如果不匹配
Data1.Recordset.MoveFirst '则取第1课记录
End If
End Sub
程序说明:
该事件过程显示一个查找对话框,以便用户能输入编号(SearchStr$)。接下来它使用Seek方法从头至尾对数据库“编号”字段进行搜索,直至找到匹配项或者搜索到表的结尾。如果未找到匹配项,Visual Basic将显示一条信息“No current record”,并且在第一个文本框中显示Recordset(记录集)的第一条记录。该事件过程所使用的Recordset属性和方法如下表所示:
Recordset属性或方法 | 说明 |
Index | 用于定义查找和排序过程中所使用的数据库字段的属性 |
Seek | 用于查找记录的方法。除=以外,关系运算符>=、>、<=和<也可用来将所查找的字符串与数据库中的文本进行比较 |
NoMatch | 该属性的值为True时表示未查找到匹配项 |
MoveFirst | 使Recordset的第一条记录成为当前记录的一个方法 |
2、向zgda.mdb数据库添加记录
在向数据库添加新记录时,应在设计模式下将数据对象的ReadOnly(只读)属性设定为False(假),然后使用事件过程中的AddNew(添加新记录)方法在数据库中添加新记录。当窗体中出现空白记录时,用户就可以在需要的字段中填写内容了,添加完毕后,将当前记录移动到数据库中的其它记录即可。用户移动到不同记录的较简单的方法是单击数据对象的一个按钮。当用户移动到其它记录时,新的记录就按字母顺序被插入数据库中了。下面的练习演示了如何使用ReadOnly属性和AddNew方法在数据库中插入新记录。在该过程中,InputBox函数为用户提供了一些可视化反馈信息。
注:AddNew方法用来向数据库添加一条新记录。
让用户向数据库中添加记录在修改程序之前,为保护原始程序,请先以新文件名保存原始程序。
1) 在File(文件)菜单中,单击Save MyFindRec.frm As(MyFindRec.frm另存为)菜单项。将MyFindRec窗体另存为MyAddRec.frm。使用Save Project As(工程另存为)菜单项将该工程另存为MyAddRec.vbp。
2)将Data1对象的ReadOnly属性设定为False。
3)在窗体的Find按钮右边再创建一个命令按钮对象Command3,并设置“Caption”属性为“添加”。
4)双击“添加”按纽,编写代码。
Private Sub Command3_Click()
Dim reply
prompt$ = "Enter the new record, and then click the left arrow button."
reply = MsgBox(prompt$, vbOKCancel, "Add Record")
If reply = vbOK Then 'if the user clicks OK
Text3.SetFocus 'move cursor to Title box
Data1.Recordset.AddNew 'and get new record
End If
End Sub
该过程首先向用户显示一个包含数据输入提示的对话框。MsgBox函数使用vbOKCancel参数(由Visual Basic定义的数字型常量)显示一个含有OK(是)和Cancel(取消)按钮的对话框。如果用户单击OK,AddNew方法将创建一条新记录。如果用户单击Cancel,则操作被取消。该事件过程还使用SetFocus方法使Text3文本框中得到输入焦点。SetFocus方法可用来激活任何一个可以得到输入焦点的对象。
现在你就可以使用“添加”按钮向数据库添加新记录了。
运行:单击“添加”按钮,程序显示Add Record对话框,单击OK按钮,窗体中出现新的空记录。按顺序输入新记录信息(按Tab键在字段间切换)。你可以使用“添加”铵钮向zgda.mdb数据库中添加任意条记录。
3、从zgda.mdb数据库中删除记录
从数据库中删除记录时,你可以先显示出想要删除的记录,然后使用Recordset对象中的Delete方法将该条记录删除。在程序中打开数据库之前,你必须将数据对象的ReadOnly属性设定为False(在前面使用AddNew方法添加记录时你也执行过此类操作)。记录被删除后,你的代码应当显示数据库中的另一条记录,原因在于数据对象无法自动完成这一工作。一般情况下,最好的技巧是使用MoveNext方法来显示数据库中的下一条记录。
下面的练习演示了如何使用Visual Basic从zgda.mdb数据库中删除记录。要特别注意程序中MsgBox函数的用法。由于数据对象不提供“撤销”特性,因此在程序从数据库中永久删除一条记录之前,使程序确认用户的确想执行这一操作是十分重要的。
特别强调:Delete方法从数据库中永久删除一条记录。如果你不想让你的用户具有删除记录的能力,切勿为他们提供这种方法。
让用户从数据库中删除记录
注:Delete方法可以从数据库中删除一条记录。
在修改MyAddRec程序之前,为保护原始程序,请先以新文件将其存盘。
1) 在File(文件)菜单中,单击Save MyAddRec.frm As(MyAddRec.frm另存为)菜单项,将MyAddRec窗体另存为MyDelRec.frm。使用Save Project As(工程另存为)菜单项将工程另存为MyDelRec.vbp。
2) 确认Data1对象的ReadOnly属性被设置为False。
3) 在窗体中的“添加”按钮右边再创建一个命令按钮对象Command4,Caption属性为“删除”。
4) 双击“删除”按纽,编写代码。
Private Sub Command4_Click()
Dim reply
prompt$ = "Do you really want to delete this course?"
reply = MsgBox(prompt$, vbOKCancel, "Delete Record")
If reply = vbOK Then 'if the user clicks OK
Data1.Recordset.Delete 'delete current record
Data1.Recordset.MoveNext 'move to next record
End If
End Sub
该过程首先显示一个对话框,询问用户是否希望删除当前记录。同样,此处MsgBox与vbOKCancel参数一同使用,如果用户决定不想执行删除操作则可以退出。如果用户单击OK,则Delete方法将删除当前记录,同时MoveNext方法显示下一条记录。如果用户单击Cancel按钮,则删除操作被取消。
4、FileCopy语句用来对文件进行备份
对于大多数人来说,存放于数据库中的信息都十分重要,一旦数据库出了问题,他们就将面临很大的麻烦。因此,在对每个数据库做任何修改之前,你都应当先对该数据库进行备份。当所使用的备份出现问题时,你就可以简单地用原始数据库覆盖备份即可。你经常使用的备份方法也许是使用一种商业备份程序、Windows Explorer或者你的数据库软件中所包含的你自己的专用备份功能。作为一种额外的保险措施,你可以使用FileCopy语句从Visual Basic程序内部制作一个或多个文件的备份。FileCopy可以制作独立的文件备份(如同Windows Explorer中的Edit菜单下的Copy菜单项一样),其使用语法为:
FileCopy sourcepath destinationpath
其中,sourcepath(源路径)是你想备份的文件的路径名,destinationpath(目标路径)是你想建立的文件的路径名。
注意:如果源路径所指明的文件目前正被打开,则FileCopy不能正常工作。
在下面的练习中,将通过把FileCopy语句放入Form_Load事件过程中而在你的MyDelRec程序中添加备份特性。
使用FileCopy制作zgda.mdb的备份
为保护原始程序,首先你应将MyDelRec程序以新文件名存盘。
注:在启动过程中添加FileCopy语句,就可以使用户在对数据库做任何修改之前先行备份数据库了。
1) 在File(文件)菜单中,单击Save MyDelRec.frm As(MyDelRec.frm另存为)菜单项。将MyDelRec窗体另存为MyBackup.frm。使用Save Project As(工程另存为)菜单项,将该工程保存为MyBackup.vbp。
2)双击窗体(不是对象),在代码窗口中打开Form_Load事件过程。在Form_Load事件过程中输入下面的程序语句:
Private Sub Form_Load()
Dim reply, FileNm As String
prompt$ = "Would you like to create a backup copy of the database?"
reply = MsgBox(prompt$, vbOKCancel, Data1.DatabaseName)
If reply = vbOK Then 'copy the database if the user clicks OK
FileNm$ = InputBox$("Enter the pathname for the backup copy.")
If FileNm$ <> "" Then
FileCopy Data1.DatabaseName, FileNm$
End If
End If
End Sub
该例程在程序启动时显示一个消息框,询问用户是否想要对数据库进行备份。MsgBox函数与vbOKCancel参数一同使用,使用户能够取消备份操作。此处MsgBox函数中又使用了DatabaseName属性以便在对话框标题条中显示数据库名称。如果用户单击了OK按钮,则出现另一个消息框,让用户指定备份文件的路径名。当用户再次单击OK按钮时,FileCopy语句就开始备份文件。
本节内容总结:
目的 | 执行步骤 |
打开数据库 | 使用Data控件在窗体中创建一个数据对象,将其DatabaseName属性设定为该数据库名。使用Connect(连接)属性指明数据库类型,使用RecordsetType(记录集合类型)属性指明记录的类型 |
以只读模式打开数据库 | 将数据对象的ReadOnly属性设定为True |
在文本框对象中显示数据字段 | 在文本框中设置DataField和DataSource属性 |
在数据库中查找数据 | 提示用户输入一个查找字符串,然后在事件过程中使用Recordset对象的Index、Seek、NoMatch和MoveFirst属性。 |
向数据库添加记录 | 使用Recordset对象的AddNew方法。例如: Date1.Recordset.AddNew |
从数据库中删除记录 | 使用Recordset对象的Delete方法。例如: Date1.Recordset.Delete |
显示数据库的第一条记录 | 使用Recordset对象的MoveFirst方法。例如:Date1.Recordset.Movefirst |
拷贝文件 | 使用FileCopy语句。例如: FileCopy Date1.DatabaseName, FileNm$ |
让对象得到输入焦点 | 使用对象的SetFocus方法。例如: text3.SetFocus |
补充说明:
数据控件常用属性
1、Connect属性
Connect属性指定数据控件所要连接的数据库类型。
2、DatabaseName属性
DatabaseName属性指定具体使用数据库的名称,包括所有的路径名。
如果连接的是单表数据库,则DatabaseName属性应设置为数据库文件所在的子目录名,而具体文件名放在RecordSource属性中。
如果在“属性”窗口中单击DatabasName属性右边的按钮,会出现一个公用对话框用于选择相应的数据库。
例如,下面语句设置了可访问的数据库名称:
如果连接一个Microsoft Access的数据库C:\职员档案.mdb,则Data1.DatabaseName=“C:\职员档案.mdb”;如果连接一个Foxpro数据库C:\yang\职员档案1.dbf,因为Foxpro数据库只含有一个表,则Data1.DatabaseName=“C:\yang”,RecordSource=“职员档案1.dbf”。
如果未写数据库文件的扩展名,则缺省情况下为使用以.mdb为扩展名的数据库文件。
3、RecordSource属性
RecordSource属性确定具体可访问的数据,这些数据构成记录集对象Recordset。
4、RecordsetType属性
RecordsetType属性确定记录集类型。
5、ReadOnly属性
在对数据库只查看不修改时,通常将ReadOnly属性设置为True,而在运行时根据一定的条件,响应一定的指令后,才将它设置为False。
6、Exclusive属性
Exclusive属性值设置为True时,则在通过关闭数据库撤消这个设置前,其他任何人不能对数据库访问。这个属性的缺省值是False。
7、BOFAction、EOFAction属性
当BOFAction值为0,控件重定位到第一个记录;BOFAction值为1,移过记录集开始位,定位到一个无效记录,触发数据控件对第一个记录的无效事件。
当EOFAction值为0,控件重定位到最后一个记录;当EOFAction值为1,移过记录集结束位,定位到一个无效记录,触发数据控件对最后一个记录的无效事件;EOFAction值为2,向记录集加入新的空记录,可以对新纪录进行编辑,移动记录指针新纪录写入数据库。
数据绑定控件常用属性
要使文本等控件与数据控件捆绑在一起,成为数据控件的绑定控件。并且能够受到数据库约束,必须在运行时对这些控件的两个属性进行设置:
1、DataSource属性
DataSource属性用来将一个有效的数据控件与一个数据库连接。
2、DataField属性
DataField属性设置数据库有效的字段与绑定控件建立联系。
数据控件上的对象
数据控件是依靠数据对象来获取对数据访问的,与其相关的数据对象有:
1、 Database对象
Database对象是物理数据库的逻辑表示。数据控件通过DatabaseName属性连接到一个具体的数据库,并通过它的Database对象表现出来。
除了数据控件获取Database对象之外,还可以在程序中定义Database对象,并通过OpenDatabase()函数实现对物理数据库的连接;或者将数据控件的Database对象传递给被定义的Database对象。
例如以下语句:
Dim Ds1 As Database '定义数据对象
Dim Ds2 As Database
Set Ds1= OpenDatabase(“e:\VB\class.mdb) '使Ds1获取物理数据库
Set Ds2=Me.data1. Database '将数据控件的Database对象传递给Ds2
2、Recordset对象
Recordset对象代表一组与数据库相关的逻辑记录集合。它所对应的数据来源可以是数据表,也可以是和SQL语言中查询语句(SELECT)有关的查询结果。
Recordset对象有三种类型:
Table类型:记录集为表集,可以显示、添加、删除和修改,具有较好的更新性能。
Dynaset类型:记录集为动态集,可以显示、添加、删除和修改,并具有较大的操作灵活性。
Snapshot类型:记录集为快照集,只能显示,具有较好的显示速度。
除了Data控件获取Recordset对象之外,还可以在程序中定义Recordset对象,并通过函数获得数据。
Dim Ds As Database '定义数据对象
Dim Rs As Recorderset '定义记录对象
Set Ds= OpenDatabase("e:\VB\class.mdb") '使Ds获取物理数据库
Set Rs=Me.data1. Database. OpenRecordset("SElECT *FROM 学生情况",dbOpenDynaset) '以动态集方式打开从“学生情况”数据表取得的SQL查询,传给Rs对象
Set Me.data1. Recorderset=. Rs
数据控件的常用方法
1、 Refresh方法
如果在设计状态没有为打开数据控件的有关属性全部赋值,或当RecordSource在运行时被改变后,必须使用激活数据控件的Refresh方法激活这些变化。
2、 UpdateCountrols方法
UpdateCountrols方法可以将数据从数据库中重新读到被数据控件绑定的控件内。使用UpdateCountrols方法终止用户对绑定内控件的修改。
3、UpdateRecord方法
当对绑定内的控件修改后,数据控件需要移动记录集的指针才能保存修改,如果使用UpdateRecord方法可强制数据控件将绑定控件内的数据写入到数据库中而不再触发Vaildate事件。在代码中用该方法修改。
数据控件的事件
1、Reposition事件
Reposition事件发生在一条记录成为当前记录后。
只要改变记录集的指针使其从一条指针移到另一条记录。会产生Reposition事件,可以在该事件过程中建立程序,可反映出记录位置、记录总数等。
2、Validate事件
当要移动记录指针前,修改与删除记录前或卸载含有数据控件的窗体时触发Validate事件。Validate事件检查被数据控绑定的控件内的数据是否发生变化。它通过save参数(True或False)判断是否有数据发生变化,Action参数判断哪一种操作触发了Validate事件。Action参数可为下表中的值:
Action值 |
描述
数据库记录的增删改操作
对记录的操作能够通过Recordset对象的方法实现。其常用方法有:
1、AddNew方法
加入一条新记录到记录集内存缓冲区。
例如:Rs. AddNew
2、 Edit方法
允许对当前记录进行修改。
3、Delete方法
用于删除当前记录。
4、Update方法
把内存缓冲区的内容写进数据库文件,保存对数据库所作的改动。
5、Close方法
关闭记录集和数据库。该方法也能用在数据库对象上,将数据库关闭。
Rs.Close '关闭记录集
Ds.Close '关闭数据库
6、 Move方法
使用Move方法可代替对数据库控件对象的4个箭头的操作遍历整个记录几种的记录。
5种Move方法是:
(1)MoveFirst方法移至第一条记录
(2)MoveLast方法移至最后一条记录
(3)MoveNext方法移至下一条记录
(4)MovePrevious方法移至上一条记录
(5)Move[n]方法向前或向后移动n条记录,n为指定的数值。
例1:在窗体上用4个命令按钮代替数据控件对象的4个箭头的操作。
窗体属性设置如下:在窗体上增加4个命令按钮,将数据控件的Visible属性设置为False.。通过对4个按钮的编程代替数据控件的4个箭头。窗体如下图所示。
上一条和下一条按钮的代码需要考虑Recordset对象的边界,可用Bof和Eof属性检测记录集的首尾,如越界,则用指令定位到第一条或最后一条记录。程序代码如下:
Private Sub Command1_Click()
Data1.Recordset.MoveFirst
End Sub
Private Sub Command2_Click()
Data1.Recordset.MovePrevious
If Data1.Recordset.BOF Then Data1.Recordset.MoveFirst
End Sub
Private Sub Command3_Click()
Data1.Recordset.MoveNext
If Data1.Recordset.EOF Then Data1.Recordset.MoveLast
End Sub
Private Sub Command4_Click()
Data1.Recordset.MoveLast
End Sub
例2:在浏览数据库的基础上再增加5个按钮:新增、删除、修改、查找和放弃。如下图所示。
Dim editcheck As Boolean '全局变量
Private Sub Command1_Click()
On Error Resume Next
Command2.Enabled = Not Command2.Enabled
Command3.Enabled = Not Command3.Enabled
Command4.Enabled = Not Command4.Enabled
Command5.Enabled = Not Command5.Enabled
If Command1.Caption = "添加" Then
Command1.Caption = "确认"
Data1.Recordset.AddNew
Text1.SetFocus
Else
Command1.Caption = "添加"
Data1.Recordset.Updata
Data1.Recordset.MoveLast
End If
End Sub
Private Sub Command2_Click()
Dim mst, res As String
mst = "您是否真的要删除?"
On Error Resume Next
res = MsgBox(mst, vbOKCancel + vbExclamation)
Select Case res
Case vbOK
Data1.Recordset.Delete
Data1.Recordset.MoveNext
If Data1.Recordset.EOF Then Data1.Recordset.MoveLast
End Select
End Sub
Private Sub Command3_Click()
On Error Resume Next
Command1.Enabled = Not Command1.Enabled
Command2.Enabled = Not Command2.Enabled
Command4.Enabled = Not Command4.Enabled
Command5.Enabled = Not Command5.Enabled
If Command3.Caption = "修改" Then
Command3.Caption = "确认": Data1.Recordset.Edit: Text1.SetFocus
Else
Command3.Caption = "修改": Data1.Recordset.Updata
End If
End Sub
Private Sub Command4_Click()
On Error Resume Next
Command1.Caption = "添加": Command3.Caption = "修改"
Command1.Enabled = True: Command2.Enabled = True
Command3.Enabled = True: Command4.Enabled = False
Command5.Enabled = True
Data1.UpdateControls
Data1.Recordset.MoveLast
End Sub
Private Sub Command5_Click()
Dim mno As String
mno = InputBox$("请输入学号", "查找窗")
Data1.Recordset.FindFirst "学号='" & mno & "'"
If Data1.Recordset.NoMatch Then MsgBox "无此学号!", , "提示"
End Sub
Private Sub Command6_Click()
student.Hide: Form1.Show
End Sub
Private Sub Data1_Reposition()
Data1.Caption = Data1.Recordset.AbsolutePosition + 1
End Sub
Private Sub Data1_Validate(Action As Integer, Save As Integer)
If editcheck = True Then
If Text1.Text = "" And (Action = 6 Or Text1.DataChanged) Then
MsgBox " 数据不完整,必须要有学号!"
Data1.UpdateControls
End If
If Action >= 1 And Action <= 4 Then
Command1.Caption = "添加": Command3.Caption = "修改"
Command1.Enabled = True: Command2.Enabled = True
Command3.Enabled = True: Command4.Enabled = False
End If
End If
End Sub
Private Sub Form_Load()
editcheck = False
Command1.Enabled = True: Command2.Enabled = True
Command3.Enabled = True: Command4.Enabled = False
Command5.Enabled = True
End Sub
四、用FlexGrid控件来操纵数据
使用FlexGrid ActiveX控件可以在Microsoft Visual Basic的窗体中创建一个电子数据表格,也可称之为网格。FlexGrid ActiveX控件可以在网格中显示任何类型的表格式数据:文本、数字、日期,甚至图形。但是下面将主要学习使用FlexGrid控件显示Microsoft Access数据库的字段和记录。
FlexGrid控件在电子数据表格中分别用行和列来显示数据库表的记录和字段。你可以在FlexGrid对象中进行许多电子数据表格的典型操作,包括选中单元、重置列宽、对齐标题和格式化文本。你可以从用文本填充简单的FlexGrid控件开始,选中文本、设置几个格式选项。接下来,你将进一步深入到把FlexGrid控件绑定到数据库上、显示数据库表、对记录进行排序、在整个数据库中搜索用户定义的字符串文本。
1、将FlexGrid用作通用电子数据表格
FlexGrid是Microsoft Visual Basic 专业版和企业版中包含的ActiveX控件。在工程中使用FlexGrid控件之前,需要在Project(工程)菜单的Components(部件)菜单项打开的对话框中选择Microsoft FlexGrid 6.0 control(即msflxgrd.ocx),把控件添加到工程中的工具箱中。
FlexGrid控件提供了许多电子数据网格传统的组织优点。可以用它来创建货物清单、计算税款、管理帐目、跟踪零件列表和库存清单等等。另外,Microsoft将FlexGrid控件设计为一种可绑定的控件,它可以通过在同一窗体上的Data控件来显示数据库信息。如果你想用原始的表格形式迅速显示数据库信息,那么FlexGrid控件就是最好的选择。
提示:Visual Basic 6.0专业版还提供了一个被称为Hierarchical FlexGridActiveX 的同类电子表格控件(即mshflxgd.ocx)。此控件的用法与FlexGrid控件一样,并且它们有一套相同的属性、方法和事件。但是,HierarchicalFlexGrid控件必须被绑定到ActiveX Data Objects(ADO)控件上,注意ADO控件并不是Visual Basic工具箱中的内部Data控件。“Hierarchical”表示这个控件可以显示由数据库中的多个表创建的记录集。
理解行和列
由FlexGrid控件产生的电子数据网格是一种包括平行的行和垂直的列组成的表格。在缺省情况下,第一行和最左一列作为保留的行标题和列标题,并且用阴影背景色显示。你可以用属性Rows来设置表格中行的数量,用属性Cols来设置表格中列的数量。下图显示了一个带有8行5列的FlexGrid表格的窗体:
FlexGrid控件中的表格数据可以像二维数组那样操作。表格的第一维是行数,第二维是列数。例如,表格最左上角的单元可以用地址0,0(0行,0列)来引用。
向单元中添加文本
用TextMatrix属性向单元中添加文本。
当要把一个值放到FlexGrid的某一个单元中时,需要设置TextMatrix属性来指定单元的位置和一个值。表格中你可以指定任何数值或字符串数据类型的值。
例如,要把单词“Bob”放到第3行第1列的单元中,可以输入如下的程序语句:
MSFlexGrid1.TextMatrix(3,1) = "Bob"
同样,要把数字1500放到第2行第1列的单元中,可以使用如下的语法:
MSFlexGrid1.TextMatrix(2,1)= 1500
在单元中插入图形
使用CellPicture属性来添加图形。
你可以通过使用Set语句、CellPicture属性和LoadPicture函数在FlexGrid表格单元中插入图形。有效的图形类型包括图标文件(.ico)、位图文件(.bmp)和Windows的图元文件(.wmf)。
例如,下列程序语句在表格的指定单元中显示图元文件Coins.wmf:
Set MSFlexGrid1.CellPicture = LoadPicture (“c:\vb\coins.wmf”)
调整单元的高度和宽度
当你向一个单元中添加图形时,FlexGrid控件并不会自动重置单元的大小来显示它。你可以用RowHeight和ColWidth属性来调整单元的高度和宽度,给它们指定一个以Twip为计量单位的数值。
例如,下列语句把表格的第1行和第1列的高度和宽度设置为2000 Twip,括号里的数字分别指出了当前行和当前列:
MSFlexGrid1.RowHeight(1)= 2000
MSFlexGrid1.ColWidth(1)= 2000
直接把这两条语句加入到上面在CellPicture属性中显示图形的Set语句中,单元将会扩大到足以显示整个图形的尺寸。
注意:当改变表格中一个单元的大小时,实际上就改变了那个单元所在的整个行和整个列的大小。
选中单元
使用Row和Col属性选中单元。
如大多数电子数据表格一样,在格式化单元内容之前,必须要在FlexGrid控件中选中它们。在FlexGrid控件中,你可以用程序代码选中单独的单元或一组(相邻的块)的单元。
要选中单独的单元,只要简单的将Row和Col的属性设置到你想选择的行和列即可。你指定的行和列的交叉处就是你选中的单元。
例如,如果要选中表格的单元1,1,可以使用下列程序语句:
MSFlexGrid1.Row = 1
MSFlexGrid1.Col = 1
要选择一个区域的单元时,必须要指定所选区域的开始点和结束点。开始点就是你刚刚用Row和Col属性指定的单元(第1行,第1列以上),结束点由RowSel和ColSel属性确定。
例如,下列程序语句在控件FlexGrid中选择了相邻的8个单元(从单元2,2到单元5,3):
MSFlexGrid1.Row = 2
MSFlexGrid1.Col = 2
MSFlexGrid1.RowSel = 5
MSFlexGrid1.ColSel = 3
格式化单元
如果打算格式化一组单元,则只需在选中单元之后加入下列程序语句:
MSFlexGrid1.FillStyle = flexFillRepeat
属性FillStyle设置为flexFillRepeat,表示允许FlexGrid控件一次对一个以上的选中单元进行格式化(在缺省情况下,默认值为flexFillSingle,它只允许一次格式化一个单元)。执行了此条语句之后,就为格式化单个或多个选中单元做好了准备。
注意:如果愿意的话,可以让用户来进行选择。例如,你可以允许用户在FlexGrid控件中选择一组单元,然后单击一个按钮将选中单元的文本风格变为粗体。在运行时,你可以通过设置SelectionMode属性控制用户如何来访问表格,SelectionMode的属性值为下列三个选项之一:flexSelectionFree(正常选择),flexSelectionByRow(只通过行来选择),或者flexSelectionByColumn(只通过列来选择)。
FlexGrid控件提供了许多标准的单元格式化特性(注:有8种单元格式化属性),这些特性你会在商业化的电子数据表格应用程序中见到。这些特性包括:粗体、斜体和下划线格式;列中的文本对齐方式;字体名称和大小,前景颜色和背景颜色。
下表列出了你可以使用的最重要的格式化选项。在后面部分将会练习使用设置其中的大部分属性。
属性 | 示例 |
CellFontBold | MSFlexGrid1. CellFontBold = True |
CellFontItalic | MSFlexGrid1. CellFontItalis = True |
CellFontUnderline | MSFlexGrid1. CellFontUnderLine = True |
CellAlignment | MSFlexGrid1. CellAlignment = flexAlignRightCenter |
CellFontName | MSFlexGrid1. CellFontName = "Courier New" |
CellFontSize | MSFlexGrid1. CellFontSize = 14 |
CellForeColor | MSFlexGrid1. CellForeColor = "red" |
CellBackColor | MSFlexGrid1. CellBackColor = "blue" |
添加新行
使用AddItem方法增加新行
当使用FlexGrid控件来创建发货清单、帐目登记或其它表格项目时,你将会发现在电子数据表格的底部增加新行是非常有用的。你可以用AddItem方法来完成此项操作。AddItem方法对FlexControl的作用和它对ListBox与ComboBox控件的作用一模一样。你指定准备增加的一条信息,在不同列的内容要用tab字符(即vbTab常数)隔开。
例如,在FlexGrid控件的底部增加一行新的内容(从第二列开始),可使用下列代码:
Dim Row As String
Row = vbTab & "Soccer ball" & vbTab & "W17-233" & vbTab & "34.95"
MSFlexGrid1.AddItem Row
如下图所示,以上语句代码将创建新的一行,并且填入soccer ball等的一些信息。
例题:使用FlexGrid控件来跟踪销售数据。
前面学习了FlexGrid控件属性和方法的一些知识,下面练习使用它来创建一个两维的销售表格,按地区跟踪销售情况。
界面设计:
1)在Project(工程)菜单中,单击Components(部件)选项,然后单击Controls(控件)选项卡,选中Microsoft FlexGrid Control 6.0项目左边的复选框,单击OK。将FlexGrid控件添加到工具箱中。
2)在工具箱中单击FlexGrid控件,在窗体上创建一个适当大小的FlexGrid对象,把Cols属性的值设置为4(也可以在运行时用程序代码改变这个值)。
3)添加一个命令按钮Command1,Caption属性的值为“Add Rows”。
窗体界面如图所示:
编写FlexGrid程序代码:
Private Sub Form_Load()
With MSFlexGrid1 '使用“With”速记表示法
'给第一列和第二列创建标题
.TextMatrix(0, 1) = "Q1 1999"
.TextMatrix(0, 2) = "Q2 1999"
'选中标题
.Row = 0
.Col = 1
.RowSel = 0
.ColSel = 2
'把标题设置为粗体格式,并使其在单元中居中显示
.FillStyle = flexFillRepeat '填充完整选项
.CellFontBold = True
.CellAlignment = flexAlignCenterCenter
'在第一行填加三条内容
.TextMatrix(1, 0) = "International" '第0列为标题
.TextMatrix(1, 1) = "55000" '第1列
.TextMatrix(1, 2) = "83000" '第2列
End With
End Sub
这些语句示范了几种在flex grid对象中输入和管理信息的技术:将文本填入单独的单元、选中一组单元、对选中的一组单元应用粗体格式、使一组单元中每个单元的文本居中显示。
注意:当FlexGrid控件的AllowUserResizing属性设置为1-flexResizeColumns时,用户可以在电子数据表格中改变列的宽度。
Private Sub Command1_Click()
With MSFlexGrid1 '每次单击在表格中添加四条信息
.AddItem "North" & vbTab & "45,000" & vbTab & "53,000"
.AddItem "South" & vbTab & "20,000" & vbTab & "25,000"
.AddItem "East" & vbTab & "38,000" & vbTab & "77,300"
.AddItem "West" & vbTab & "102,000" & vbTab & "87,500"
End With
End Sub
AddItem方法在flexgrid对象中创建一新行,并且在前三列中填入数据。常数vbTab标识了在表格中开始新的一列。
保存文件:
将窗体存为MySaleGrid.frm文件,将工程存为MySaleGrid.vbp文件。
2、用FlexGrid控件显示数据库记录以及它的高级排序和查找操作
你也许已经注意到,向FlexGrid控件中一次添加一行数据显得有些麻烦了。但是,如果把FlexGrid控件连接到你窗体中一个进行了适当配置的Data控件上,那么FlexGrid控件将会表现出强大的文本管理能力。像其它绑定控件一样,Data控件通过适当的设置被连接到FlexGrid控件上的。即将FlexGrid控件的DataSource属性设置为窗体中Data控件的名称。当建立了这个连接后,FlexGrid对象将会自动用数据库的记录来填充表格。
在下面的练习中,将演示如何在窗体中利用FlexGrid控件用表格的形式来来显示数据库记录,并且创建全新的排序和查找的功能。
DataGrid程序以表格的形式显示数据库记录,如果记录较长,DataGrid控件会自动产生滚动条,可以通过滚动条提供对数据的访问。另外,这个程序还演示了对于大型数据库特别有用的两个操作:排序功能,即按列对数据库记录进行排序;查找功能,即根据所给关键字搜索整个数据库并且高亮显示查找的结果。
排序是由FlexGrid控件的Sort属性处理的,它根据一行或多行的关键列和排序方向参数对表进行排序。
查找则需要多写一些程序代码,本例中通过两个For...Next的嵌套循环和InStr函数将每个单元的内容直接与要查找的字符串相比较。在下面的练习中,你将会看到这些事件过程是如何工作的。
例题:用FlexGrid控件完成对数据库的显示、查找、排序的操作。
在窗体上添加一个Date控件(Visible属性被设置为False)、一个FlexGrid控件(将两者绑定)、两个命令按钮、一个文本框、一个进度条(在Microsoft Wintows Common Controls 6.0中)。
界面如下:
单击“排序”按钮的代码:
Private Sub Command2_Click()
'将第二列设置为排序的关键列
MSFlexGrid1.Col = 2
'以升序方式对表格进行排序
MSFlexGrid1.Sort = 1
End Sub
程序说明:这个简单的事件过程使用了两行语句来排序FlexGrid对象中所有的数据库内容。第一条语句将第二列设置为用于排序的比较关键字。当然,数据库表中其它列也都可以作为排序列。排序操作本身通过Sort属性执行,它使用0到9的整数作为参数指明排序的方向。这里选择了参数1(一般意义上的升序),它意味着控件按照字母顺序对单元进行排序,并且在排序开始之前猜测单元中是否包含数字或字符串。
常用的选项有:
1——升序排序。
2——降序排序。
3——数值升序排序(在数值排序中,在排序开始之前字符串被转化为数字(字符相应的ASCII码值))。
4——数值降序排序。
注意:实际上,数据库中内部的顺序并没有因为这个排序操作而改变,改变的只是FlexGrid电子数据表格的内容。Data控件和FlexGrid控件之间的联系是单向的,因此,你在FlexGrid对象中所做的修改并不更新数据库。
单击“查找”按钮。
Private Sub Command1_Click()
'选择整个表格并去掉粗体格式 '(去掉上一次查找的结果,因为查找后的结果用粗体显示)
MSFlexGrid1.FillStyle = flexFillRepeat
MSFlexGrid1.Col = 0
MSFlexGrid1.Row = 0
MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1
MSFlexGrid1.RowSel = MSFlexGrid1.Rows - 1
MSFlexGrid1.CellFontBold = False
'初始化进度条以跟踪搜索过程,使得每检查一行,进度条填充一次
ProgressBar1.Min = 0
ProgressBar1.Max = MSFlexGrid1.Rows - 1
ProgressBar1.Visible = True
'依次在各单元中查找匹配字符串
MSFlexGrid1.FillStyle = flexFillSingle
For i = 0 To MSFlexGrid1.Cols - 1
For j = 1 To MSFlexGrid1.Rows - 1
'在进度条中显示当前行的位置
ProgressBar1.Value = j
'如果当前单元与所查找字符串匹配
If InStr(MSFlexGrid1.TextMatrix(j, i), Text1.Text) Then
'选中单元并将其格式化为粗体格式
MSFlexGrid1.Col = i
MSFlexGrid1.Row = j
MSFlexGrid1.CellFontBold = True
End If
Next j
Next i
ProgressBar1.Visible = False '隐藏进度条
End Sub
Private Sub Form_Load()
MSFlexGrid1.FixedCols = 0'把电子数据表格中作为标题的列压缩掉(缺省情况下,flexgrid对象的第一行和第一列以灰色阴影显示,但是你可以通过把FixedCols或FixedRows属性设置为0来清除这些阴影)。
End Sub
程序说明:当用户单击Form2中的Find Text按钮时,cmdFindText_Click事件过程就会运行。程序的目的是把FlexGrid对象中每一个单元的内容和文本框Text1中的查找文本进行比较,然后把所有匹配成功的单元以粗体的格式显示。此事件过程首先通过选中整个电子数据表格并把属性CellFontBold置为False,清除了FlexGrid对象中所有已经存在的粗体格式。然后,该事件过程初始化进度条对象,以便搜索过程中在屏幕底部以图形方式指示进度(每处理表中的一列数据就填充一次进度条)。
FlexGrid使用两个For...Next循环来完成搜索:一个循环实现表中行的扫描,另一个循环实现列的扫描。然后,循环使用TextMatrix属性和InStr函数把当前循环的位置(j,i)和查找文本串(Text1.Text)进行比较。如果匹配成功,属性CellFontBold就将单元中文本的格式设置为粗体。
本节内容总结:
目的 | 执行步骤 |
增加FlexGrid ActiveX控件到工具箱中 | 选中Microsoft FlexGrid Control 6.0项目前面的复选框 |
将文本赋值给FlexGrid的单元 | 利用TextMatrix属性。例如,将单词“Bob”放入单元3,1(第3行,第1列)中时,键入下列语句: MSFlexGrid1.TextMatrix(3,1) = "Bob" |
在单元中插入图形 | 利用CellPicture属性。例如: Set MSFlexGrid1.CellPicture = LoadPicture("c:\ABC\coins.wmf") |
选中一个单元 | 同时使用Row和Col属性。例如,要选中单元1,1(第1行,第1列),那么键入语句: MSFlexGrid1.Row = 1 MSFlexGrid1.Col = 1 |
用粗体格式格式化当前选中内容 | 利用CellFontBold属性。例如:MSFlexGrid1. CellFontBold = True |
添加新的一行 | 使用AddItem方法,用tab字符(vbTab)分开不同列单元的内容。例如: Dim Row As String Row = "Soccer ball" & vbTab & "W17-233" MSFlexGrid1.AddItem Row |
按列对flex grid对象中的内容进行排序 | 使用Col属性设置排序关键字,然后用方向参数设置Sort属性。例如:MSFlexGrid1.Col = 1 '把第1列设为关键字 MSFlexGrid1.Sort = 1 '按照升序进行排序 |
在整个FlexGrid对象中搜索文本框中的文本 | 在两个For...Next循环中使用InStr函数。例如: For i = 0 To MSFlexGrid1.Cols - 1 For j = 1 To MSFlexGrid1.Rows - 1 If InStr(MSFlexGrid1.TextMatrix(j, i),Text1.Text) Then [如果匹配成功要执行的代码] End If Next j Next I |
五、探索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对象并绑定控件
-
单击工具箱中的ADO控件,在窗体上创建一个较小的矩形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数据对象来引用数据,将会让你的程序更加简明,并且更适合于多种数据源的要求。