VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 理解与掌握ACCESS
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:12442, 日期:2001-07-06
理解与掌握ACCESS
---- 摘要:本文从xBase 用户的角度对比分析了ACCESS 与xBase 的差异并进一步阐述了ACCESS 中的数据库对象及编程方法。

---- 关键词:ACCESS----Foxpro----数据库

---- 微软公司有两个流行的桌面数据库开发工具,一个是其自行研制开发的基于WINDOWS 环境的ACCESS,另一个是其兼并FOX 公司而得到的Foxpro。通常将dBASE、FoxBase、Foxpro 等统称为xBase 在我国拥有大量的用户,随着微软公司的ACCESS 在国际桌面数据库市场上的迅速崛起及中文OFFICE 在我国的深入普及,越来越多的用户开始使用MSACCESS(中文OFFICE97 的组件之一),很多xBase 用户也开始转向或使用微软公司的ACCESS。由于ACCESS的文件组织、数据类型、编程语言、编程方法等
与xBase 有较大的差异,致使不少xBase 用户在学习ACCESS 时感到困惑,有些用户甚至仅仅是因为从ACCESS 中找不到与xBase 相对应的命令而对ACCESS大加抨击,从而放弃ACCESS 的学习。与xBase 相比,
ACCESS 有很多先进特性,xBase 用户一旦你掌握ACCESS 的基本概念与编程方法、改变“xBase 的思维方式”,就能利用已有的xBase 知识能够很快地掌握ACCESS。本文从多方面对xBase 和ACCESS 进行对比分析,通过对比使传统的xBASE 用户更好地理解与掌握ACCESS。

---- 壹、ACCESS 与xBase 的主要差异:

---- 从大的方面说,ACCESS 的使用与编程方法
同Visual Foxpro3.0 及Visual Foxpro5.0 的使用与编程方法非常相似,熟悉Visual Foxpro3.0 及以上版本的用
户会非常容易地学会ACCESS。没有使用过Visual
Foxpro 的传统xBase 用户在开始学习ACCESS 或Visual
Foxpro 时,需要从思想上做较大的转变,这是由于ACCESS 及Visual Foxpro 都是采用基于事件处理和面
向对象的程序设计方法。下文中所谈到的xBase 指的是Visual Foxpro 以下的版本。

---- 文件组织不同:用xBase 建立的系统通常包含很多不同类型的文件,每一个表、程序、报表、查询、索引、菜单等内容都是文件的方式存放在磁盘上,可以通过项目文件对其他类型的文件进行组织与管理;ACCESS 对数据库的组织同大型后台数据库系统(如SQL SERVER)的数据库组织非常相似,不同数据或程序元素称为对象,所有的
对象都存储在一个物理文件中,而这个物理文件被称为数据库。

---- 编程语言不同:在传统的xBase 中,表、记录等数据操纵或是界面的设计采用的是xBase 命令进行编程,高版本的Foxpro 中引入了部分SQL 语句(如SQL-SELECT)主要用来完成数据的查询;ACCESS 中对表、记录等数据操作主要通过SQL 实现,程序及事件代码的编写采用Visual Basic for Application(低版本的ACCESS 用access basic 编程),简单的程序设计用宏。Visual Basic 是更为通用的编程语言,MS Office 的组件都可以用Visual Basic 进行编程。

---- 编程方法不同:xBase 中采用面向过程的程序设计方法,即使是一个用户输入界面的设计也需要较长的一段xBase 程序;ACCESS 中采用面向对象的程序设计方法,数据处理功能的完成通过改变对象的属性或执行对象方法实现,程序段通常构成事件过程、对象方法、函数,ACCESS 中较少会出现连续的长程序。此外,ACCESS 中具有字段级、记录级、表级数据引用完整性数据约束功
能,事务处理功能和完备的安全机制。

---- 贰、ACCESS 中的数据库对象

