第十一章  数据库编程
双击滚屏  关闭窗口

 

11.3 使用 Data 控件访问数据库

  11.3.1 Data 控件的属性、方法和事件
  11.3.2 数据绑定控件

 

对于特殊需要,可以直接利用 Data 控件编写数据库应用程序

数据控件 Data 是一种具有快速处理各种数据库能力的常用标准控件。

可从 VB 工具箱中把 Data 控件添加到窗体上,其外观如下图。

                 
                      默认名为 Data1 。

 

11.3.1 Data 控件的属性、方法和事件

1.Data 控件的常用属性

(1) Connet 属性:指定 Data 控件所连接的数据库类型

默认为 Access ,还支持 FoxPro 、 Excel 等。

(2) DataBaseName 属性:用于设置 Data 控件所连接的数据库名称及路径。

(3) RecordSource 属性:用于设置 Data 控件所连接的记录源,可以是数据表名或查询名,也可以是 SQL 的 Select 语句,例如在程序中写入: Data1.RecordSource = "Select * From 成绩表 "

(4) RecordSetType 属性:用于设置 Data 控件存放记录集的类型。默认值为 1-Dynaset 。

0——Table( 表类型记录集 ) :这种记录集包含表中所有记录,对记录集所进行的增、删、改等操作都将直接更新表中的数据。

1——Dynaset( 动态集类型记录集 ) :这种记录集可以包含来自一个或多个表中记录的集合,对记录集所进行的增、删、改等操作都先在内存中进行,操作速度较快。

2——Snapshot( 快照类型记录集 ) :这种记录集的数据是由表或由查询返回的数据组成,仅供读取,不能修改。

若 Data 控件的 RecordSource 属性所指定的记录源不是一个数据表,则 RecordSetType 属性只能设置为 1(Dynaset) 或 2(Snapshot) 。

(5) Exclusive 属性:是否独占数据库 ( 不允许共享 ) 。

(6) ReadOnly 属性:数据库是否以只读方式打开。

(7) BOFaction 属性:指定记录指针移动到数据表的开头时程序执行的操作。

(8) EOFaction 属性:指定记录指针移动到数据表的结尾时程序执行的操作。

2. Recordset 对象的常用属性

程序运行时, VB 会根据 Data 控件设置的属性打开数据库,并内建一个 Recordset 对象。 Data 控件对数据的操作主要是通过 Recordset 对象进行的记录集 Recordset 对象的常用属性如下:

(1) AbsolutePosition 属性:指定 Recordset 对象当前记录的序号位置。第一个记录的 AbsolutePosition 值为 0 。

(2) BOF 、 EOF 属性:如果当前记录位于 Recordset 对象的最后一个记录之后,则 EOF 值为 True ,否则为 False 。

如果当前记录位于 Recordset 对象的第一个记录之前,则 BOF 值为 True ,否则为 False 。

(3) RecordCount 属性:表示 Recordset 对象中记录的总数。

(4) NoMatch 属性:指定当使用 Find 方法或 Seek 方法进行查找时,是否找到匹配的记录。

未找到匹配的记录时,该属性返回值为 True ,否则返回值为 False

3. Data 控件和 Recordset 对象的方法

(1) Move 方法:在记录集中移动记录指针。 Move 方法包括:

MoveFirst 移至第一个记录

MoveLast 移至最后一个记录

MovePrevious 移至上一个记录

MoveNext 移至下一个记录

Move[n] 向前或向后移动 n 个记录, n 为负数时表示向前移动

(2) AddNew 方法:添加一条新记录。新记录的每个字段采用默认值 ( 未指定则为空白 ) 。

示例: Data1.Recordset.AddNew

(3) Delete 方法:删除当前记录。在删除后应将当前记录指针移到其他位置 ( 如下一个记录 ) 。

(4) Edit 方法:在对当前记录内容进行修改之前,使用 Edit 方法使记录处于编辑状态。

(5) Update 方法:更新记录内容。

示例: Data1.Recordset.Update

(6) UpdateControls 方法:恢复记录的原先值。

示例: Data1.UpdateControls

(7) Refresh 方法:更新数据控件的记录集内容。如果为连接数据库的有关属性 ( 如 DatabaseName 、 Connect 等 ) 的设置值发生了改变,也可以使用 Refresh 方法来打开或重新打开数据库。

示例: Data1.Refresh

(8) Find 方法:在记录集中查找符合条件的记录。如果找到满足条件的记录,则记录指针将定位在找到的记录上。 Find 方法包括:

FindFirst 查找符合条件的第一个记录

FindLast 查找符合条件的最后一个记录

FindPrevious 查找符合条件的上一个记录

FindNext 查找符合条件的下一个记录

通过 NoMatch 属性可以判断是否找到符合条件的记录,如果找不到,通常需要显示信息以提示用户,如:

