VB数据库详解.docx
《VB数据库详解.docx》由会员分享,可在线阅读,更多相关《VB数据库详解.docx(44页珍藏版)》请在冰点文库上搜索。
VB数据库详解
11.1数据库(DateBase)的基本概念
一、概念与术语
目前几乎所有的应用程序都需要存放大量的数据,这些大量数据一般都需要经过数据收集、分析后,整理成一定的组织结构,通过数据库管理系统来进行管理。
数据库管理系统提供了数据在数据库内存放方式的管理能力,使程序设计人员在使用数据库时不需要考虑数据的具体操作与数据之间的关系。
数据库是一组排列成易于处理和读取的相关信息的集合。
数据库按其模型结构可分为层次数据库、网状数据库和关系数据库。
其中关系数据库的理论发展最为完备,因此到目前为止关系数据库的应用最为广泛。
VisualBasic默认的数据库为微软的Access数据库,可在VisualBasic中利用数据库管理器直接创建,数据库文件的扩展名为.MDB。
除此之外,VisualBasic还可以处理各种外部数据库,如dBASE、FoxPro、Paradox、Btrieve、MicrosoftExcel、Lotus1-2-3、Text等格式的数据库,甚至其它非关系的数据库,VB在调用这些数据时,都会自动将其转换为关系型的数据库来操作。
1. 数据表(Table)
数据表是一组相关联的按行与列排列的逻辑数据的集合,简称为表。
在数据库理论中常用来表示一个实体,每个数据表必须有一个表名,一个数据库一般由多个数据表组成,各个数据表之间一般应存在某种关系。
2. 字段(Field)
数据表中的每一列称为一个字段。
数据表是由其包含的所有字段构成的,每个字段用来描述它包含的数据。
在创建数据表时,必须为每个字段起一个名称一般称为字段名,同时需要为每个字段分配一个数据类型、最大长度和其它属性。
3. 记录(Record)
数据表中的每一行称为一条记录。
记录是字段值的集合,所有用户对数据的访问对象是记录,因此,如果想对某个数据项进行访问,必须首先进行记录定位,严格的说,在一个数据表中不允许存在两条完全相同的记录。
4. 关键字(Keyword)
如果数据表中某个字段值或若干个字段值的集合能唯一确定一条记录,则称该字段或字段的集合为该数据表的关键字。
在一个数据表中,关键字可能存在多个,但需选定其中一个作为主关键字。
对于数据表中的每条记录来说,主关键字的值必须唯一。
5. 索引(Index)
为了提高访问数据库的速度,大多数数据库都使用索引。
索引即对数据表中的某个或几个字段的值按某种特定的顺序进行排列。
在VB中利用索引可以加快数据检索速度。
6. 结构化查询语言(SQL)
SQL(StructureQueryLanguage)是结构化查询语言的缩写,是数据库中通用的数据查询编程语言,它是我们访问数据库的一种利器。
在VisualBasic 中访问数据库时,就可以利用SQL同数据库进行通讯。
二、数据库的设计
数据库的设计一般需要借助E-R图进行数据建模,然后把整个E-R图中的每个实体和有关的联系,都转化为关系。
对每个关系再进行规范化,最后给出各个数据表完成数据库的逻辑设计,对每个关系来说,在选定的数据库管理系统下,创建数据库、数据表以与它们之间的关系,并输入数据进行测试,完成数据库的物理设计。
具体内容请读者参考相关的数据库理论方面的书籍。
11.2VisualBasic的可视数据管理器
VisualBasic所支持的不同类型的数据库大都可以通过相应的数据库管理系统来建立,如在MSAccess中可以建立.MDB的数据库。
也可以使用VisualBasic下的数据库管理器来管理数据库。
启动数据库管理器有两种方法:
(1)在VisualBasic集成环境中,单击“外接程序”菜单下的“可视化数据管理器”命令,即可打开可视化数据管理器“VisData”窗口,如图11-1所示。
(2)直接运行VisualBasic系统目录中的VisData.exe程序文件来启动可视化数据管理器。
VisData窗口由菜单栏、工具栏、工作区窗口与状态栏组成,刚启动时其工作区窗口为空。
图11.2-1 可视化数据管理器窗口
一、可视数据管理器的使用
使用开可视化数据管理器建立默认数据库――Access数据库的步骤如下:
1.单击“文件”菜单下的“新建”菜单项,将出现如图12-2所示的选择。
单击数据库类型菜单中的Access将出现版本子菜单,在版本菜单中选择要创建的数据库版本后,出现如图11-3所示的窗口。
图11.2-2“文件”菜单下的“新建”子菜单
图11.2-3创建数据库窗口
2.单击“保存”按钮后,将会出现如图11.2-4所示的窗口。
图11.2-4数据库窗口与SQL语句窗口
3.右击数据库窗口,出现如图1.2-5所示的窗口。
图11-5数据库窗口
4.单击“新建表”按钮,即可打开如图11.2-6所示窗口。
即可新建表。
图11.2-6表结构窗口
5.然后单击“添加字段”按钮,可建立各个字段的属性,最后单击“新建表”按钮,即可建立起表结构。
有了表结构后就可对表进行数据的添加、修改和删除等操作。
11.3ADO数据控件
一、编写一个简单数据库程序
首先介绍VisualBasic所提供的两个控件ADODataControl(简称ADODC)和DataGrid处理数据库程序的方法。
ADODataControl和DataGrid都属于ActiveX控件,它们在使用前需要先将其添加到工具箱中,以便在工程中使用。
单击“工程/部件”菜单项,打开“部件”对话框,选定所需要的控件并确定,即可将其添加的工具箱中,如图11.3-1所示。
图11.3-1添加ADODC与DataGrid控件到工具箱
在窗体上添加ADODC与DataGrid控件,如图11-8所示,然后右击ADODC控件,选择其快捷菜单下“ADODC属性”则打开如图11-9所示的界面。
图11.3-2窗体窗口
图11.3-3属性页窗口
在上图中,单击生成“按钮”,则打开如图11.3-4所示的数据链接属性窗口。
图11.3-4 数据链接属性窗口
在图11.3-4中选中“MicrosoftJet3.51OLEDBProvider”,单击下一步按钮,进入如图11.3-5所示的数据链接属性窗口。
【注】MicrosoftJet3.51 OLEDBProvider只能打开Access97下的数据库,不能打开Access2000与以上版本的数据库,如要打开Access2000下的数据库,则必须选用Jet4.0,否则系统会出错。
图11.3-5 数据链接属性窗口
在图11.3-5中,单击“…”按钮,选择所要打开的数据库文件后确定,即可单击“测试连接”按钮,测试是否连接成功。
如果测试连接成功,则单击“确定”按钮后,返回图11.3-2。
【注】如果数据库文件与工程文件保存在同一个文件夹下,则可把上图所示的文件xjgl.mdb前的字符删除,这样生成的程序,在复制到其它计算机上后不需重新对数据库进行连接即可运行。
通过以上步骤,我们只是完成了ADODC控件的ConnectionString属性设置,其值如下:
Provider=Microsoft.Jet.OLEDB.3.51;DataSource=e:
\xjgl\xjgl.mdb;PersistSecurityInfo=False
该属性由三个参数组成:
然后把ADODC控件的CommandType属性设置为adCmdTable,接着单击RecordSource属性,可以看到数据库xjgl.mdb下的所有数据表,单击“基本情况表”。
再选定DataGrid控件,只需把DataSource设置为ADODC控件即可,完成程序设计。
运行该程序即可对数据库xjgl.mdb下的“基本情况表”进行浏览。
然后把DataGrid控件的AllowAddNew属性设置为True、AllowDelete属性设置为True、AllowUpdate属性设置为True,再次运行该程序,即可对“基本情况表”进行添加、删除与修改数据操作,到目前为止没有书写一行代码,就已完成程序设计。
二、数据库文件与ADODC、DataGrid的关系
1.ADODC与数据库文件的关系
数据库文件是一种格式十分复杂的文件,对任何一个程序员来说,如果想自行解析文件格式进而存取数据库中的内容,都是一件十分困难的事情。
因此VB提供了ADODC控件,其功能是进行数据库文件结构分析,并且根据程序将来可能操作数据库(如:
读取、写入、新增、删除等),建立必要的操作接口(包含属性、方法和事件),然后封装成为一个控件。
对数据库程序而言,如果通过ADODC控件来存取数据,则不必了解数据库文件格式,只要通过ADODC所提供的操作接口,即可达到存取数据库的目的。
数据库程序、ADODC控件与数据库文件三者之间的关系用下图表示:
ADODC
图11.3-6 数据库文件与ADODC控件的关系
2.DataGrid与ADODC之间的关系
虽然ADODC控件具有存取数据库数据的能力,但却没有提供显示数据的功能,如果想要显示数据库的内容,除了利用ADODC来读取数据之外,还得编写显示数据的程序。
1)利用DataGrid来显示数据
要使用DataGrid来显示数据库内容必须设置好它的DataSource属性,这个属性的作用是让DataGrid控件与ADODC控件产生连接关系,也就是告诉DataGrid控件它所存取的是哪一个ADODC所打开的数据库,接着DataGrid就会自动使用ADODC的接口,将数据库的内容显示出来。
其关系如图11.3-7:
数据库程序
图11.3-7DataGrid与ADODC控件的关系
2)关键属性和参数总结
ADODC控件的属性与参数:
(1)ConnectionString(连接字符串)属性:
该属性有两个重要参数Provider和DataSource。
Provider参数:
Provider是OLEDBProvider的简称,其主要用途在于指定存取数据库所使用的OLEDB驱动程序。
如“MicrosoftJet3.51OLEDBProvider”。
DataSource(数据源)参数:
此参数通常用来指定数据库文件的完整路径和文件名。
有了此参数,ADODC控件才能打开指定的数据库文件。
(2)CommandType(命令类型)属性:
共有四个值:
adCmdTable(数据表)、adCmdText(指令)、adCmdStoredProc(存储过程)、adCmdUnknown(未定义)。
(3)RocordSoure(记录源)属性:
指定确定的表。
DataGrid控件的属性:
(1)DataSource(数据源)属性:
由于DataGrid控件并不直接存取数据库中的数据,因此必须将其属性设置成某一个ADODC控件,DataGrid控件才能具备存取数据库的能力。
(2)AllowAddNew(允许新增)属性:
若允许用户新增数据,须将此属性设置为True。
(3)AllowDelete(允许删除)属性:
若允许用户新增数据,须将此属性设置为True。
(4)AllowUpdate(允许更新)属性:
此属性的默认值为True。
三、VisualBasic中与数据库中相关的对象
就像数据库是有组织结构的一样,VB所提供的数据库对象也是有组织的,而且与数据库的组织结构有着很好的对应关系。
1.Field对象与字段
字段是数据库中最小的数据单位。
在VB所提供的对象中,与字段对应的对象是Field,我们从Field对象的以下属性可以得知字段的相关信息:
Name属性:
字段的名称
Value属性:
字段的数据
Name属性 Field对象
学号
姓名
年龄
1001
张三
18
Value属性
2.Fields集合对象与数据记录
对VB所提供的对象而言,Field对象的集合构成Fields集合对象,所以Fields集合对象可以视为与数据库记录对应的对象。
Fields对象编号:
0 1 2
学号
姓名
年龄
1001
张三
18
Fields(0) Fields
(1) Fields
(2)
共同构成Fields集合对象
由于Fields是一个集合对象,所以可以利用Count属性得知某一个Fields集合对象中的Field对象的数目,并可利用下面的方法显示集合中的Field对象的内容,如:
Fori=0tofds.Count-1 ‘fds为一个Fields集合对象
Debug.Printfds(i).Name ‘显示字段名称
Debug.Printfds(i).Value ‘显示字段数据内容
Next
3.Recordset对象与数据记录集合
VisualBasic中与数据表对应的对象称为Recordset对象,先介绍“当前数据记录”的概念。
1)由于数据库无法将整个数据表完全装入到内存中,因此便规定程序每次只能存取一条记录,此记录数据就称为“当前记录数据”。
注:
虽然程序每次只能存取当前记录数据,但并不表示数据库每次只装入一条记录数据,为了提高执行效率,数据库每次会装入一大段记录数据,但程序存取的动作还是以一条为单位。
2)利用Recordset对象改变当前记录数据的方法
程序运行后当前记录数据,将定位于第一条记录。
若要改变当前记录,程序必须调用Recoedset对象的方法改变当前数据记录,方可存取每一条数据记录,进而达到存取整个数据表的功能。
下表为Recoedset对象的几个常用方法。
方法
说明
MoveNext
将当前数据记录移到下一条
MovePrevious
将当前数据记录移到上一条
MoveFirst
将当前数据记录移到第一条
MoveLast
将当前数据记录移到末一条
EOF
当前数据记录是否在最后一条之后
BOF
当前数据记录是否在第一条之前
如图11.3-8为VisualBasic中几个对象间的关系。
11.3-8 ADODC、Recordset、Fields、Field几个对象关系图
在上图中位于下方的称为上方对象的子对象。
若要存取某一个对象,必须从最上层的父对象向下指定对象的路径。
如:
Adodc1.Recordset
Adodc1.Recordset.Fields
Adodc1.Recordset.Fields(i)
11.4Recordset对象
Recordset对象是数据记录的集合,而数据记录又是字段的集合,因此利用Recordset对象,在程序中就可以存取所有数据记录的每一个字段的数据了,所以说Recordset对象是存取数据库数据最重要的源头。
在数据库的程序设计中,Recordset对象是最为重要的对象。
一、Recordset与数据表的存取
前面介绍几个改变Recordset对象的当前数据记录的方法――MoveNext、MovePrevious、MoveFirst、MoveLast方法,通过这几个方法就可以存取整个数据表的数据。
其关系可用图11-15来表示。
MoveFirst
MovePrevious
MoveNext
MoveLast
Recordset对象 数据表
当前记录
以Recordset.Fields来存取
图11.4-1 Recordset对象与数据表之间的关系
如程序:
forI=0toAdodc1.Recordset.Fields.Count-1
Debug.PrintAdodc1.Recordset.Fields(i).Value
Next
1.避免没有当前数据记录的错误
利用MovePrevious、MoveNext移到记录指针时,应注意移过头现象发生。
所谓移过头是指:
指针位于第一天记录时,调用MovePrevious方法。
指针位于最后一条记录时,调用Monenext方法。
我们可以利用Recordset对象的EOF或BOF属性,来加以判断。
BOF与EOB属性的应用:
Adodc1.Recordset.MoveFirst
WhileNotAdodc1.Recordset.Eof
s=””
ForI=0toAdodc1.Recordset.Fields.Count-1
s=s&Adodc1.Recordset.Fields(i).Value&vbTab
Next
List1.Additems
Adodc1.Recordset.MoveNext
Wend
Adodc1.Recordset.MoveNext
WhileNotAdodc1.Recordset.Bof
s=””
ForI=0toAdodc1.Recordset.Fields.Count-1
s=s&Adodc1.Recordset.Fields(i).Value&vbTab
Next
List1.Additems
Adodc1.Recordset.MovePrevious
Wend
2. 存取字段数据的几种各数
1)Adodc1.Recordset.Fields(i).Value 如:
Adodc1.Recordset.Fields(0).Value
2)Adodc1.Recordset.Fields(字段名称).Value 如:
Adodc1.Recordset.Fields(“学号”).Value
3.省略.Value的语句 如:
Adodc1.Recordset.Fields(“股票代号”)
4.省略.Fields的语句 如:
Adodc1.Recordset(“股票代号”)
5.Recordset!
[字段名称] 字段名称不能加引号
【注】Recordset(“字段名称”)最容易书写。
二、Recordset与数据记录的增删修改
在前面我们使用DataGrid控件的AllowAdd属性和AllowDelete属性设置为True,使它具有修改、增加和删除数据的功能。
但大批数据的处理使用该方法不方便,下面介绍Recordset对象修改、增加和删除数据的方法。
1. 删除数据记录
首先要将欲删除的记录置为当前记录,然后调用Recordset.Delete方法进行删除。
如:
Adodc1.Recordset.MoveLast
Adodc1.Recordset.Delete
删除多条记录时,在Delete方法后加上DoEvents语句。
2. 修改数据记录
修改数据记录分两步走,先把数据写到缓冲区,然后再写入数据库。
数据写入可调用Recordset.Update方法和使用Move…方法。
其具体过程如下:
方法一:
Adodc1.Recordset(“字段名称1”)=字段新值
Adodc1.Recordset(“字段名称2”)=字段新值
…
Adodc1.Recordset.Update
方法二:
Adodc1.Recordset(“字段名称1”)=字段新值
Adodc1.Recordset(“字段名称2”)=字段新值
…
Adodc1.Recordset.MoveNext
CancelUpdate方法:
取消更新的数据
除了调用Update方法或改变当前数据记录的位置来使要更新的数据立即写入到数据库中之外,Recordset对象也允许在修改数据记录之后,数据尚未写入数据库之前,将更新的数据撤消,让表中的数据恢复原状,此时调用的方法是CancelUpdate方法。
3. 新增数据记录
新增数据记录是先建立一个缓冲区,并将此缓冲区设置为当前记录,然后就可以像修改记录的数据一样,修改当前记录的内容。
最后,如果确定要新增该条记录数据,就调用Update方法或移动当前数据记录将数据写入到数据库中;如果要取消新增的记录数据的操作,就调用CancelUpdate方法,其新增记录数据的语句大致如下:
Adodc1.Recordset.AddNew
Adodc1.Recordser(“字段名称1”)=“新的字段值1”
Adodc1.Recordser(“字段名称2”)=“新的字段值2”
…
Adodc1.Recordset.Update或Adodc1.Recordset.CancelUpdate
三、Recordset与数据记录的检索
1.检索数据记录的方法
1)Find方法
格式:
Recordset.FindCriteria,SkipRows,SearchDirection,Start
参数1:
Criteria:
检索记录数据的表达式。
如:
“语文>85”。
该参数的变化相当多,稍后进一步说明。
参数2:
SkipRows:
跳过几条记录开始检索。
可省略,若省略其默认值为0,表示从第一条记录开始。
参数3:
SearchDirection:
检索的方向。
可以是adSearchForward或adSearchBackward,可以省略,若省略表示向下检索。
参数4:
Start:
开始检索的位置。
可省略,若省略表示从当前数据记录开始检索。
2)检索结果与当前记录
如果调用Find方法后找到符合要求的记录数据,则当前记录将移至被找到的记录,否则当前记录数据变成不存在。
可利用Recordset对象的BOF、EOF属性进行判断。
2. 检索数据记录的表达式
在Find方法的参数中,变化最多的是Criteria参数,在此作进一步的讨论。
1)表达式的基本格式
“字段名称 比较运算符 比较的数据”
2)表达式的字段名称
表达式=字段名称 比较符号 比较的数据
(1)表达式中的“字段名称”必须是数据表中已存在的字段名称。
(2)如果字段名称中含有空格字符,则字段名称前后必须加[