---- ACCESS 的数据库窗口中包含六类不同的数据库对象,它们分别是表(Table)、查询(Query)、窗体(Form)、报表(Report)、宏(Macro) 和模块(Module)。ACCESS的数据库如同一个容器一样包含了全部的数据
库对象,与Foxpro 的项目文件不同ACCESS 将这些对
象存储在一个文件中。创建数据库对象只需单击数据库窗口中的‘新建’按钮,修改已有对象选择对象然后单击‘设计’按钮。

---- ACCESS 中的表:ACCESS 中的表等同于xBase 中的DBF文件或Visual Foxpro 中的数据库表。ACCESS 的表
与xBase 的DBF 文件比有如下新特点:

  字段名可多达64 位字符
  可以设置字段的输入掩码、缺省值、值范围。相当与xBase 中使用@匞ET 语句中的PICTURE、DEFAULT、RANGE 等子句的作用。可以设置字段与字段间的关系(通过设置表  的属性)


---- 在ACCESS 中,不需要用专门的命令或操作来建立和维护索引文件,按某字段建立索引只需在该字段的索引属性中选择特定的索引类型即可,索引的建立维护和使用都是通过ACCESS 系统来完成的,在xBase 中诸:Index on、set index to 等操作不必有用户关心。

---- 根据需要可在ACCESS 的数据库中创建多个表,表与表之间能够建立所谓的参照完整性关系,如同在xBase 中用set relation 、set skip 命令创建的多对一和一对多关系一样,ACCESS 只需图形界面操作就可完成一对多和多对一关系的建立并且通过连锁删除与连锁更新来确保相关表中记录之间关系的有效性,并且不能意外地删除或更改相关数据。

---- 使用ACCESS 表与使用xBase 的DBF 文件的一个重要
差别是所谓“打开”的概念不同,xBase 中用USE 命令打开DBF 文件实质是在内存建立数据缓冲区提供数据通道,若想查看DBF 文件中的数据需要再使用BROWSE 或其他命令,ACCESS 中打开一个表相当于xBase 中USE + BEOWSE 命令。对表中的数据进行处理而不显示表中的记录,在ACCESS 中通常有两中做法,一种是用SQL 语句更新或改变数据,无须先打开表后执行SQL 语句;另一种是用VBA 编程通过数据访问对象(DAO)来操纵表,通过DAO 操纵表时,要打开所谓的记录集(Recordset),xBase 中的USE 命令与VBA(Visual BASIC for Application)中的Openrecordset方法的作用象类似。

---- 查询(Query):ACCESS 中的查询本质上就是SQL 的数据操纵语,利用查询可以通过不同的方法来查看、更改以及分析数据,相当于Foxpro 中的SQL SELECT 语句及Foxpro 的查询。在ACCESS 中,对表、记录、字段的多数操作都可通过查询来完成,例如:在xBase 中使用很多的REPLACE ... WITH ... 命令在ACCESS 中应当用一个动作查询来完成(SQL UPDATE
)。在ACCESS 中建立和使用查询基本上等同于在后台数据库(如:ORACLE、SQL SERVER)中使用SQL 命令,Microsoft Jet 数据库引擎的SQL 符合ANSI SQL,ACCESS
的SQL 实现了几乎所有的ANSI SQL 功能,有些SQL 命令
在ANSI SQL 中所没有的。

---- ACCESS 中选择查询比Foxpro 中的SQL SELECT 命令使用起来更为方便灵活,在ACCESS 中,选择查询在使用等同于表,可以在表与查询间建立关系,查询也可象表一样作为窗体和报表的记录来源,利用查询还能再建查询。

---- 窗体(Form):窗体是利用ACCESS 开发出系统的主要交互界面,在有些书刊上又把窗体叫做表单,窗体相当于xBase 中利用@匰AY匞ET 命令编写用于实现所谓全屏幕编辑功能的程序,窗体又近似于Foxpro 中的屏幕文件(.SCX)。在ACCESS 中建立人机交互界面如同在Foxpro 中建立屏幕文件需要创建窗体对象。

---- 报表(Report):ACCESS 的报表对象最接近xBase 中的报表文件(FRX、FRM)。在xBase 中建立报表文件之
后需要用REPORT FORM ... 命令预览或打印报表,ACCESS 中报表对象建立之后可直接在数据库窗口中单击‘打开’按钮预览报表或是在宏或模块中用OPENREPORT 命令打印或预览报表。