Data1.Recordset.FindFirst " 学号 =‘ 951009' "

If Data1.Recordset.NoMatch Then

MsgBox " 找不到 951009 号学生 "

End If

(9) Seek 方法:本方法用于在表类型 (Table) 的记录集中按照索引字段查找符合条件的第一条记录,并使之成为当前记录。在使用 Seek 方法之前,必须先通过 Index 属性打开表的索引。 Seek 方法查找速度比 Find 方法快。

使用格式为:

Recordset.Seek 比较字符,关键字 1 ,关键字 2 , …

其中“比较字符 ” 用于确定比较的类型,可是 < 、 <= 、 = 、 >= 、 > 之一

“ 关键字 1” 、 “ 关键字 2” … 等参数指定记录中对应当前索引字段的值

 

例如,打开 “ 学籍表 ” 中名称为 “Ind_xh”( 学号 ) 的索引 , 查找学号为 “ 951004” 的记录,可以采用:

Data1.Recordset.Index = "Ind_xh"

Data1.Recordset.Seek "=", "951004"

4.Data 控件的常用事件

(1) Reposition 事件:当用户单击 Data 控件上某个箭头按钮,或者在应用程序中使用某个 Move 或 Find 方法时,一个新记录成为当前记录之后,均会触发此事件。

(2) Validate 事件:当某一记录成为当前记录之前,或是在 Update , Delete , Unload 或 Close 操作之前触发此事件。 Validate 事件过程的格式:

Private Sub Data1_Validate(Action As Integer, Save As Integer)

其中, Action 用来指示引发此事件的操作, Save 用来指定被连接的数据是否修改了。

11.3.2 数据绑定控件

利用数据控件可以使应用程序与数据库联系起来,但数据控件不能显示数据库中的数据。

       
但要实现数据的浏览、编辑等功能,则必须通过其他具有数据绑定功能的控件,如文本框、标签、列表框和组合框等控件。

要使数据绑定控件与数据控件 Data 联系起来,可以通过数据绑定控件的 DataSource 和 DataField 两个属性实现连接。

(1) DataSource 属性:用于设定要连接的 Data 控件的名称。

(2) DataField 属性:指定作为数据绑定控件所要显示的字段的名称。

                
例 11.2 设计 “ 学籍资料处理 ” 程序

 

( 1 )新建一个工程

在窗体上添加 1 个数据控件 Data1 , 1 个命令按钮控件数组 Comd1(0) ~ Comd1(4) , 5 个标签 Label1 ~ Label5 , 5 个文本框 Text1 ~ Text5 。

(2) 设置对象属性。

设置数据控件 Data1 的属性:

Align 属性设定为 2-AlignBottom( 位于窗体的底端 )

Connect 属性为 Access

DatabaseName 属性设定为学生数据库的路径及名称 (“St.mdb”)

RecordSetType 属性采用默认设定值 (1-Dynaset)

RecordSource 属性设定为 “ 学籍表 ”

设置文本框 (Text1 ~ Text5) 的属性:

DataSource 属性设定为 Data1

DataField 属性分别为:学号、姓名、性别、年龄和班号

命令按钮及标签的 Caption 属性如图所示

(3) 程序代码

Private Sub Data1_Reposition()

Data1.Caption = " 第 " & Data1.Recordset.AbsolutePosition + 1 & " 个记录 "

End Sub

Private Sub Data1_Validate(Action As Integer, Save As Integer)

If Save = True Then

y = MsgBox(" 要保存已更改内容吗? ", vbYesNo, " 保存记录 ")

If y = vbNo Then ' 若回答 “ 否 ”

Save = False

Data1.UpdateControls ' 恢复原值

End If

End If

End Sub

Private Sub Comd1_Click(Index As Integer)

Select Case Index

Case 0 ' 查询记录

s = Trim(InputBox(" 请输入要查找的学号 ", " 查找 "))

xh = " 学号 ='" & s & "'"

Data1.Recordset.FindFirst xh

If Data1.Recordset.NoMatch Then

MsgBox " 找不到学号为 " & xh & " 的学生 ! "

Data1.Recordset.Move First

End If

Case 1 ' 添加记录

Data1.Recordset.Move Last ' 移到记录集的末尾

Data1.Recordset.AddNew ' 添加新记录

Case 2 ' 修改记录

Data1.Recordset.Edit ' 修改当前记录

Case 3 ' 删除记录

y = MsgBox(" 要删除该记录吗 ? ", vbYesNo, " 删除记录 ")

If y = vbYes Then

Data1.Recordset.Delete ' 删除记录

Data1.Recordset.MoveNext ' 显示下一记录

End If

 
双击滚屏  关闭窗口
 
版权所有数学与信息科学学院