10.2 Data控件
Visual Basic具有数据库联接和数据处理功能,因此可以把它作为数据库应用程序的开发环境。用Visual Basic作为数据库的开发平台具有简单、灵活和可扩充性等特点。 Visual Basic提供了两种与数据库引擎接口的方法:数据控件和数据访问对象。数据控件只给出有限的不需要编程而能访问现存数据库的功能,允许将Visual Basic的窗体与数据库方便地进行连接。
Data控件在工具箱中,不需要特殊的步骤加入,但要利用数据控件返回数据库中记录的集合,必须通过它的属性设置。使用数据控件,不需要编写代码就可以实现以下操作:
(1)与本地或远程的数据库建立连接。
(2)对连接的数据库执行SQL查询,打开指定的数据表或定义记录集。
(3)把数据字段传送到各种约束控件,并可在约束控件中显示或修改数据字段的值。 (4)根据约束字段中数据的变化,添加新记录或更新数据库。 (5)捕获访问数据时出现的错误。 (6)关闭数据库。
Data控件可以使用三种类型的Recordset对象中的任何一种来提供对存储在数据库中数据的访问。Recordset(记录集)作为一个对象,可以是数据库中的一组记录,也可以是整个数据表或者表的一部分。记录集分为三种类型:Table、Dynaset和Snapshot。表类型记录集(Table)包含表中所有记录,对数据表中的数据所进行的增加、删除、修改等操作,直接更新数据。动态集类型记录集(Dynaset)可以包含来自于一个或多个表中记录的集合,对这种类型的数据表所进行的各种操作都先在内存中进行,以提高运行速度。以快照类型记录集(Snapshot)打开的数据表或由查询返回的数据仅供读取而不能更改,主要适用于进行查询工作。
双击Data控件或单击后在窗体上拖动出控件的大小,都可以看到Data控件的外观,如图10.5所示。
图10.5 Date控件的外观
10.2.1 常用属性、方法和事件
Data控件的属性有些可用于其他控件,有些则是Data控件所特有的。表10.3列出了Date控件的一些常用属性。
表
10.3 属
Data控件的 常用属性 Connect
性
DatabaseNa me
RecordSourc e
RecordsetTy pe
BofAction EofAction ReadOnly
说 明
指定链接的数据库的类型,默认值为Access 用于确定数据控件使用的数据库的完整路径
指定数据控件所链接的记录来源,可以是数据表名,也可以是查询名 指定数据控件存放记录集的类型,默认为Dynaset 当移动到记录开始时程序将执行的操作 当移动到记录结尾时程序将执行的操作 控制能否对记录集进行写操作。
1. Data控件和Recordset对象的方法
(1)AddNew方法:用于添加一个新记录,新记录的每个字段如果有默认值,则以默认值表示,如果没有则为空白。例如,给Data1的记录集添加新记录:
Data1.Recordset.AddNew
(2)Delete方法:用于删除当前记录的内容,在删除后应将当前记录移到下一个记录。例如,删除数据库中的当前记录:
Data1.Recordset.Delete
(3)Find方法:用于在记录集中查找符合条件的记录。如果条件符合,则记录指针将定位在找到的记录上。Find方法包括:
FindFirst方法:查找符合条件的第一条记录。
FindLast方法:查找符合条件的最后一条记录。 FindPrevious方法:查找符合条件的上一条记录。 FindNext方法:查找符合条件的下一条记录。
例如,在学生基本情况表中查找政治面貌为党员的第一条记录:
Data1.Recordset.FindFirst \政治面貌='党员'\
当在数据表类型记录集进行查找时,还可以使用Seek方法。如果找不到符合条件的记录,应显示相关信息以提示用户,这可通过判断NoMatch属性来实现,如:
If Data1.Recordset.NoMatch Then MsgBox \找不到符合条件的记录\
(4)Move方法:可以使不同的记录成为当前记录,常用于浏览数据库中的数据。Move方法包括:Move,MoveFirst,MoveLast,MovePrevious和MoveNext方法。
如果Data控件定位在记录集的最后一条记录上,这时继续向后移动记录,就会使得记录集的EOF属性值变为True,不能再使用MoveNext方法向下移动记录,否则会产生错误。从而在使用MoveNext方法移动记录时应该先检测一下记录集的EOF属性:
If Data1.Recordset.EOF = False Then Data1.Recordset.MoveNext …… '处理当前记录
Else
Data1.Recordset.MoveLast End If
使用MovePrevious方法移动当前记录同样会出现与MoveNext方法类似的问题。因此,在使用MovePrevious方法时也应该先检测一下记录集的BOF属性。
(5)Refresh方法:主要用来建立或重新显示与Data控件相连接的数据库记录集。如果在程序运行过程中修改了数据控件的DatabaseName,ReadOnly,Exclusive或Connect属性的设置值,就必须用该方法来刷新记录集: Data1.Refresh
(6)Update方法:用于将修改的记录内容保存到数据库中。例如,在编辑完当前记录后,可用Update方法保存最新的修改:
Data1.Recordset.Update
(7)UpdateControls方法:可以从数据控件的记录集中再取回原先的记录内容,即恢复原先的值,取消修改。其格式为:
Data1.UpdateControls 2. Data控件的事件
除具有标准控件所具有的事件之外,Data控件还具有几个与数据库访问有关的特有事件:Reposition事件和Validate事件。
(1)Reposition事件:当用户单击Data控件上某个箭头按钮,或者在应用程序中使用了某个Move或Find方法时,一个新记录成为当前记录,均会触发Reposition事件。例如,用这个事件来显示当前记录指针的位置的代码为:
Private Sub Data1_Reposition()
Data1.Caption = Data1.Recordset.AbsolutePosition + 1 End Sub
(2)Validate事件:当某一记录成为当前记录之前,或是在Update,Delete,Unload或Close操作之前触发该事件。Validate事件的格式为:
Private Sub Data1_Validate(Action As Integer, Save As Integer)
其中,Action用来指示引发这种事件的操作,Save用来指定被连接的数据是否进行了修改。例如,在Validate事件触发时确定记录内容是否修改,如果不修改则恢复:
If Save = True Then
mb = MsgBox(\要保存修改吗?\) If mb = vbNo Then Save = False Data1.UpdateControls End If End If
10.2.2 用控件显示数据
在Visual Basic中数据控件本身只能进行数据库中数据的操作,不能独立进行数据的浏览,所以需要把具有数据绑定功能的控件同数据控件结合起来使用,共同完成数据的显示、查询等。Visual Basic中可与数据控件关联(或绑定)的控件有PictureBox,Label,TextBox,CheckBox,Image,ListBox和ComBox控件等。与Data控件绑定的控件也称为数据感知控件。
数据感知控件的DataSource属性用于指定数据控件名,DataField属性用于在下拉列表中选择要显示的字段名称。在设置了DataSource和DataField属性之后,当用户用该控件来在Recordset中访问记录时,就会自动显示出指定字段的内容。 【例10-1】 创建一个学生基本情况录入界面,如图10.6所示。
图10.6 学生基本情况表
首先在窗体上增加一个数据控件Data1,并将其Align属性设为2-AlignBottom,使之位于窗体的下端,DatabaseName属性设为St.mdb,RecordSource属性为“学生基本情况”数据表。然后在窗体上增加一个命令按钮数组Command1(0)~Command1(3),一个标签控件组Label1,一个文本框控件数组Text1(0)~Text1(5),并将Text1(0)~Text1(5)的DataSource属性均设为Data1,DataField属性分别为:学号、姓名、性别、出生年月、政治面貌和所在院系。
编写程序代码如下:
Private Sub Data1_Reposition()
Data1.Caption = \记录\ End Sub
Private Sub Data1_Validate(Action As Integer, Save As Integer) If Save = True Then
mb = MsgBox(\要保存吗?\保存记录\) If mb = vbNo Then Save = False Data1.UpdateControls End If End If End Sub
Private Sub Edit_Click(Index As Integer) Select Case Index Case 0 '添加记录 Data1.Recordset.AddNew Case 1 '删除记录
mb = MsgBox(\要删除吗?\删除记录\) If mb = vbYes Then Data1.Recordset.Delete Data1.Recordset.MoveLast End If
Case 2 '更新记录 Data1.UpdateRecord
Data1.Recordset.Bookmark = Data1.Recordset.LastModified Case 3 '退出 Unload Me End Select End Sub