---- 宏(Macro):宏是指一个或多个操作的集合,其中每个操作实现特定的功能,例如打开某个窗体或打印某个报表。宏可以使某些普通的任务自动完成。例如,可设置某个宏,在用户单击某个命令按钮时运行该宏,以打印某个报表。在xBase 中没有特定的文件类型与ACCESS 的宏相对应,在ACCESS97 及以下的版本中,利用宏来创建用
户自定义菜单。
---- 模块(module):ACCESS 的模块相当于xBase 中的程序文件和过程文件。每一个模块中可以包含一个或多个子程序、函数或属性,子程序相当于Base 中的过程(Procedure)。

---- 壹、ACCESS 中用户界面设计
---- 在信息系统的开发中,用户界面的设计占有较大的工作量。ACCESS 中的用户界面设计比xBase 中的用户界面设计大大简化,早期的xBase 版本中用户界面的设计需要确定屏幕上显示文字的坐标位置然后用户@ 卻ay単et 命令书写程序;Foxpro 中,用户界面的设计有了较大的改进,设计用户界面时,先建立屏幕文件(.SCX),然后用生成器生成用户界面的程序文件(.SPR)。ACCESS 中建立用户界面即建立数据库窗体对象(Form),Form 的建立与设计和多数基于WINDOWS 的开发工具(如:Visual
BASIC)的界面设计一致,与xBase 的用户界面设计有较大的差异,xBase 用户应从以下几个方面理解和把握ACCESS 的窗体设计:

---- 1. 理解窗体与程序

---- Foxpro 中,建立用户交互界面需先建立屏幕文件,屏幕文件中又包含若干代码片段(CodeSnippet),利用生成器根据屏幕文件生成扩展名为SPR 的程序文件,代码片段被包含在程序文件之中,执行程序文件即出现交互式用户界面。ACCESS 中,窗体相当于屏幕文件,窗体有三种不同的视图(VIEW)-- 设计视图、窗体视图和数据表视图。设计视图模式用于设计或修改窗体,窗体设计好之后就可以以窗体视图或数据表视图打开窗体即为用户操作使用的交互界面。ACCESS 中不需要将窗体生成程序代码,窗体建好之后直接打开窗体或切换到窗体视图即可。Foxpro 中另人头疼的事情之一是调试屏幕时反复修改屏
幕、生成程序代码、执行程序观看运行效果,对屏幕文件的任何微小改动都必须通过生成程序、执行程序才能看到结果,ACCESS 中无须生成过程,只需在设计视图与窗体视图间切换即可知道窗体修改后的效果。

---- 窗体模块与事件过程:在Foxpro 中,@匞ET 、READ、ACTIVATE 等命令中都可带有许多子句,如:最为常用的VALID 子句,子句通常跟一个用户自定义函数,在用屏幕生成器建立屏幕文件时,子句后的自定义函数的内容可直接输入,这些子句用到的自定义函数程序段被称为代码片段(CodeSnippet)。ACCESS 中,与Foxpro 中代码片段相对应的程序段是事件过程(Event Procedure),所谓事件过程是指一种自动执行的过程,用来对用户或程序代码启动的事件或系统触发的事件作出响应。例如:在Foxpro 中若想在某一字段的值输入或修改之后执行某一段程序,则需要通过输入代码片段建立VALID 子句及VALID 子句所需要的自定义函数;在ACCESS 中,某控件(CONTROL)的值在输入或修改之后欲执行某段程序需在该控件的AfterUpdate 事件属性的事件过程中输入程序内容即可,当控件的值发生变化之后发生After Update 事件系统就自动执行该事件对应的事件过程。ACCESS 中每一个窗体都有与该窗体相关联的窗体模块,窗体模块中存放了所有该窗体的事件过程和该窗体的公用子程序和函数,窗体保存时该窗体模块自动保存。

---- 2. 理解记录来源(Record Source)

