第 6章 VB数据库编程技术
6,1 数据库设计基础
6,2 本地数据库设计( ACCESS)
6,3 数据控件
6,4 ODBC
6,5 ADO数据控件
6,6 VB中 SQL的实现
6,7 VB中使用 ODBC
6,8 网络数据库设计
1,VB中的数据访问
VB提供的数据库引擎叫 Jet。
VB提供了两种与 Jet数据库引擎接口的方法:
Data控件 (Data Control)和数据访问对象 (DAO)。
这两种方法可以同时使用 。
6.1 数据库设计基础
Data控件提供了有限的不需编程就能访问现存数据库的功能
DAO模型是全面控制数据库的完整编程接口
VB通过 DAO,ADO和 Jet引擎可以识别三类数据库:
( 1) VB数据库
也称本地数据库,本地数据库文件格式与 Microsoft
Access相同 。 Jet引擎直接创建和操作这些数据库 。
( 2) 外部数据库
访问符合,索引顺序访问文件方法 (ISAM)”数据库,
包括,dBase III,dBase IV,Foxpro 2.0和 2.5以及 Paradox 3.x和 4.x。
( 3) ODBC数据库
访问符合 ODBC标准的客户机/服务器数据库,如
Microsoft SQL Server。
6.1 数据库设计基础
2,VB数据库体系结构
Jet引擎负责处理存储,检索,更新数据的结构,并提供了功能强大的面向对象的 DAO编程接口 。
(1) VB数据库应用程序的组成
VB数据库应用程序包含三部分,如图 6.1所示 。
图 6.1 VB数据库应用程序的组成
6.1 数据库设计基础用户界面 Jet引擎 数据库
① 用户界面和应用程序代码
用户界面是用户所看见的用于交互的界面,它包括显示数据并允许用户查看或更新数据的窗体 。
驱动这些窗体的是应用程序的 VB代码,包括用来请求数据库服务的数据访问对象和方法,比如添加或删除记录,或执行查询等 。
6.1 数据库设计基础
② Jet引擎
Jet引擎实际是一组动态链接库 (DLL)文件。在运行时,这些文件被链接到 VB程序。它把应用程序的请求翻译成,mdb(Access文件后缀 )文件或其他数据库的物理操作。
Jet引擎真正读取、写入和修改数据库,并处理所有内部事务,如索引、锁定、安全性和引用完整性。
Jet引擎包含一个查询处理器,接收并执行 SQL查询,
实现所需的数据操作。
Jet引擎包含一个结果处理器,用来管理查询所返回的结果。
6.1 数据库设计基础
③ 数据库
数据库是包含数据库表的一个或多个文件 。
本地 VB或 Access数据库文件后缀为,mdb文件 。
( 2) 数据库应用程序的存放
在单系统机中数据库,数据引擎和用户界面集中存放 。
在客户机 /服务器系统中,数据库引擎和数据库一起被放置在服务器上 。 数据库引擎可以同时对多个客户机的应用程序提供服务,操作数据库并对每个本地应用程序返回所请求的记录 。
6.1 数据库设计基础
6.1 数据库设计基础数据库数据库引擎用户界面服务器客户 机客户机/服务器引擎,通过 ODBC方式使用 。 在 VB中,通过连接到 ODBC数据源,
如 Microsoft SQL Server等,可直接把查询传递给服务器数据库引擎 。
VB中创建和访问数据库的途径主要有 3个:
可视化数据管理器使用可视化数据管理器,不需要编程就可以创建 Jet
数据库 。
DAO
使用 VB的 DAO部件通过编程的方法创建数据库 。
ISAM或 ODBC
VB可通过 ISAM或 ODBC驱动程序来访问外部数据库数据库 。
6.2 本地数据库设计 (ACCESS)
1,可视化数据管理器
数据管理器 (Data Manager)是 VB的一个传统成员,
它可以用于快速地建立数据库结构及数据库内容。
可以完成有关数据库的操作,比如数据库结构的建立、记录的添加及修改以及用 ODBC连接到服务器端的数据库如 SQL Server等。
启动数据管理器选择,外接程序,菜单下的,可视化数据管理器,
项就可以启动数据管理器,打开,VisData”窗口 。
6.2 本地数据库设计 (ACCESS)
2) 工具栏按钮
6.2 本地数据库设计 (ACCESS)
数据库窗口 SQL语句窗口显示数据库的结构,
包括表名,列名,
索引可输入 SQL命令,对数据库中的表进行查询操作
VisData窗口
6.2 本地数据库设计 (ACCESS)
设置记录集的访问方式指定数据表 中数据的显示 方式进行事务处理
6.2 本地数据库设计 (ACCESS)
表类型记录集按钮,允许 直接 对数据库中的数据进行增,删,改,
查等操作 。
动态集类型记录集按钮,将指定的数据打开并读入到内存中,进行数据编辑操作 。
快照类型记录集,只能读数据不能修改,适用于只查询的情况
6.2 本地数据库设计 (ACCESS)
指定数据表中数据的显示方式,在新窗体上使用 DATA控件指定数据表中数据的显示方式,在新窗体上不使用 DATA控件指定数据表中数据的显示方式,在 新 窗 体 上 使 用
DBGrid控件进入
2.具体实现
1)建立数据库
数据库 student.mdb(学生数据库 )中的表定义:
学生成绩表 (学号,课程,成绩,学期 )。
6.2 本地数据库设计 (ACCESS)
学生成绩表结构字段名 类型 宽度学号 Text 6
课程 Text 10
成绩 Long 4
学期 Text 2
基本情况表 (学号,姓名,性别,专业,出生年月,
照片,备注 )
6.2 本地数据库设计 (ACCESS)
学生基本情况表结构字段名 类型 宽度学号 Text 6
姓名 Text 10
性别 Text 2
专业 Text 10
出生年月 Date 8
照片 Binary 0
备注 Memo 0
添加数据表
建立索引建立索引可以加快检索速度。
2)录入数据
照片的输入:
静态设置,通过一个图片编辑程序将照片装入剪贴板,
等待从剪贴板复制到 Picture1控件 。
6.3.1 数据控件属性
动态设置,通过 Picture1_DblClick事件来完成剪贴板到 Picture1控件的复制,当移动记录指针时,
Picture1控件内的照片存入数据库 。
Private Sub Picture1_DblClick()
Picture1.Picture = Clipboard.GetData
End Sub
3) 建立查询
VB的数据管理器提供了一个图形化的设置查询条件的窗口 ——查询生成器 。
例如:查询 Authors ID=10或 Authors ID=1的情况
6.2 本地数据库设计 (ACCESS)
进入
Data控件数据控件提供有限的不需编程而能访问现存数据库的功能,允许将 Visual Basic的窗体与数据库方便地进行连接。
使用数据控件获取数据库中记录的集合,先在窗体上画出控件,再通过它的三个基本属性 Connect、
DatabaseName和 RecordSource设置要访问的数据资源。
6.2 数据控件
1,Connect属性
Connect属性指定数据控件所要连接的数据库类型,
Visual Basic默认的数据库是 Access的 MDB文件,
也可连接 ODBC等类型的数据库 。
Access数据库的所有表都包含在一个 MDB文件中 。
6.3.1 数据控件属性
2,DatabaseName属性
DatabaseName属性指定具体使用的数据库文件名,
包括文件所在的路径名 。
数据库中的基本表名可由 RecordSource属性指定 。
例如,要连接一个 Microsoft Access的数据库存放在 C:\Student.mdb.
设置 DatabaseName=”C:\ Student.mdb“,该方法可以通过属性栏设置,或在过程中指定,
在过程中可以使用相对路径来描述,
DatabaseName=”..\ Student.mdb“。
6.3.1 数据控件属性
3,RecordSource属性
RecordSource 确定具体可访问的记录集对象
Recordset。
该属性值可以是数据库中的 单个表名 或者是 使用 SQL
查询语言的一个查询 。
例如,指定 Student.mdb数据库中的基本情况表,
RecordSource=”基本情况,。
例如,访问基本情况表中所有物理系学生的数据。
RecordSource=”Select? From 基本情况
Where专业 =’ 物理 ’,,
6.3.1 数据控件属性
4,RecordsetType属性
RecordsetType属性确定记录集类型 。
( 1) Table,表记录集类型,一个记录集(单个表)
( 2) Dynaset,动态集类型,一个动态记录集(多个表),默认值。
( 3) Snapshot:快照类型,一个记录集静态副本(不可改)
5,EofAction和 BofAction属性
当记录指针指向 Recordset对象的开始 (第一个记录前 )或结束 (最后一个记录后 )时,BofAction和
EofAction属性的设置或返回值决定了数据控件要采取的操作 。 操作属性的取值如表 6.1所示 。
6.3.1 数据控件属性
6.3.1 数据控件属性属 性 值 设置 操 作
BofAction
0 vbBOFAction
MoveFirst
控件重定位到第 1个记录 (缺省 )
1 vbBOFAction
BOF
移过 Recordset的开始位,定位到一个无效记录 ;将在第一个记录上触发 Data 控件的 Validate 事件,紧跟着是非法 (BOF) 记录上的 Reposition 事件。此刻禁止
Data 控件上的 Move Previous
按钮。
焦点将从一个记录转换到另一个记录之前,Validate 事件发生该事件发生在某行变为当前行之后
6.3.1 数据控件属性属 性 值 设置 操 作
EofAction
0 vbEOFAction
MoveLast
控件重定位到最后一个记录 (缺省 )
1 vbEOFAction
EOF
移过 Recordset 的结尾,定位到一个无效记录 ;在最后一个记录上触发
Data控件的 Validate事件,紧跟着是在非法 (EOF) 记录上的事件
Reposition,此刻禁止 Data 控件上的 MoveNext 按钮,
2 vbEOFAction
AddNew
移过最后一个记录,在当前记录上触发 Data 控件的 Validate 事件,紧跟着是自动的 AddNew,向记录集加入新的空记录,接下来是在新记录上的 Reposition 事件,移动记录指针,
与数据控件绑定,
数据控件本身不能直接显示记录集中的数据,必须通过能与它绑定的控件来实现 。 可与数据控件绑定的控件对象有文本框,标签,图像框,图形框,列表框,组合框,复选框,网格,DB列表框,DB组合框,DB网格和 OLE容器等控件 。
要使绑定控件能被数据库约束,必需在设计或运行时对上述控件的两个属性进行设置:
DataSource属性 该属性通过指定 —个有效的数据控件连接到一个数据库上 。
DataField属性 该属性设置数据库有效的字段与绑定控件建立联系 。
6.3.1 数据控件属性
当上述控件与数据控件绑定后,Visual Basic将当前记录的字段值赋给控件 。
数据控件在装入数据库时,它把记录集的第一个记录作为当前记录 。 当数据控件的 EofAction属性值设置为 2时,当记录指针移过记录集结束位,数据控件会自动向记录集加入新的空记录 。
绑定控件、数据控件和数据库三者的关系如图下示。
6.3.1 数据控件属性绑定控件 数据库例 6.2 设计一个窗体用以显示建立的 student.mdb
数据库中基本情况表的内容 。
要显示基本情况表中除了备注字段外的 6个字段,
故需要用 6个绑定控件与之对应 。 这里用一个图形框显示照片和 5个文本框显示学号,姓名等数据 。
6.3.1 数据控件属性进入
数据控件 Data1属性设置
Connect属性指定为 Access类型
DatabaseName属性连接数据库 Student.mdb
RecordSource属性设置为,基本情况,表。
图片框和 5个文本框控件属性设置
Text1~ Text5的 DataSource属性设置成 Data1。
Text1~ Text5的 DataField属性分别选择与其对应的字段学号、
姓名、性别、专业和出生年月。
Picture1的 DataField属性选择字段照片
6.3.1 数据控件属性进入例 6.3 用数据网格控件 MsFlexGrid显示 Student.mdb
数据库中基本情况表的内容 。
6.3.1 数据控件属性进入
数据网格控件的 DataSource属性设置为一个
Data控件,运行时网格控件的列标题会用 Data
控件的记录集里的数据自动地设置 。
MsFlexGrid控件不是 Visual Basic工具箱内的默认控件,需要在开发环境中选择,工程 |部件,
菜单命令,并在随即出现的对话框中选择
,Microsoft FlexGrid Control 6.0”选项,将其添加到工具箱中 。
6.3.1 数据控件属性
DataSource=Data1
FixedCols=0
MSFlexGrid1
DatabaseName=”c:\student.mdb”
RecordsetType=1
RecordSource=”基本情况,
Data1
其它属性设置默认控件名表 6.4 控件属性
本例所用控件的属性设置如下表所示。
6.3.1 数据控件属性注意,不可卷动列属性 FixedCols=0与 FixedCols=1的区别进入
1,Reposition事件
Reposition事件激活的条件,当记录集指针从一条记录移到另一条记录,会产生 Reposition事件 。
Reposition事件作用,显示当前指针的位置 。
6.3.2 数据控件的事件和常用方法
Private Sub Data1_Reposition()
Data1.Caption =
Data1.Recordset.AbsolutePosition + 1
End Sub
AbsolutePosition属性指示当前指针值 (从
0开始 )。 当单击数据控件对象上的箭头按钮时,数据控件的标题区会显示记录的序号
2.Validate事件
Validate事件激活的方法,在焦点转换到一个(第二个)控件之前发生,此时该控件 CausesValidation
属性值设置为 True。
Validate事件的作用,用于检查被数据控件绑定控件的状态,例如,由一个记录移到另一个记录 ;或者焦点由一个文本框移到另一个文本框,
6.3.2 数据控件的事件和常用方法
6.3.2 数据控件的事件和常用方法例题,在窗体中放置一个 CommandButton 和两个
TextBox 控件,来演示 Validate 事 件 和
CausesValidation 属性的使用 。
限制条件为,如果 Text1没有包含日期或 Text2
没有包含一个大于 10的数字,将阻止焦点的转换 。
两个 TextBox 控件的 CausesValidatio n属性在缺省情况为 True,这样当把焦点从一个 TextBox
转换到另一个时,Validate 事件发生 。
进入
6.3.2 数据控件的事件和常用方法
Private Sub Form_Load()
With Command1
.CausesValidation = False
设置该属性为 False,当用户单击按钮时,
Validate事件不发生。
.Caption = "Help"
End With
Show
With Text1?选择 Text1的文本并为它设置焦点。
.SelLength = Len(Text1.Text)
.SetFocus
End With
End Sub
With 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称 。 例如,要改变一个对象的多个属性,可以在 Wi h 控制结构中加上属性的赋值语句,这时候只是引用对象一次而不是在每个属性赋值时都要引用它 。返回或设置所选择的字符数
6.3.2 数据控件的事件和常用方法
Private Sub Command1_Click()
当单击此按钮时给出用户帮助信息 。
MsgBox _
"Text1 must be set to a date." & VbCrLF & _
"Text2 must be a number less than 10.“
End Sub
回车换行
6.3.2 数据控件的事件和常用方法
Private Sub Text1_Validate(KeepFocus As Boolean)
如果值不是一个日期,则保持焦点,除非用户单击
Help。
If Not IsDate(Text1.Text) Then
KeepFocus = True
MsgBox "Please insert a date in this
field.",,"Text1"
End if
End Sub
返回 Boolean 值指明某表达式是否可以转换为日期 。
6.3.2 数据控件的事件和常用方法
Private Sub Text2_Validate(KeepFocus As Boolean)
如果值是一个大于 10的数字,保持焦点 。
If Not IsNumeric(Text2.Text) Or
Val(Text2.Text) > 10 Then
KeepFocus = True
MsgBox _"Please insert a number less than or
equal to 10.",,"Text2"
End If
End Sub
返回 Boolean 值指明表达式的值是否为数字。
进入
6.3.2 数据控件的事件和常用方法
Validate事件的检查方法,
通过 Save参数 (True或 False)判断被连接的数据
( 被绑定的控件 ) 是否发生变化。
通过 Action参数判断哪一种操作触发了
Validate事件。
6.3.2 数据控件的事件和常用方法
Validate事件的 Action参数常 数 值 描 述
vbDataActionCancel 0 Sub退出时取消操作
vbDataActionMoveFirst 1 MoveFirst 方法。
vbDataActionMovePrevious 2 MovePrevious 方法
vbDataActionMoveNext 3 MoveNext 方法
vbDataActionMoveLast 4 MoveLast 方法。
vbDataActionAddNew 5 AddNew 方法
6.3.2 数据控件的事件和常用方法
Validate事件的 Action参数常 数 值 描 述
vbDataActionUpdate 6 Update 操作。
vbDataActionDelete 7 Delete 方法
vbDataActionFind 8 Find 方法
vbDataActionBookmark 9 Bookmark 属性已被设置
vbDataActionClose 10 Close 的方法
vbDataActionUnload 11 窗体正在卸载。
保存对 Recorded 对象的当前记录所做的所有更改 。
例如,不允许用户在数据浏览时清空性别数据,可使用下列代码:
6.3.2 数据控件的事件和常用方法
Private Sub Data1_Validate(Action As Integer,_
Save As Integer)
If Save And Len(Trim(Text3.Text)) = 0 Then
Action = 0
MsgBox "性别不能为空! "
End If
End Sub检查被数据控件绑定的控件 Text3内的数据是否被清空 。 如果 Text3内的数据发生变化,则 Save参数返回 True,若性别对应的文本框 Text3被置空,则通过 Action=0取消对数据控件的操作去除前导空格和末尾空格
3,数据控件的常用方法
数据控件的内置功能很多,可以在代码中用数据控件的方法访问这些属性 。
1) Refresh方法
当 RecordSource在运行时被改变时,使用 Refresh方法,将当前指定 RecordSource中的数据装入内存工作区,达到 激活数据库 的作用 。
6.3.2 数据控件的事件和常用方法
6.3.2 数据控件的事件和常用方法
Private Sub Form_Load( )
Dim Mpath As String
Mpath=App.Path?获取当前路径
If Right(mpath,1)<>”/” Then mpath=mpath+”/”
Data1.DatabaseName=mpath+”Student.mdb”
连接数据库
Data1.RecordSource=?基本情况,’
构成记录集对象
Data1.Refresh?激活数据控件
End Sub
App 对象是通过关键字 App 访问的全局对象 。 它指定如下信息:应用程序的标题,版本信息,可执行文件的路径及名称以及是否运行前一个应用程序的示例 。
Path返回或设置当前路径,在编程时无效,运行时有效 。
RIGHT(cExpression,nCharacters)
Function返回从右边数的 n个字符 。
2) UpdateControls方法
UpdateControls方法 从数据库中重新读数据 送到被数据控件绑定的控件内 。
6.3.2 数据控件的事件和常用方法控件 DATA控件 数据库控件 DATA控件 数据库
3) UpdateRecord方法
对绑定控件内的数据修改后,数据控件需要移动记录集的指针才能保存修改 。 如果使用 UpdateRecord
方法,可 强制数据控件将绑定控件内的数据写入到数据库中,而不再触发 Validate事件 。
记录集 Recordset常用的属性和方法 。
1,AbsolutePosition属性
AbsolutePosition返回当前指针值,如果是第 1条记录,其值为 0,该属性为只读属性 。
2,Bof和 Eof的属性
Bof判定记录指针是否在 首记录之前,若 Bof为
True,则当前位置位于记录集的第 1条记录之前 。
Eof判定记录指针是否在 末记录之后,若 Eof为
True,则当前位置位于记录集的最后 1条记录之后 。
6.3.3 记录集的属性和方法
3,Bookmark属性
Bookmark属性的值采用字符串类型,用于设置或返回 当前指针的标签 。 在程序中可以使用 Bookmark属性重定位记录集的指针 。
4,Nomatch属性
在记录集中进行查找时,如果找到 相匹配的记录,
则 Recordset的 NoMatch属性为 False,否则为 True。
该属性常与 Bookmark属性一起使用 。
5,RecordCount属性
RecordCount属性对 Recordset对象中的 记录计数,
使用 RecordCount 属性可确定 Recordset 对象中记录的数目。
6.3.3 记录集的属性和方法
6,Move方法五种 Move方法是:
MoveFirst 将控件移动到第 1条记录 。
MoveLast 将控件移动到最后一条记录 。
MoveNext 将控件移动到后一条记录 。
MovePrevious 将控件移动到前一条记录 。
Move [n] 向前或向后移 n条记录,n为指定的数值 。
6.3.3 记录集的属性和方法例 6.4 设计一个窗体用以显示建立的 student.mdb数据库中基本情况表的内容 。 在窗体上用 4个命令按钮实现对数据库的操作 。
图 6.10 用按钮代替数据控件对象的箭头按钮
6.3.3 记录集的属性和方法进入
命令按钮 Command1_Click事件移至第 1条记录,代码如下:
6.3.3 记录集的属性和方法
命令按钮 Command4_Click事件移至最后一条记录,代码如下:
Private Sub Command4_Click()
Data1.Recordset.MoveLast
End Sub
Private Sub Command1_Click()
Data1.Recordset.MoveFirst
End Sub
使用 Move方法需要考虑 Recordset对象的边界状态 。
如果越界,则用 MoveFirst方法定位到第 1条记录或用
MoveLast方法定位到最后一条记录 。
使用 MoveFirst方法定位到第 1条记录:
6.3.3 记录集的属性和方法
Private Sub Command2_Click()
Data1.Recordset.MovePrevious
If Data1.Recordset.BOF
Then Data1.Recordset.MoveFirst
End Sub
使用 MoveLast方法定位到最后一条记录:
6.3.3 记录集的属性和方法
Private Sub Command3_Click()
Data1.Recordset.MoveNext
If Data1.Recordset.EOF
Then Data1.Recordset.MoveLast
End Sub
进入
7,Find方法
使用 Find方法可在 Recordset对象中查找与指定条件相符的一条记录,并使之成为当前记录 。
四种 Find方法是:
FindFirst方法 从记录集的 开始查找 满足条件的第 1
条记录 。
FindLast方法 从记录集的 尾部向前查找 满足条件的第 l条记录 。
FindNext方法 从 当前记录开始 查找满足条件的 下一条 记录 。
FindPrevious方法 从 当前记录开始 查找满足条件的上一条 记录 。
6.3.3 记录集的属性和方法
Find方法的语法格式,4种格式相同数据集,Find方法 条件
搜索条件表达式,是一个指定字段与常量关系的字符串表达式 。 在构造表达式时,除了用普通的关系运算外,还可以用 Like运算符 。
例如,查找专业 =物理的纪录
Data1.Recordset.FindFirst,专业 =’ 物理 ’”
查找下一条符合条件的记录,可继续使用语句:
Data1.Recordset.FindNext,专业 =’ 物理 ’” 。
6.3.3 记录集的属性和方法
例如,要在记录集内查找专业名称中带有,建,
字的专业,
Data1.Recordset.FindFirst,专业 Like?*建
*?”
如果 Find方法找不到相匹配的记录,则记录保持在查找的始发处,Recordset的 NoMatch属性为
True。
如果 Find方法找到相匹配的记录,则记录定位到该记录,Recordset的 NoMatch属性为 False。
6.3.3 记录集的属性和方法
6.3.3 记录集的属性和方法
Private Sub Command1_Click()
Data1.Recordset.FindFirst,course=?English?”
If Data1.Recordset.NoMatch Then
MsgBox,No such record found”
Else
MsgBox Data1.Recordset.Fields(“course” )
End If
End Sub
8,Seek方法
Seek方法,是根据 索引字段 的值,查找与指定索引规则相符的第 1条记录,并使之成为当前记录 。
其语法格式为:
数据表对象,seek comparison,keyl,key2…
比较运算符 comparison;可用的比较运算符有
=,>=,>,<>,<,<=
Seek允许接受多个参数 keyl,key2,… ;
在使用 Seek方法定位记录时,必须打开索引文件,
通过 Index属性设置索引文件 。 若在记录集中多次使用同样的 Seek方法 (参数相同 ),那么找到的总是同一条记录 。
6.3.3 记录集的属性和方法
例如,假设数据库 Student内基本情况表的索引字段为学号,满足学号字段值大于等于 110001的第 1条记录可使用以下程序代码:
6.3.3 记录集的属性和方法
Data1.RecordsetType = 1?设置记录集类型为 Table
Data1.RecordSource =,基本情况,
’ 打开基本情况表单
Data1.Refresh
Data1.Recordset.Index = "jbqk_no"
打开名称为 jbqk_no的索引
Data1.Recordset.Seek ">=","110001"
数据库记录的增,删,改操作需要使用 AddNew、
Delete,Edit,Update和 Refresh方法 。
它们的语法格式为:
数据控件,记录集,方法名
1,增加记录
① 调用 AddNew方法 。
② 给各字段 赋值 。 给字段赋值格式为:
Recordset.Fields(”字段名,)=值 。
6.3.4 数据库记录的增删改操作
③ 调用 Update方法,将缓冲区内的数据写入数据库 。
如果使用 AddNew方法添加新的记录,但是没有使用
Update方法而移动到其他记录,或者关闭记录集,
那么所做的输入将全部丢失,而且没有任何警告 。
当调用 Update方法写入记录后,记录指针自动返回到添加新记录前的位置上,而不显示新记录 。 因此,
需要在调用 Update方法后,使用 MoveLast方法将记录指针再次移到新记录上 。
6.3.4 数据库记录的增删改操作
2,删除记录
① 定位被删除的记录使之成为当前记录 。
② 调用 Delete方法 。
③ 移动记录指针 。
在使用 Delete方法时,当前记录立即删除,不加任何的警告或者提示 。
删除一条记录后,被数据库所约束的绑定控件仍旧显示该记录的内容 。 因此,必须移动记录指针刷新绑定控件,一般采用移至下一记录的处理方法 。
在移动记录指针后,应该检查 Eof属性
6.3.4 数据库记录的增删改操作
3,编辑记录
数据控件自动提供了修改现有记录的能力,当直接改变被数据库所约束的绑定控件的内容后,需单击数据控件对象的任一箭头按钮来改变当前记录,确定所做的修改 。
使用程序代码修改当前记录步骤的为:
① 调用 Edit方法 。
② 给各字段赋值 。
③ 调用 Update方法,确定所做的修改 。
如果要放弃对数据的所有修改,可用
updatecontrols方法,重读数据库的数据,没有调用 Update方法,数据的修改没有写入数据库,所以这样的记录会在刷新记录集时丢失 。
6.3.4 数据库记录的增删改操作图 6.11 编程建立增、删、改、查功能
例 6.5 设计一个窗体用以显示建立的 student.mdb数据库中基本情况表的内容。并加入,新增,,,删除,,,修改,,,放弃,和,查找,钮,通过对 5
个按纽的编程建立增、删、改、查功能。
6.3.4 数据库记录的增删改操作进入
Command1_Click事件的功能:
当按钮提示为,新增,时调用 AddNew方法,并将提示文字改为,确认,,同时使,删除,按钮
Command2,“修改,按钮 Command3和,查找,按钮
Command5不可用,而使,放弃,按钮 Command4可用 。
新增记录后,需再次单击 Command1调用 Update方法 确认 添加的记录,再将提示文字改为,新增,,
并使,删除,,,修改,和,查找,按钮可用,
而使,放弃,按钮不可用 。
On Error Resume Next语句表示在程序运行时发生错误,忽略错误行,继续执行下一语句 。
6.3.4 数据库记录的增删改操作
6.3.4 数据库记录的增删改操作
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
6.3.4 数据库记录的增删改操作
If Command1.Caption = "新增 " Then
Command1.Caption =,确认,
Data1.Recordset.AddNew
Text1.SetFocus
Else
Command1.Caption = "新增 "
Data1.Recordset.Update
Data1.Recordset.MoveLast
End If
End Sub
命令按钮 Command2_Click事件功能:
调用方法删除当前记录 。 当记录集中的记录全部被删除后,再执行 Move语句将发生错误,这时由 On
Error Resume Next语句处理错误 。
6.3.4 数据库记录的增删改操作
Private Sub Command2_Click()
On Error Resume Next
Data1.Recordset.Delete
Data1.Recordset.MoveNext
If Data1.Recordset.EOF
Then Data1.Recordset.MoveLast
End Sub
命令按钮 Command3_Click事件的功能:
根据按钮提示文字调用 Edit方法进入编辑状态或调用 Update方法将修改后的数据写入到数据库,并控制其他 3个按钮的可用性,
代码如下:
6.3.4 数据库记录的增删改操作
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
6.3.4 数据库记录的增删改操作
If Command3.Caption = "修改 " Then
Command3.Caption = "确认 "
Data1.Recordset.Edit
Text1.SetFocus
Else
Command3.Caption = "修改 "
Data1.Recordset.Update
End If
End Sub
命令按钮 Command4_Click事件的功能:
使用 UpdateControls方法放弃操作,代码如下:
6.3.4 数据库记录的增删改操作
Private Sub Command4_Click()
On Error Resume Next
Command1.Caption = "新增 "
Command3.Caption = "修改 "
6.3.4 数据库记录的增删改操作
Command1.Enabled = True
Command2.Enabled = True
Command3.Enabled = True
Command4.Enabled =false
Command5.Enabled = True
Data1.UpdateControls
Dala1.Recordset.MoveNext
End Sub
命令按钮 Command5_Click事件的功能:
根据输入专业使用 SQL语句查找记录,代码如下:
6.3.4 数据库记录的增删改操作
Private Sub Command5_Click()
Dim mzy As String
mzy = InputBox$("请输入专业 ","查找窗 ")
Data1.RecordSource = "Select * From 基本情况 _
Where 专业 = ' " & mzy & " ' "
Data1.Refresh
上面的代码给出了数据表内数据处理的基本方法
6.3.4 数据库记录的增删改操作
If Data1.Recordset.EOF Then
MsgBox "无此专业 !",,"提示 "
Data1.RecordSource =,基本情况,
Data1.Refresh
End If
End Sub
对于新记录或编辑过的记录必须要保证数据的完整性,这可通过 Data1_Validate事件过滤无效记录。
例如,对学号字段进行测试,如果学号为空则输入无效。在例 6.5中被学号字段所约束的绑定控件是
Text1,可用 Text1.DataChanged属性检测 Text1控件所对应的当前记录中的字段值的内容是否发生了变化,Action=6表示 Update操作。
可使用数据控件对象的任一箭头按钮来改变当前记录,以确定所做添加的新记录或对已有记录的修改
当单击数据控件的箭头按钮时触发 Validate事件,
Action取值 1?4分别对应单击其中一个箭头按钮的操作,
6.3.4 数据库记录的增删改操作
6.3.4 数据库记录的增删改操作
Private Sub Data1_Validate(Action As Integer,
Save As Integer)
If Text1.Text = " " And (Action = 6 Or
Text1.DataChanged)
Action=6表示 Update操作
Then
MsgBox "数据不完整,必须要有学号 !"
Data1.UpdateControls?读回原数据
End If
6.3.4 数据库记录的增删改操作
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 Sub
MoveFirst MoveLast
进入
1,ODBC概述
存在问题
① 使用数据库系统所提供的专用开发工具 (如嵌入式
SQL语言 ),开发的应用程序只能运行在特定的数据库系统环境下,适应性和可移植性比较差 。
② 使用数据库系统所提供的嵌入式 SQL语言,一个应用程序 只能连接同类的 DBMS,而无法同时访问多个不同的 DBMS;在实际应用中通常是需要同时访问多个不同的 DBMS。 这种情况下传统的数据库应用程序开发方法就难以实现。
为了解决这些问题,Microsoft公司开发了 ODBC。
6.4 ODBC
ODBC(Open DataBase Connectivity,即开放数据库互连 )是 Microsoft公司开发的一套开放数据库系统应用程序接口规范,目前它已成为一种工业标准,
它 提供了统一的数据库应用编程接口 (API),为应用程序提供了一套高层调用接口规范和基于动态连接库的运行支持环境。
使用 ODBC开发数据库应用时,应用程序调用的是标准的 ODBC函数和 SQL语句,数据库底层操作由各个数据库的驱动程序完成。 因此应用程序 有很好的适应性和可移植性,并且 具备了同时访问多种数据库管理系统的能力,从而彻底克服了传统数据库应用程序的缺陷。
6.4 ODBC
图 6.12 ODBC的体系结构
2,ODBC体系结构
6.4 ODBC
ODBC数据库应用程序驱动程序管理器
SQLServer
驱动程序
Oracle
驱动程序
Foxpro
驱动程序
Sybase
驱动程序
SQLServer
数据源
Oracle
数据源
Foxpro
数据源
Sybase
数据源
DB DB DB DB
主要任务包括:建立与数据源的连接
、向数据源发送 SQL请求、接收并处理请求的结果、断开与数据源的连接等 主要作用是用来装载 ODBC驱动程序,管理数据源,检查 ODBC
参数的合法性
6.4 ODBC
ODBC数据库应用程序驱动程序管理器
SQLServer
驱动程序
Oracle
驱动程序
Foxpro
驱动程序
Sybase
驱动程序
SQLServer
数据源
Oracle
数据源
Foxpro
数据源
Sybase
数据源
DB DB DB DB
ODBC应用程序不能直接存取数据库,它将所要执行的操作提交给数据库驱动程序,
通过针对不同数据源的驱动程序实现对不同数据源的各种操作ODBC驱动程序是一个动态链接库 (DLL),
类似于 Windows下的打印驱动程序,对用户来说,驱动程序屏蔽了不同对象 (数据库系统或打印机 )间的差异 。 同样地,
ODBC屏蔽了 DBMS之间的差异 。
6.4 ODBC
ODBC数据库应用程序驱动程序管理器
SQLServer
驱动程序
Oracle
驱动程序
Foxpro
驱动程序
Sybase
驱动程序
SQLServer
数据源
Oracle
数据源
Foxpro
数据源
Sybase
数据源
DB DB DB DB
数据库操作结果也通过驱动程序返回给应用程序 。
数据源
数据源 (Data Source Name,简称 DSN)是指 任一种可以通过 ODBC连接的数据库管理系统,它包括要访问的数据库和数据库的运行平台 。
数据源名 表达了一个 ODBC驱动程序和 DBMS的特定连接 。 例如,建立一个数据源名为 Studend1,并设置
Studend1=Studend.mdb。 使用 Studend1的用户可以由文件指定,本机使用或用户使用三种 。
通过定义多个数据源名,每个数据源名指向一个数据库服务器上的 DBMS名,在应用程序中使用不同的数据源名,可以 实现同时访问多个 DBMS的目的 。
6.4 ODBC
数据源分为以下三类,可以通过控制面板中 ODBC图标来设置:
用户数据源用户创建的数据源,称为,用户数据源,。 此时 只有创建者才能使用,并且只能在所定义的机器上运行 。 任何用户都不能使用其他用户创建的用户数据源 。
系统数据源所有用户 和在 Windows NT下以服务方式运行的应用程序 均可使用系统数据源 。
文件数据源文件数据源可用于企业用户,ODBC驱动程序安装在用户的计算机上 。
6.4 ODBC
ODBC提供了一个开放的,标准的能访问从 PC机,小型机到大型机数据库数据的接口 。 ODBC提供了在不同数据库环境中为客户机 /服务器 ( 简称 C/ S) 结构的客户机访问异构数据库的接口 。
使用 ODBC标准接口的应用程序,开发者可以不必深入了解要访问的数据库系统,比如其支持的操作和数据类型等信息,而只需掌握通用的 ODBC API编程方法即可 。
利用 ODBC开发的数据库应用程序具有很好的移植性,
当作为数据库源的数据库服务器上的数据库管理系统升级或转换到不同的数据库管理系统时,客户机端应用程序不需作任何改变 。
6.4 ODBC
6,1 数据库设计基础
6,2 本地数据库设计( ACCESS)
6,3 数据控件
6,4 ODBC
6,5 ADO数据控件
6,6 VB中 SQL的实现
6,7 VB中使用 ODBC
6,8 网络数据库设计
1,VB中的数据访问
VB提供的数据库引擎叫 Jet。
VB提供了两种与 Jet数据库引擎接口的方法:
Data控件 (Data Control)和数据访问对象 (DAO)。
这两种方法可以同时使用 。
6.1 数据库设计基础
Data控件提供了有限的不需编程就能访问现存数据库的功能
DAO模型是全面控制数据库的完整编程接口
VB通过 DAO,ADO和 Jet引擎可以识别三类数据库:
( 1) VB数据库
也称本地数据库,本地数据库文件格式与 Microsoft
Access相同 。 Jet引擎直接创建和操作这些数据库 。
( 2) 外部数据库
访问符合,索引顺序访问文件方法 (ISAM)”数据库,
包括,dBase III,dBase IV,Foxpro 2.0和 2.5以及 Paradox 3.x和 4.x。
( 3) ODBC数据库
访问符合 ODBC标准的客户机/服务器数据库,如
Microsoft SQL Server。
6.1 数据库设计基础
2,VB数据库体系结构
Jet引擎负责处理存储,检索,更新数据的结构,并提供了功能强大的面向对象的 DAO编程接口 。
(1) VB数据库应用程序的组成
VB数据库应用程序包含三部分,如图 6.1所示 。
图 6.1 VB数据库应用程序的组成
6.1 数据库设计基础用户界面 Jet引擎 数据库
① 用户界面和应用程序代码
用户界面是用户所看见的用于交互的界面,它包括显示数据并允许用户查看或更新数据的窗体 。
驱动这些窗体的是应用程序的 VB代码,包括用来请求数据库服务的数据访问对象和方法,比如添加或删除记录,或执行查询等 。
6.1 数据库设计基础
② Jet引擎
Jet引擎实际是一组动态链接库 (DLL)文件。在运行时,这些文件被链接到 VB程序。它把应用程序的请求翻译成,mdb(Access文件后缀 )文件或其他数据库的物理操作。
Jet引擎真正读取、写入和修改数据库,并处理所有内部事务,如索引、锁定、安全性和引用完整性。
Jet引擎包含一个查询处理器,接收并执行 SQL查询,
实现所需的数据操作。
Jet引擎包含一个结果处理器,用来管理查询所返回的结果。
6.1 数据库设计基础
③ 数据库
数据库是包含数据库表的一个或多个文件 。
本地 VB或 Access数据库文件后缀为,mdb文件 。
( 2) 数据库应用程序的存放
在单系统机中数据库,数据引擎和用户界面集中存放 。
在客户机 /服务器系统中,数据库引擎和数据库一起被放置在服务器上 。 数据库引擎可以同时对多个客户机的应用程序提供服务,操作数据库并对每个本地应用程序返回所请求的记录 。
6.1 数据库设计基础
6.1 数据库设计基础数据库数据库引擎用户界面服务器客户 机客户机/服务器引擎,通过 ODBC方式使用 。 在 VB中,通过连接到 ODBC数据源,
如 Microsoft SQL Server等,可直接把查询传递给服务器数据库引擎 。
VB中创建和访问数据库的途径主要有 3个:
可视化数据管理器使用可视化数据管理器,不需要编程就可以创建 Jet
数据库 。
DAO
使用 VB的 DAO部件通过编程的方法创建数据库 。
ISAM或 ODBC
VB可通过 ISAM或 ODBC驱动程序来访问外部数据库数据库 。
6.2 本地数据库设计 (ACCESS)
1,可视化数据管理器
数据管理器 (Data Manager)是 VB的一个传统成员,
它可以用于快速地建立数据库结构及数据库内容。
可以完成有关数据库的操作,比如数据库结构的建立、记录的添加及修改以及用 ODBC连接到服务器端的数据库如 SQL Server等。
启动数据管理器选择,外接程序,菜单下的,可视化数据管理器,
项就可以启动数据管理器,打开,VisData”窗口 。
6.2 本地数据库设计 (ACCESS)
2) 工具栏按钮
6.2 本地数据库设计 (ACCESS)
数据库窗口 SQL语句窗口显示数据库的结构,
包括表名,列名,
索引可输入 SQL命令,对数据库中的表进行查询操作
VisData窗口
6.2 本地数据库设计 (ACCESS)
设置记录集的访问方式指定数据表 中数据的显示 方式进行事务处理
6.2 本地数据库设计 (ACCESS)
表类型记录集按钮,允许 直接 对数据库中的数据进行增,删,改,
查等操作 。
动态集类型记录集按钮,将指定的数据打开并读入到内存中,进行数据编辑操作 。
快照类型记录集,只能读数据不能修改,适用于只查询的情况
6.2 本地数据库设计 (ACCESS)
指定数据表中数据的显示方式,在新窗体上使用 DATA控件指定数据表中数据的显示方式,在新窗体上不使用 DATA控件指定数据表中数据的显示方式,在 新 窗 体 上 使 用
DBGrid控件进入
2.具体实现
1)建立数据库
数据库 student.mdb(学生数据库 )中的表定义:
学生成绩表 (学号,课程,成绩,学期 )。
6.2 本地数据库设计 (ACCESS)
学生成绩表结构字段名 类型 宽度学号 Text 6
课程 Text 10
成绩 Long 4
学期 Text 2
基本情况表 (学号,姓名,性别,专业,出生年月,
照片,备注 )
6.2 本地数据库设计 (ACCESS)
学生基本情况表结构字段名 类型 宽度学号 Text 6
姓名 Text 10
性别 Text 2
专业 Text 10
出生年月 Date 8
照片 Binary 0
备注 Memo 0
添加数据表
建立索引建立索引可以加快检索速度。
2)录入数据
照片的输入:
静态设置,通过一个图片编辑程序将照片装入剪贴板,
等待从剪贴板复制到 Picture1控件 。
6.3.1 数据控件属性
动态设置,通过 Picture1_DblClick事件来完成剪贴板到 Picture1控件的复制,当移动记录指针时,
Picture1控件内的照片存入数据库 。
Private Sub Picture1_DblClick()
Picture1.Picture = Clipboard.GetData
End Sub
3) 建立查询
VB的数据管理器提供了一个图形化的设置查询条件的窗口 ——查询生成器 。
例如:查询 Authors ID=10或 Authors ID=1的情况
6.2 本地数据库设计 (ACCESS)
进入
Data控件数据控件提供有限的不需编程而能访问现存数据库的功能,允许将 Visual Basic的窗体与数据库方便地进行连接。
使用数据控件获取数据库中记录的集合,先在窗体上画出控件,再通过它的三个基本属性 Connect、
DatabaseName和 RecordSource设置要访问的数据资源。
6.2 数据控件
1,Connect属性
Connect属性指定数据控件所要连接的数据库类型,
Visual Basic默认的数据库是 Access的 MDB文件,
也可连接 ODBC等类型的数据库 。
Access数据库的所有表都包含在一个 MDB文件中 。
6.3.1 数据控件属性
2,DatabaseName属性
DatabaseName属性指定具体使用的数据库文件名,
包括文件所在的路径名 。
数据库中的基本表名可由 RecordSource属性指定 。
例如,要连接一个 Microsoft Access的数据库存放在 C:\Student.mdb.
设置 DatabaseName=”C:\ Student.mdb“,该方法可以通过属性栏设置,或在过程中指定,
在过程中可以使用相对路径来描述,
DatabaseName=”..\ Student.mdb“。
6.3.1 数据控件属性
3,RecordSource属性
RecordSource 确定具体可访问的记录集对象
Recordset。
该属性值可以是数据库中的 单个表名 或者是 使用 SQL
查询语言的一个查询 。
例如,指定 Student.mdb数据库中的基本情况表,
RecordSource=”基本情况,。
例如,访问基本情况表中所有物理系学生的数据。
RecordSource=”Select? From 基本情况
Where专业 =’ 物理 ’,,
6.3.1 数据控件属性
4,RecordsetType属性
RecordsetType属性确定记录集类型 。
( 1) Table,表记录集类型,一个记录集(单个表)
( 2) Dynaset,动态集类型,一个动态记录集(多个表),默认值。
( 3) Snapshot:快照类型,一个记录集静态副本(不可改)
5,EofAction和 BofAction属性
当记录指针指向 Recordset对象的开始 (第一个记录前 )或结束 (最后一个记录后 )时,BofAction和
EofAction属性的设置或返回值决定了数据控件要采取的操作 。 操作属性的取值如表 6.1所示 。
6.3.1 数据控件属性
6.3.1 数据控件属性属 性 值 设置 操 作
BofAction
0 vbBOFAction
MoveFirst
控件重定位到第 1个记录 (缺省 )
1 vbBOFAction
BOF
移过 Recordset的开始位,定位到一个无效记录 ;将在第一个记录上触发 Data 控件的 Validate 事件,紧跟着是非法 (BOF) 记录上的 Reposition 事件。此刻禁止
Data 控件上的 Move Previous
按钮。
焦点将从一个记录转换到另一个记录之前,Validate 事件发生该事件发生在某行变为当前行之后
6.3.1 数据控件属性属 性 值 设置 操 作
EofAction
0 vbEOFAction
MoveLast
控件重定位到最后一个记录 (缺省 )
1 vbEOFAction
EOF
移过 Recordset 的结尾,定位到一个无效记录 ;在最后一个记录上触发
Data控件的 Validate事件,紧跟着是在非法 (EOF) 记录上的事件
Reposition,此刻禁止 Data 控件上的 MoveNext 按钮,
2 vbEOFAction
AddNew
移过最后一个记录,在当前记录上触发 Data 控件的 Validate 事件,紧跟着是自动的 AddNew,向记录集加入新的空记录,接下来是在新记录上的 Reposition 事件,移动记录指针,
与数据控件绑定,
数据控件本身不能直接显示记录集中的数据,必须通过能与它绑定的控件来实现 。 可与数据控件绑定的控件对象有文本框,标签,图像框,图形框,列表框,组合框,复选框,网格,DB列表框,DB组合框,DB网格和 OLE容器等控件 。
要使绑定控件能被数据库约束,必需在设计或运行时对上述控件的两个属性进行设置:
DataSource属性 该属性通过指定 —个有效的数据控件连接到一个数据库上 。
DataField属性 该属性设置数据库有效的字段与绑定控件建立联系 。
6.3.1 数据控件属性
当上述控件与数据控件绑定后,Visual Basic将当前记录的字段值赋给控件 。
数据控件在装入数据库时,它把记录集的第一个记录作为当前记录 。 当数据控件的 EofAction属性值设置为 2时,当记录指针移过记录集结束位,数据控件会自动向记录集加入新的空记录 。
绑定控件、数据控件和数据库三者的关系如图下示。
6.3.1 数据控件属性绑定控件 数据库例 6.2 设计一个窗体用以显示建立的 student.mdb
数据库中基本情况表的内容 。
要显示基本情况表中除了备注字段外的 6个字段,
故需要用 6个绑定控件与之对应 。 这里用一个图形框显示照片和 5个文本框显示学号,姓名等数据 。
6.3.1 数据控件属性进入
数据控件 Data1属性设置
Connect属性指定为 Access类型
DatabaseName属性连接数据库 Student.mdb
RecordSource属性设置为,基本情况,表。
图片框和 5个文本框控件属性设置
Text1~ Text5的 DataSource属性设置成 Data1。
Text1~ Text5的 DataField属性分别选择与其对应的字段学号、
姓名、性别、专业和出生年月。
Picture1的 DataField属性选择字段照片
6.3.1 数据控件属性进入例 6.3 用数据网格控件 MsFlexGrid显示 Student.mdb
数据库中基本情况表的内容 。
6.3.1 数据控件属性进入
数据网格控件的 DataSource属性设置为一个
Data控件,运行时网格控件的列标题会用 Data
控件的记录集里的数据自动地设置 。
MsFlexGrid控件不是 Visual Basic工具箱内的默认控件,需要在开发环境中选择,工程 |部件,
菜单命令,并在随即出现的对话框中选择
,Microsoft FlexGrid Control 6.0”选项,将其添加到工具箱中 。
6.3.1 数据控件属性
DataSource=Data1
FixedCols=0
MSFlexGrid1
DatabaseName=”c:\student.mdb”
RecordsetType=1
RecordSource=”基本情况,
Data1
其它属性设置默认控件名表 6.4 控件属性
本例所用控件的属性设置如下表所示。
6.3.1 数据控件属性注意,不可卷动列属性 FixedCols=0与 FixedCols=1的区别进入
1,Reposition事件
Reposition事件激活的条件,当记录集指针从一条记录移到另一条记录,会产生 Reposition事件 。
Reposition事件作用,显示当前指针的位置 。
6.3.2 数据控件的事件和常用方法
Private Sub Data1_Reposition()
Data1.Caption =
Data1.Recordset.AbsolutePosition + 1
End Sub
AbsolutePosition属性指示当前指针值 (从
0开始 )。 当单击数据控件对象上的箭头按钮时,数据控件的标题区会显示记录的序号
2.Validate事件
Validate事件激活的方法,在焦点转换到一个(第二个)控件之前发生,此时该控件 CausesValidation
属性值设置为 True。
Validate事件的作用,用于检查被数据控件绑定控件的状态,例如,由一个记录移到另一个记录 ;或者焦点由一个文本框移到另一个文本框,
6.3.2 数据控件的事件和常用方法
6.3.2 数据控件的事件和常用方法例题,在窗体中放置一个 CommandButton 和两个
TextBox 控件,来演示 Validate 事 件 和
CausesValidation 属性的使用 。
限制条件为,如果 Text1没有包含日期或 Text2
没有包含一个大于 10的数字,将阻止焦点的转换 。
两个 TextBox 控件的 CausesValidatio n属性在缺省情况为 True,这样当把焦点从一个 TextBox
转换到另一个时,Validate 事件发生 。
进入
6.3.2 数据控件的事件和常用方法
Private Sub Form_Load()
With Command1
.CausesValidation = False
设置该属性为 False,当用户单击按钮时,
Validate事件不发生。
.Caption = "Help"
End With
Show
With Text1?选择 Text1的文本并为它设置焦点。
.SelLength = Len(Text1.Text)
.SetFocus
End With
End Sub
With 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称 。 例如,要改变一个对象的多个属性,可以在 Wi h 控制结构中加上属性的赋值语句,这时候只是引用对象一次而不是在每个属性赋值时都要引用它 。返回或设置所选择的字符数
6.3.2 数据控件的事件和常用方法
Private Sub Command1_Click()
当单击此按钮时给出用户帮助信息 。
MsgBox _
"Text1 must be set to a date." & VbCrLF & _
"Text2 must be a number less than 10.“
End Sub
回车换行
6.3.2 数据控件的事件和常用方法
Private Sub Text1_Validate(KeepFocus As Boolean)
如果值不是一个日期,则保持焦点,除非用户单击
Help。
If Not IsDate(Text1.Text) Then
KeepFocus = True
MsgBox "Please insert a date in this
field.",,"Text1"
End if
End Sub
返回 Boolean 值指明某表达式是否可以转换为日期 。
6.3.2 数据控件的事件和常用方法
Private Sub Text2_Validate(KeepFocus As Boolean)
如果值是一个大于 10的数字,保持焦点 。
If Not IsNumeric(Text2.Text) Or
Val(Text2.Text) > 10 Then
KeepFocus = True
MsgBox _"Please insert a number less than or
equal to 10.",,"Text2"
End If
End Sub
返回 Boolean 值指明表达式的值是否为数字。
进入
6.3.2 数据控件的事件和常用方法
Validate事件的检查方法,
通过 Save参数 (True或 False)判断被连接的数据
( 被绑定的控件 ) 是否发生变化。
通过 Action参数判断哪一种操作触发了
Validate事件。
6.3.2 数据控件的事件和常用方法
Validate事件的 Action参数常 数 值 描 述
vbDataActionCancel 0 Sub退出时取消操作
vbDataActionMoveFirst 1 MoveFirst 方法。
vbDataActionMovePrevious 2 MovePrevious 方法
vbDataActionMoveNext 3 MoveNext 方法
vbDataActionMoveLast 4 MoveLast 方法。
vbDataActionAddNew 5 AddNew 方法
6.3.2 数据控件的事件和常用方法
Validate事件的 Action参数常 数 值 描 述
vbDataActionUpdate 6 Update 操作。
vbDataActionDelete 7 Delete 方法
vbDataActionFind 8 Find 方法
vbDataActionBookmark 9 Bookmark 属性已被设置
vbDataActionClose 10 Close 的方法
vbDataActionUnload 11 窗体正在卸载。
保存对 Recorded 对象的当前记录所做的所有更改 。
例如,不允许用户在数据浏览时清空性别数据,可使用下列代码:
6.3.2 数据控件的事件和常用方法
Private Sub Data1_Validate(Action As Integer,_
Save As Integer)
If Save And Len(Trim(Text3.Text)) = 0 Then
Action = 0
MsgBox "性别不能为空! "
End If
End Sub检查被数据控件绑定的控件 Text3内的数据是否被清空 。 如果 Text3内的数据发生变化,则 Save参数返回 True,若性别对应的文本框 Text3被置空,则通过 Action=0取消对数据控件的操作去除前导空格和末尾空格
3,数据控件的常用方法
数据控件的内置功能很多,可以在代码中用数据控件的方法访问这些属性 。
1) Refresh方法
当 RecordSource在运行时被改变时,使用 Refresh方法,将当前指定 RecordSource中的数据装入内存工作区,达到 激活数据库 的作用 。
6.3.2 数据控件的事件和常用方法
6.3.2 数据控件的事件和常用方法
Private Sub Form_Load( )
Dim Mpath As String
Mpath=App.Path?获取当前路径
If Right(mpath,1)<>”/” Then mpath=mpath+”/”
Data1.DatabaseName=mpath+”Student.mdb”
连接数据库
Data1.RecordSource=?基本情况,’
构成记录集对象
Data1.Refresh?激活数据控件
End Sub
App 对象是通过关键字 App 访问的全局对象 。 它指定如下信息:应用程序的标题,版本信息,可执行文件的路径及名称以及是否运行前一个应用程序的示例 。
Path返回或设置当前路径,在编程时无效,运行时有效 。
RIGHT(cExpression,nCharacters)
Function返回从右边数的 n个字符 。
2) UpdateControls方法
UpdateControls方法 从数据库中重新读数据 送到被数据控件绑定的控件内 。
6.3.2 数据控件的事件和常用方法控件 DATA控件 数据库控件 DATA控件 数据库
3) UpdateRecord方法
对绑定控件内的数据修改后,数据控件需要移动记录集的指针才能保存修改 。 如果使用 UpdateRecord
方法,可 强制数据控件将绑定控件内的数据写入到数据库中,而不再触发 Validate事件 。
记录集 Recordset常用的属性和方法 。
1,AbsolutePosition属性
AbsolutePosition返回当前指针值,如果是第 1条记录,其值为 0,该属性为只读属性 。
2,Bof和 Eof的属性
Bof判定记录指针是否在 首记录之前,若 Bof为
True,则当前位置位于记录集的第 1条记录之前 。
Eof判定记录指针是否在 末记录之后,若 Eof为
True,则当前位置位于记录集的最后 1条记录之后 。
6.3.3 记录集的属性和方法
3,Bookmark属性
Bookmark属性的值采用字符串类型,用于设置或返回 当前指针的标签 。 在程序中可以使用 Bookmark属性重定位记录集的指针 。
4,Nomatch属性
在记录集中进行查找时,如果找到 相匹配的记录,
则 Recordset的 NoMatch属性为 False,否则为 True。
该属性常与 Bookmark属性一起使用 。
5,RecordCount属性
RecordCount属性对 Recordset对象中的 记录计数,
使用 RecordCount 属性可确定 Recordset 对象中记录的数目。
6.3.3 记录集的属性和方法
6,Move方法五种 Move方法是:
MoveFirst 将控件移动到第 1条记录 。
MoveLast 将控件移动到最后一条记录 。
MoveNext 将控件移动到后一条记录 。
MovePrevious 将控件移动到前一条记录 。
Move [n] 向前或向后移 n条记录,n为指定的数值 。
6.3.3 记录集的属性和方法例 6.4 设计一个窗体用以显示建立的 student.mdb数据库中基本情况表的内容 。 在窗体上用 4个命令按钮实现对数据库的操作 。
图 6.10 用按钮代替数据控件对象的箭头按钮
6.3.3 记录集的属性和方法进入
命令按钮 Command1_Click事件移至第 1条记录,代码如下:
6.3.3 记录集的属性和方法
命令按钮 Command4_Click事件移至最后一条记录,代码如下:
Private Sub Command4_Click()
Data1.Recordset.MoveLast
End Sub
Private Sub Command1_Click()
Data1.Recordset.MoveFirst
End Sub
使用 Move方法需要考虑 Recordset对象的边界状态 。
如果越界,则用 MoveFirst方法定位到第 1条记录或用
MoveLast方法定位到最后一条记录 。
使用 MoveFirst方法定位到第 1条记录:
6.3.3 记录集的属性和方法
Private Sub Command2_Click()
Data1.Recordset.MovePrevious
If Data1.Recordset.BOF
Then Data1.Recordset.MoveFirst
End Sub
使用 MoveLast方法定位到最后一条记录:
6.3.3 记录集的属性和方法
Private Sub Command3_Click()
Data1.Recordset.MoveNext
If Data1.Recordset.EOF
Then Data1.Recordset.MoveLast
End Sub
进入
7,Find方法
使用 Find方法可在 Recordset对象中查找与指定条件相符的一条记录,并使之成为当前记录 。
四种 Find方法是:
FindFirst方法 从记录集的 开始查找 满足条件的第 1
条记录 。
FindLast方法 从记录集的 尾部向前查找 满足条件的第 l条记录 。
FindNext方法 从 当前记录开始 查找满足条件的 下一条 记录 。
FindPrevious方法 从 当前记录开始 查找满足条件的上一条 记录 。
6.3.3 记录集的属性和方法
Find方法的语法格式,4种格式相同数据集,Find方法 条件
搜索条件表达式,是一个指定字段与常量关系的字符串表达式 。 在构造表达式时,除了用普通的关系运算外,还可以用 Like运算符 。
例如,查找专业 =物理的纪录
Data1.Recordset.FindFirst,专业 =’ 物理 ’”
查找下一条符合条件的记录,可继续使用语句:
Data1.Recordset.FindNext,专业 =’ 物理 ’” 。
6.3.3 记录集的属性和方法
例如,要在记录集内查找专业名称中带有,建,
字的专业,
Data1.Recordset.FindFirst,专业 Like?*建
*?”
如果 Find方法找不到相匹配的记录,则记录保持在查找的始发处,Recordset的 NoMatch属性为
True。
如果 Find方法找到相匹配的记录,则记录定位到该记录,Recordset的 NoMatch属性为 False。
6.3.3 记录集的属性和方法
6.3.3 记录集的属性和方法
Private Sub Command1_Click()
Data1.Recordset.FindFirst,course=?English?”
If Data1.Recordset.NoMatch Then
MsgBox,No such record found”
Else
MsgBox Data1.Recordset.Fields(“course” )
End If
End Sub
8,Seek方法
Seek方法,是根据 索引字段 的值,查找与指定索引规则相符的第 1条记录,并使之成为当前记录 。
其语法格式为:
数据表对象,seek comparison,keyl,key2…
比较运算符 comparison;可用的比较运算符有
=,>=,>,<>,<,<=
Seek允许接受多个参数 keyl,key2,… ;
在使用 Seek方法定位记录时,必须打开索引文件,
通过 Index属性设置索引文件 。 若在记录集中多次使用同样的 Seek方法 (参数相同 ),那么找到的总是同一条记录 。
6.3.3 记录集的属性和方法
例如,假设数据库 Student内基本情况表的索引字段为学号,满足学号字段值大于等于 110001的第 1条记录可使用以下程序代码:
6.3.3 记录集的属性和方法
Data1.RecordsetType = 1?设置记录集类型为 Table
Data1.RecordSource =,基本情况,
’ 打开基本情况表单
Data1.Refresh
Data1.Recordset.Index = "jbqk_no"
打开名称为 jbqk_no的索引
Data1.Recordset.Seek ">=","110001"
数据库记录的增,删,改操作需要使用 AddNew、
Delete,Edit,Update和 Refresh方法 。
它们的语法格式为:
数据控件,记录集,方法名
1,增加记录
① 调用 AddNew方法 。
② 给各字段 赋值 。 给字段赋值格式为:
Recordset.Fields(”字段名,)=值 。
6.3.4 数据库记录的增删改操作
③ 调用 Update方法,将缓冲区内的数据写入数据库 。
如果使用 AddNew方法添加新的记录,但是没有使用
Update方法而移动到其他记录,或者关闭记录集,
那么所做的输入将全部丢失,而且没有任何警告 。
当调用 Update方法写入记录后,记录指针自动返回到添加新记录前的位置上,而不显示新记录 。 因此,
需要在调用 Update方法后,使用 MoveLast方法将记录指针再次移到新记录上 。
6.3.4 数据库记录的增删改操作
2,删除记录
① 定位被删除的记录使之成为当前记录 。
② 调用 Delete方法 。
③ 移动记录指针 。
在使用 Delete方法时,当前记录立即删除,不加任何的警告或者提示 。
删除一条记录后,被数据库所约束的绑定控件仍旧显示该记录的内容 。 因此,必须移动记录指针刷新绑定控件,一般采用移至下一记录的处理方法 。
在移动记录指针后,应该检查 Eof属性
6.3.4 数据库记录的增删改操作
3,编辑记录
数据控件自动提供了修改现有记录的能力,当直接改变被数据库所约束的绑定控件的内容后,需单击数据控件对象的任一箭头按钮来改变当前记录,确定所做的修改 。
使用程序代码修改当前记录步骤的为:
① 调用 Edit方法 。
② 给各字段赋值 。
③ 调用 Update方法,确定所做的修改 。
如果要放弃对数据的所有修改,可用
updatecontrols方法,重读数据库的数据,没有调用 Update方法,数据的修改没有写入数据库,所以这样的记录会在刷新记录集时丢失 。
6.3.4 数据库记录的增删改操作图 6.11 编程建立增、删、改、查功能
例 6.5 设计一个窗体用以显示建立的 student.mdb数据库中基本情况表的内容。并加入,新增,,,删除,,,修改,,,放弃,和,查找,钮,通过对 5
个按纽的编程建立增、删、改、查功能。
6.3.4 数据库记录的增删改操作进入
Command1_Click事件的功能:
当按钮提示为,新增,时调用 AddNew方法,并将提示文字改为,确认,,同时使,删除,按钮
Command2,“修改,按钮 Command3和,查找,按钮
Command5不可用,而使,放弃,按钮 Command4可用 。
新增记录后,需再次单击 Command1调用 Update方法 确认 添加的记录,再将提示文字改为,新增,,
并使,删除,,,修改,和,查找,按钮可用,
而使,放弃,按钮不可用 。
On Error Resume Next语句表示在程序运行时发生错误,忽略错误行,继续执行下一语句 。
6.3.4 数据库记录的增删改操作
6.3.4 数据库记录的增删改操作
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
6.3.4 数据库记录的增删改操作
If Command1.Caption = "新增 " Then
Command1.Caption =,确认,
Data1.Recordset.AddNew
Text1.SetFocus
Else
Command1.Caption = "新增 "
Data1.Recordset.Update
Data1.Recordset.MoveLast
End If
End Sub
命令按钮 Command2_Click事件功能:
调用方法删除当前记录 。 当记录集中的记录全部被删除后,再执行 Move语句将发生错误,这时由 On
Error Resume Next语句处理错误 。
6.3.4 数据库记录的增删改操作
Private Sub Command2_Click()
On Error Resume Next
Data1.Recordset.Delete
Data1.Recordset.MoveNext
If Data1.Recordset.EOF
Then Data1.Recordset.MoveLast
End Sub
命令按钮 Command3_Click事件的功能:
根据按钮提示文字调用 Edit方法进入编辑状态或调用 Update方法将修改后的数据写入到数据库,并控制其他 3个按钮的可用性,
代码如下:
6.3.4 数据库记录的增删改操作
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
6.3.4 数据库记录的增删改操作
If Command3.Caption = "修改 " Then
Command3.Caption = "确认 "
Data1.Recordset.Edit
Text1.SetFocus
Else
Command3.Caption = "修改 "
Data1.Recordset.Update
End If
End Sub
命令按钮 Command4_Click事件的功能:
使用 UpdateControls方法放弃操作,代码如下:
6.3.4 数据库记录的增删改操作
Private Sub Command4_Click()
On Error Resume Next
Command1.Caption = "新增 "
Command3.Caption = "修改 "
6.3.4 数据库记录的增删改操作
Command1.Enabled = True
Command2.Enabled = True
Command3.Enabled = True
Command4.Enabled =false
Command5.Enabled = True
Data1.UpdateControls
Dala1.Recordset.MoveNext
End Sub
命令按钮 Command5_Click事件的功能:
根据输入专业使用 SQL语句查找记录,代码如下:
6.3.4 数据库记录的增删改操作
Private Sub Command5_Click()
Dim mzy As String
mzy = InputBox$("请输入专业 ","查找窗 ")
Data1.RecordSource = "Select * From 基本情况 _
Where 专业 = ' " & mzy & " ' "
Data1.Refresh
上面的代码给出了数据表内数据处理的基本方法
6.3.4 数据库记录的增删改操作
If Data1.Recordset.EOF Then
MsgBox "无此专业 !",,"提示 "
Data1.RecordSource =,基本情况,
Data1.Refresh
End If
End Sub
对于新记录或编辑过的记录必须要保证数据的完整性,这可通过 Data1_Validate事件过滤无效记录。
例如,对学号字段进行测试,如果学号为空则输入无效。在例 6.5中被学号字段所约束的绑定控件是
Text1,可用 Text1.DataChanged属性检测 Text1控件所对应的当前记录中的字段值的内容是否发生了变化,Action=6表示 Update操作。
可使用数据控件对象的任一箭头按钮来改变当前记录,以确定所做添加的新记录或对已有记录的修改
当单击数据控件的箭头按钮时触发 Validate事件,
Action取值 1?4分别对应单击其中一个箭头按钮的操作,
6.3.4 数据库记录的增删改操作
6.3.4 数据库记录的增删改操作
Private Sub Data1_Validate(Action As Integer,
Save As Integer)
If Text1.Text = " " And (Action = 6 Or
Text1.DataChanged)
Action=6表示 Update操作
Then
MsgBox "数据不完整,必须要有学号 !"
Data1.UpdateControls?读回原数据
End If
6.3.4 数据库记录的增删改操作
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 Sub
MoveFirst MoveLast
进入
1,ODBC概述
存在问题
① 使用数据库系统所提供的专用开发工具 (如嵌入式
SQL语言 ),开发的应用程序只能运行在特定的数据库系统环境下,适应性和可移植性比较差 。
② 使用数据库系统所提供的嵌入式 SQL语言,一个应用程序 只能连接同类的 DBMS,而无法同时访问多个不同的 DBMS;在实际应用中通常是需要同时访问多个不同的 DBMS。 这种情况下传统的数据库应用程序开发方法就难以实现。
为了解决这些问题,Microsoft公司开发了 ODBC。
6.4 ODBC
ODBC(Open DataBase Connectivity,即开放数据库互连 )是 Microsoft公司开发的一套开放数据库系统应用程序接口规范,目前它已成为一种工业标准,
它 提供了统一的数据库应用编程接口 (API),为应用程序提供了一套高层调用接口规范和基于动态连接库的运行支持环境。
使用 ODBC开发数据库应用时,应用程序调用的是标准的 ODBC函数和 SQL语句,数据库底层操作由各个数据库的驱动程序完成。 因此应用程序 有很好的适应性和可移植性,并且 具备了同时访问多种数据库管理系统的能力,从而彻底克服了传统数据库应用程序的缺陷。
6.4 ODBC
图 6.12 ODBC的体系结构
2,ODBC体系结构
6.4 ODBC
ODBC数据库应用程序驱动程序管理器
SQLServer
驱动程序
Oracle
驱动程序
Foxpro
驱动程序
Sybase
驱动程序
SQLServer
数据源
Oracle
数据源
Foxpro
数据源
Sybase
数据源
DB DB DB DB
主要任务包括:建立与数据源的连接
、向数据源发送 SQL请求、接收并处理请求的结果、断开与数据源的连接等 主要作用是用来装载 ODBC驱动程序,管理数据源,检查 ODBC
参数的合法性
6.4 ODBC
ODBC数据库应用程序驱动程序管理器
SQLServer
驱动程序
Oracle
驱动程序
Foxpro
驱动程序
Sybase
驱动程序
SQLServer
数据源
Oracle
数据源
Foxpro
数据源
Sybase
数据源
DB DB DB DB
ODBC应用程序不能直接存取数据库,它将所要执行的操作提交给数据库驱动程序,
通过针对不同数据源的驱动程序实现对不同数据源的各种操作ODBC驱动程序是一个动态链接库 (DLL),
类似于 Windows下的打印驱动程序,对用户来说,驱动程序屏蔽了不同对象 (数据库系统或打印机 )间的差异 。 同样地,
ODBC屏蔽了 DBMS之间的差异 。
6.4 ODBC
ODBC数据库应用程序驱动程序管理器
SQLServer
驱动程序
Oracle
驱动程序
Foxpro
驱动程序
Sybase
驱动程序
SQLServer
数据源
Oracle
数据源
Foxpro
数据源
Sybase
数据源
DB DB DB DB
数据库操作结果也通过驱动程序返回给应用程序 。
数据源
数据源 (Data Source Name,简称 DSN)是指 任一种可以通过 ODBC连接的数据库管理系统,它包括要访问的数据库和数据库的运行平台 。
数据源名 表达了一个 ODBC驱动程序和 DBMS的特定连接 。 例如,建立一个数据源名为 Studend1,并设置
Studend1=Studend.mdb。 使用 Studend1的用户可以由文件指定,本机使用或用户使用三种 。
通过定义多个数据源名,每个数据源名指向一个数据库服务器上的 DBMS名,在应用程序中使用不同的数据源名,可以 实现同时访问多个 DBMS的目的 。
6.4 ODBC
数据源分为以下三类,可以通过控制面板中 ODBC图标来设置:
用户数据源用户创建的数据源,称为,用户数据源,。 此时 只有创建者才能使用,并且只能在所定义的机器上运行 。 任何用户都不能使用其他用户创建的用户数据源 。
系统数据源所有用户 和在 Windows NT下以服务方式运行的应用程序 均可使用系统数据源 。
文件数据源文件数据源可用于企业用户,ODBC驱动程序安装在用户的计算机上 。
6.4 ODBC
ODBC提供了一个开放的,标准的能访问从 PC机,小型机到大型机数据库数据的接口 。 ODBC提供了在不同数据库环境中为客户机 /服务器 ( 简称 C/ S) 结构的客户机访问异构数据库的接口 。
使用 ODBC标准接口的应用程序,开发者可以不必深入了解要访问的数据库系统,比如其支持的操作和数据类型等信息,而只需掌握通用的 ODBC API编程方法即可 。
利用 ODBC开发的数据库应用程序具有很好的移植性,
当作为数据库源的数据库服务器上的数据库管理系统升级或转换到不同的数据库管理系统时,客户机端应用程序不需作任何改变 。
6.4 ODBC