第 12章 Visual Basic
数据库程序设计
人民邮电出版社
21世纪高等学校计算机基础教育系列教材第 12章 数据库功能数据控件和文本框控件进行数据库操作
Visual Basic提供了两种与 Jet数据库引擎接口的方法:数据控件和数据访问对象。数据控件给出了一些几乎不需要编程的访问现存数据的功能,允许用户将 Visual Basic的窗体与数据库方便地进行连接。 Visual Basic 的数据对象能够轻易地访问 Access,dBase,FoxPro,ParADOx等数据库中的数据,而且不需要程序员写程序。这里的访问数据指的是简单的“显示”、“浏览”、“编辑”、“更新”等基本操作,对于较复杂的“查询”功能则必须要有程序设计才能够实现。在对数据库的访问中,程序员必须设置数据控件( Data controls)的属性,才能够实现简单的数据访问。
Connect属性,Connect 属性用来指定数据库类型。它的设置值如下:
Access (默认值)这种情况下只能访问用 Access97所创建的数据库
FoxPro dBase Excel ParADOx Text Lotus
DataBasename属性:用来指定具体使用的数据库。如果连接的是一个 Microsoft Access数据库
,就把该属性设置为扩展名为 MDB的数据库文件,如果连接的是一个 dBase,FoxPro或 ParADOx
等数据库,则要将该属性设置成相应类型的数据库的文件( dBase,FoxPro数据库的扩展名为
dbf,ParADOx数据库文件的扩展名为 db)。
RecordType属性:用来确定具体的记录集合类型,记录集合类型可以是数据库中的表或一个存储查询。如果用户使用的是 Microsoft Access的 MDB数据库,则应该将该属性设置为表( Table
)记录集合类型;如果用其他类型的一种数据库,则应该将该属性设置成动态表( Dynaset)记录集合类型;如果只对记录进行读操作,而不需要去更新任何数据的话,可以选择快照(
SnapShot)记录集合类型。
RecordSource属性:用来确定具体可访问的数据,可以是数据库种的单个表,也可以是一个存储查询或者是使用 SQL查询语言的一个查询字符串。
由 ResordSource 确定的具体可访问的数据构成的记录集合( RecordSet)也是一个对象,它也具有和其它对象一样的属性和方法。 RecordSet记录集有名为 BOF和 EOF的属性,
RECORDSET.BOF用来判断是否在首记录之前,若该属性的值为 True,则表示当前位置在记录集的第一个记录之前。 RECORDSET.EOF则是判断是否在末记录之后。
EOF和 BOF属性具有以下特征:
当记录集中没有记录时,这两个值均为“真”( True)
当这 EOF或 BOF的值为“真”时,只有移动指针到实际存在的记录上,他们才会变为“假”
( False)。
EOF或 BOF为“假”,而且记录集中唯一一个记录被删除掉时,他们将保持为“假”,直到有新的记录加入。
当创建或打开至少含有一个记录的记录集时,第一个记录将被当成当前记录,此时均为
“假”。
RecordCount属性:用于计算记录集中现存记录的数量。对于表类型的记录集,该属性就是表中的记录总数;对于快照或者动态记录集来说,该属性的值就是用户所访问过的记录的个数。
如果在记录集(包括表、动态表和快照)中没有记录,该属性值就是 0。
EOFaction和 BOFaction属性:记录集的 EOF或 BOF属性为真时,EOFaction和 BOFaction属性的设置值或返回值决定数据控件要采取的动作。
第 12章 数据库功能
ReADOnly属性:用于控制能否对记录集进行写操作,如果该属性的值为真,则该记录集时不允许用户写入数据。
1,Move方法:用 Move方法可以代替数据控件对象的 4个箭头的操作,去遍历整个记录集中的记录。这里一共有 5种 Move方法:
① MoveFirst方法:移动到记录集的第一个记录
② MoveLast方法:移动到记录集的最后一个记录
③ MoveNext方法:移动到记录集中当前记录的下一个记录
④ MovePrevious方法:移动到记录集中当前记录的前一个记录
Move [n]方法:在记录集中向前或向后移动个记录,指定的常数。
Move [n]方法中,如果使用的是仅向前类型的快照记录集,则 n的值只能是正整数。
Move方法的语法结构,数据集合,Move方法
2,Find方法:用 Find方法可以在动态表 (Dynaset)或者是快照 (SnapShot)类型的记录集对象中查找与给定的条件相符合的一个记录,并使它成为当前记录。这里共有四种 Find方法:
① Findfirst方法:找到满足条件的第一个记录
② Findlast方法:找到满足条件的最后一个记录
③ Findnext方法:找到满足条件的下一个记录
④ Findprevious方法:找到满足条件的前一个记录
Find方法的语法结构,数据集合,Find方法 条件
1,Seek方法:用 Seek方法可在表中查找于指定索引规则相符的第一个记录,并使之成为当前记录。
2,Refresh方法:用 Refresh方法来激活在设计状态时没有为数据库控件的有关属性赋值或数据源在运行时被改变。
3,Close方法,`用 Close方法关闭指定的数据库、记录集并释放分配给它的资源。
Close方法的语法结构:对象,Close
4,数据输入方法:这里包括有添加记录( Addnew)、删除记录( Delete)、更新记录
( Update),它们的语法结构为:数据控件,记录集,方法名增加记录的操作分为三步:
① 调用 Addnew方法
② 给各字段赋值,给字段赋值格式为,RecordSet.field(“字段名” )=值
③ 调用 Update方法,确定所作的添加,将缓冲区的数据写入数据库。
在用 Addnew方法添加新记录后,但是还没有用 Update方法更新纪录集,就移动到其他记录,
或者关闭记录集,那么这些输入的数据将在没有任何提示的情况下全部丢失。
删除记录的操作也分为三步:
① 定位被删除的记录使之成为当前记录
② 调用 Delete方法
③ 移动记录指针更新记录就是要去修改现有记录,使用程序代码修改记录的方法可以分为以下四步:
① 定位要修改的记录,使之成为当前记录
② 调用 Edit方法
③ 给个字段赋值
④ 调用 Update方法,确定所作的修改。
下面是某公司人力资源部的认识数据库管理系统的员工管理程序,
其中实现了员工的增加、
修改、
删除、
查询等功能。
名 称 类 型 标 题 其 他 属 性
Jibenziliao 窗体 北京市真维斯服饰有限公司 -员工资料
Label1 标签 员工基本资料,文字颜色蓝色,9磅,宋体
Label2 标签 入 职 资 料
Label3 标签 员工编号文字颜色黑色,粗体
9磅,幼圆
Label4 标签 员工姓名
Label5 标签 性 别
Label6 标签 民 族
Label7 标签 身份证号码
Label8 标签 家庭住址
Label9 标签 文化程度
Label10 标签 出生日期
Label11 标签 年 龄
Label12 标签 联系电话
Label13 标签 入职店铺
Label14 标签 入职职级
Label15 标签 入职日期
Label16 标签 现所在店铺
Label17 标签 现所任职级
Label18 标签 员 工 资 料 红色,14磅,幼圆
Data1 数据库控件
Connect=“access”,recordsource=“person”
Databasename=“D:\word vb教材 \数据库
\renshi1.mdb”
Text1 文本框 - Datasource=Data1,Datafield=“员工编号”
Text2 文本框 - Datasource=Data1,Datafield=“员工姓名”
Text3 文本框 - Datasource=Data1,Datafield=“性别”
Text4 文本框 - Datasource=Data1,Datafield=“民族”
Text5 文本框 - Datasource=Data1,Datafield=“身份证号码”
Text6 文本框 - Datasource=Data1,Datafield=“文化程度”
Text7 文本框 - Datasource=Data1,Datafield=“出生日期”
Text8 文本框 - Datasource=Data1,Datafield=“年龄”
Text9 文本框 - Datasource=Data1,Datafield=“联系电话”
Text10 文本框 - Datasource=Data1,Datafield=“入职店铺”
Text11 文本框 - Datasource=Data1,Datafield=“入职级别”
Text12 文本框 - Datasource=Data1,Datafield=“入职日期”
Text13 文本框 - Datasource=Data1,Datafield=“现所在店铺”
Text14 文本框 - Datasource=Data1,Datafield=“现所任职级”
Command1 按钮 上一个
Command2 按钮 下一个
Command3 按钮 第一个
Command4 按钮 末一个
Command5 按钮 查找
Command6 按钮 新增
Command7 按钮 删除
Command8 按钮 修改
Command9 按钮 放弃 Enabled=false
Command11 按钮 退出
Text15 文本框 - Datasource=Data1,Datafield=“家庭地址”
Frame1 框架 - 用于装饰程序界面
Frame2 框架 -
Dim mbookmark As Variant
“第一个按”钮的事件代码
Private Sub Command1_Click()
If Not Data1.Recordset.BOF Then
Data1.Recordset.MovePrevious
Else
MsgBox "已到数据库头,无法再移动! ",vbCritical,"数据库 "
Data1.Recordset.MoveFirst
End If
Me.Refresh
End Sub
“下一个”按钮的事件代码
Private Sub Command2_Click()
If Not Data1.Recordset.EOF Then
Data1.Recordset.Movenext
Else
MsgBox "已到数据库尾,无法再移动! ",vbCritical,"数据库 "
Data1.Recordset.Movelast
End If
Me.Refresh
End Sub
“第一个”按钮的事件代码
Private Sub Command3_Click()
Data1.Recordset.MoveFirst
Me.Refresh
End Sub
“末一个”按钮的事件代码
Private Sub Command4_Click()
Data1.Recordset.Movelast
Me.Refresh
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()
Command7.Enabled = Not Command7.Enabled
Command8.Enabled = Not Command8.Enabled
Command9.Enabled = Not Command9.Enabled
If Command6.Caption = "新增 " Then
Command6.Caption = "确认 "
mbookmark = Data1.Recordset.Bookmark
Data1.Recordset.AddNew
Text1.SetFocus
Else
Command6.Caption = "新增 "
Data1.Recordset.Update
Data1.Recordset.Movelast
End If
End Sub
“删除”按钮的事件代码
Private Sub Command7_Click()
Dim s As String
On Error GoTo DelErr
s = MsgBox("确定删除这组记录吗? ",vbQuestion + vbOKCancel,"删除确定
If s = 1 Then
Data1.Recordset.Delete
Data1.Recordset.Movenext
If Data1.Recordset.RecordCount > 0 Then
If Data1.Recordset.EOF Then
Data1.Recordset.Movelast
End If
End If
End If
Exit Sub
DelErr:
MsgBox Err.Description
End Sub
“修改”按钮的事件代码
Private Sub Command8_Click()
Command6.Enabled = Not Command6.Enabled
Command7.Enabled = Not Command7.Enabled
Command9.Enabled = Not Command9.Enabled
If Command8.Caption = "修改 " Then
Command8.Caption = "确认 "
mbookmark = Data1.Recordset.Bookmark
Data1.Recordset.Edit
Text1.SetFocus
Else
Command8.Caption = "修改 "
Data1.Recordset.Update
End If
End Sub
“放弃”按钮的事件代码
Private Sub
Command9_Click()
Command6.Caption = "新增 "
Command8.Caption = "修改 "
Command6.Enabled = True
Command7.Enabled = True
Command8.Enabled = True
Command9.Enabled = False
Data1.UpdateControls
Data1.Recordset.Bookmark
= mbookmark
End Sub
“退出”按钮的事件代码
Private Sub
Command11_Click()
End
End Sub
数据库控件的检查是否输入合法数据:
Private Sub Data1_Validate(Action As Integer,Save As
Integer)
If Text1.Text = "" And (Action = 6 Or
Text1.DataChanged) Then
MsgBox "数据不完整,必须要有编号! "
Data1.UpdateControls
End If
If Action >= 1 And Action <= 4 Then
Command6.Caption = "新增 "
Command8.Caption = "修改 "
Command6.Enabled = True
Command7.Enabled = True
Command8.Enabled = True
Command9.Enabled = False
End If
End Sub
数据库控件( Data)和数据库网格( DBGrid)进行数据库操作数据库网格,Visual Basic软件包中提供了数据库网格( DBGrid)控件,利用数据库网格( DBGrid)控件,程序员几乎不需要写任何代码就可以直接将数据库中的记录数据显示在网格中。在 Visual Basic 6.0中,如果不安装的话,数据库网格( DBGrid)
控件是不会直接出现在部件窗口中的,此时需要将 Visual Basic 6.0的第一块光盘上的以下几个文件( dbgrid.reg,dbgrid32.dep,dbgrid32.oca,dbgrid32.ocx)复制到
Windows系统目录( c:\Windows\system)下,然后重新启动计算机或者是在添加工具箱部件中单击浏览按钮找到相应的文件名( dbgrid32.ocx)确定即可,此时在控件列表中会出现一个名为,Microsoft Data Bound Grid Control 5.0 (sp3)”的控件,就是所需要的数据库网格( DBGrid)控件。如果 Visual Basic 6.0是在 Visual Basic 5.0的版本上升级安装的话,就不需要执行这一步,
用数据控件和数据库网格控件显示上例中 renshi1数据库中 person表的数据,并可以在其中插入、删除、修改数据。
在窗体上添加一个数据控件 Data1,其属性属性设置和前文中的设置完全一样,这里不再赘述一个数据库网格控件 DBGrid1,DBGrid1的控件属性如图所示,其数据源
DataSource设置为 Data1
ADO控件和 DataGrid控件的使用在实际的程序开发中,用户很少使用 Access97创建的数据库,一般会采用 ODBC数据源,以达到可以使用多种数据库的目的,而用简单的 Data控件是不能完成这个要求的,
所以,在实际的程序开发中,人们大都使用 ADO数据控件。
要使用 ADO控件,就必须把它添加到 Visual Basic的工具箱中,在工具箱中添加部件窗口中,选择 Microsoft ADO Data control 6.0( OLEDB)。为了能够显示数据库中的数据,需要再添加一个控件,Microsoft DataGrid Control 6.0( OLEDB)。
1.ADO数据控件
ADO( ActiveX Data Object)数据访问接口让程序设计简单了很多,程序员只要简单地创建几个对象就可以连接数据来源、获取数据和对数据进行操作。 ADO数据控件在使用之前需要程序员通过,工程 /部件,
菜单命令来选择,Microsoft ADO Data Control 6.0( OLE DB),选项,将 ADO控件添加到工具箱中。
ADO控件的主要属性
1,ConnectionString属性:包含了用于与数据源建立连接的相关信息。 ConnectionString属性有四个属性参数,分别是:
Provide:指定数据源的名称; FileName:指定数据源所对应的文件名; RemoteProvide:在远程数据服务器打开一个客户端时所用的数据源名称; RemoteServer:在远程数据服务器打开一个主机端时所用的数据源名称。
在设置 ConnectionString属性时,单击属性窗口中 ConnectionString属性后的按钮,打开如图 12.5所示的窗口,其中有三种连接数据库的方式,在后面的例子中分别介绍。
1,RecordSource属性:确定具体可访问的数据,这些数据构成记录集对象 RecordSet,该属性可以使数据库中的单个数据表名称。一个查询名称,也可以是一个使用 SQL查询语言查询字符串。
2,ConnectionTimedout属性:指定数据连接的超时设定,若在指定的时间内连接不成功则显示超时信息。
MAXRecords:定义从一个查询中最多能返回的记录数。
ADO控件连接数据资源的三种方法使用连接字符串的写法
Public Con As New ADODB.Connection? 定义全局变量
Public Function ConnectToServer() As Boolean
On Error GoTo ConnectErr:
Con.ConnectionString =,Provider=SQLOLEDB.1;Password=house; Persist
Security Info=True;User ID=house; Initial Catalog=housing; Data
source=202.204.25.70,?house是用户密码,house是用户名,housing是要连接的数据库,202.204.25.70是连接的数据库服务器
Con.Open
ConnectToServer = True
Exit Function
ConnectErr:
MsgBox Err.Number &,:” & Err.Description,vbInformation + vbOKOnly,
“数据库连接失败 "
ConnectToServer = False
End Function