---- 在Foxpro 中,创建屏幕文件之前应先打开相关的表,建立表与表之间的关系,屏幕文件建立之后在保存时系统会询问是否保存环境(Environment),若保存环境则系统保存了打开的表,生成程序代码中包含有打开和关闭表的命令。ACCESS 中窗体的“数据环境”被称为记录来源(Record Source),记录源可以是表、查询或SQL 的SELECT 语句。ACCESS 的记录来源比Foxpro 的“数据环境”提供了更大的灵活性,当ACCESS 窗体的记录来源是相互?关联”的若干表时,ACCESS 中通过建立查询或是使用SQL SELECT 语句作为记录来源,而查询与SELECT语句指定了相关的表及表间关系。

---- 建立Foxpro 的屏幕文件需先打开相关表并保存“数据环境”才能在生成程序时包含有打开表的代码行,ACCESS 窗体的记录来源只是在窗体的记录来源属性中给出表、查询名字或SQL SELECT 语句,记录来源并不生成程序代码。窗体在打开时自动处理表、查询及SELECT 语句的数据,并没有什么命令或语句来处理表、查询的打开问题。

---- 3. 理解控件、属性及事件过程

---- Foxpro 屏幕生成器界面中添加的文本框(TextBox)、列表框(ListBox)等项目在生成程序后对应内存变量或字段变量,屏幕生成器中对文本框等项目的许多设置形成了生成代码的@ ..GET语句的许多子句如:ENABLE 、DISABLE 、FONT、STYLE、DEFAULT、MESSAGE、RANGE 、COLOR 等,屏幕生成器中输入的代码片段(Code Snippet)形成了程序中的自定义函数或过程和@単et 语句的VALID、WHEN 等子句。
ACCESS 中,相当Foxpro 于屏幕生成器中文本框等项目的称之为控件(CONTROL)。Foxpro 中@単et 语句的子句在ACCESS 中是通过控件的属性来实现的,例如:
Foxpro 中的@ .... Get text disable 语句,在ACCESS 中是
将text 控件的enabled 属性值设置为False( 否);Foxpro中SHOW GET TEXT ENABLE 在ACCESS 中用赋值语句Me!text.enabled=true 改变text 控件的属性。Foxpro 中的代码片段在ACCESS 中是通过事件过程实现的,例如:Foxpro 中@匞et text valid check() 语句中包含有Valid 子句和check() 自定义函数,实现同样的功能在ACCESS 中在text 控件的Before Update( 或After Update)属性值选择‘[ 事件过程]’并输入相应的程序代码。常见的Foxpro @匞ET 语句的子句与ACCESS 的控件属性对应关系如下:

Foxpro 子句
ACCESS 控件属性
FUNCTION
Format 、Input Mask 属性
PICTURE
Format 、Input Mask 属性
FONT
Font color name size weight italic underline 等属性
STYLE
Font italic underline 等属性
DEFAULT
Default Value
ENABLED|DISABLE
Enabled
RANGE
Validation Rule、Validation Text
SIZE
Left 、top、height、width
VILID
Before Update、After Update
WHEN
On enter 、On Got focus

---- 1. 在窗体中“移动记录指针”

---- 通过foxpro 屏幕生成器创建的用户界面中常常包含用于移动记录的按钮,通过单击按钮改变屏幕或窗口中当前记录,foxpro 中实现该功能的方法一般是在按钮变量的valid 子句的函数中增加指针移动语句如:skip、goto 、locate 等。XBase用户初次使用ACCESS 窗体时欲实现同等功能但往往不知如何下手,ACCESS 中实现窗体中记录导航可以通过以下三种方法:

  在窗体的左下角增加记录导航控制按钮(navigation button)使用Goto Record 宏或Find Record 宏使用数据访问对象(DAO)改变当前窗体的记录

---- 若只是在窗体中前后移动记录,不需要编写程序,在窗体的设计视图将窗体的navigation button值设置为true,则在窗体时就会出现导航按钮,用户通过单击导航按钮前移、后移记录。若想将记录移到特定的记录则必须通过用宏或VB 编程实现,例如:单击窗体中的CMD 按钮下移三个记录则在CMD 按钮的on click 事件过程中输入如下VB 语句:

---- DoCmd.GoToRecord ,,,3

---- 下面的示例在当前窗体中使用记录集及FindFirst 方法将记录定位到“姓名”字段值为?张三”的记录:

Dim rst As Recordset
    Dim strSearchName As String
    Set rst = Me.RecordsetClone
    strSearchName = " 张三"
    rst.FindFirst " 姓名= " & strSearchName
        If rst.NoMatch Then
            MsgBox " 没找到"
        Else
            Me.Bookmark = rst.Bookmark
        End If
    rst.Close


---- 程序中Me.RecordsetClone 是由窗体的RecordSource属性指定的基础查询或基表的一个副本,Bookmark是记录集的书签,用来唯一标识窗体基表、基础查询或SQL 语句中的特定记录。例子中FindFirst方法先在窗体记录来源的记录集副本中定位记录,然后再将窗体的记录的位置移动到相同的位置。

---- 壹、xBase 中的常用命令在ACCESS 中如何实现

---- 许多xBase 用户初次使用ACCESS 时常常在ACCESS 中查找与xBase 命令相当的语句、功能或实现方法,下表给出了常用的xBase 命令所对应的ACCESS 宏命令及VB 语句或实现方法:

XBase 命令
ACCESS 宏命令
ACCESS VBA 语句
ACCESS 操作
USE < 表>

OpenRecordset 方法
通常不需要,处理表记录时用
BROWSE/EDIT
OpenTable
Docmd.opentable
在数据库窗口直接打开表
INDEX ON

指定表字段的索引属性
SORT ON

通过工具栏的按钮或菜单上命令
REPLACE

使用SQL 语句
SUM AVER 等

Dsum() 等函数
使用SQL 语句
GOTO
GotoRecord
Move 方法
使用记录导航按钮
SKIP
GotoRecord
Move 方法
使用记录导航按钮
LOCATE

FindFirst 方法
通过工具条或菜单命令查找与过滤操作
TOTAL

使用SQL 语句
壹、ACCESS 中的数据类型

---- xBase 用户在初次使用ACCESS 时对ACCESS 表的字段类型特别是数值型字段类型不适应。正是由于对ACCESS 的数据类型缺乏足够的了解,使得很多用户在开发过程中出现了一些问题。ACCESS与xBase 表的字段类型及其对应关系见下表:

ACCESS 中表的字段类型
xBase 中库的字段类型
字符型(Text)
字符型(Character)
数值型( 短整型、长整型、单精度、双精度)
数值型(Numeric)
货币型(Currency)
数值型(Numeric)
备注型(Memo)
备注型(Memo)
日期时间型(date/Time)
日期型(Date)
逻辑型(Yes/No)
逻辑型(Logical)
OLE 对象型(OLE Object)
通用型(General)


---- XBase 用户初次使用ACCESS 时常遇到的问题之一是ACCESS 表中的数值型字段类型问题,在xBase的DBF 文件中定义数值型字段需给出字段类型、宽度和小数位数,在记录的数值型字段存放数据时,xBase 只保存规定的小数位数并自动处理四舍五入问题,ACCESS 中表的数值型字段同xBase 的数值型字段不同,在表中的字段存放数值型数据需将字段设置为短整型、长整型、单精度、双精度或货币型中的一种,在数值字段保存数据时不能保存固定长度的小数位数,也不能自动处理小数的四舍五入问题。尽管字段属性中有DecimalPlaces 和Format,但这两个属性只是确定数据的显示方式而不是保留特定的小数位数,用户必须在保存数值数据时自行处理保留的小数位数及四舍五入问题。

---- XBase 用户使用ACCESS 表时常遇到另一个问题是字段的NULL 值问题,xBase 中,若字段没输入值,则字符型字段为空格串、数值型字段为零值;ACCESS 中,若字段没输入值则字段的值为NULL(空值),NULL 是ACCESS 中的特殊常量表示没值,NULL 不能赋予非Variant 变量。通过DAO 访问记录的字段时,使用NZ()函数将NULL 转换为字符型空串或数值型零值。