04 VB数据库编程.docx

上传人:b****5 文档编号:29894167 上传时间:2023-08-03 格式:DOCX 页数:16 大小:155.82KB
下载 相关 举报
04 VB数据库编程.docx_第1页
第1页 / 共16页
04 VB数据库编程.docx_第2页
第2页 / 共16页
04 VB数据库编程.docx_第3页
第3页 / 共16页
04 VB数据库编程.docx_第4页
第4页 / 共16页
04 VB数据库编程.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

04 VB数据库编程.docx

《04 VB数据库编程.docx》由会员分享,可在线阅读,更多相关《04 VB数据库编程.docx(16页珍藏版)》请在冰豆网上搜索。

04 VB数据库编程.docx

04VB数据库编程

VB数据库编程

   数据库管理是计算机最为广泛的应用之一,数据库设计是程序设计的一大领域。

所以相应的数据库编程软件非常多,要说那一种好我不敢妄加评论,但我要告诉你VB是数据库应用程序开发的一个非常容易上手,功能强大的工具。

你不必有编程经验,只要你想学,你的机器里又有VB5就够了。

本文以一个简单的“通讯录”为例,向初学者介绍一下VB在数据库编程方面简单易学的特点和它强大的功能。

数据库概念

几个概念

数据库:

是由若干个二维数据文件组成的集合。

它按照一定的法规对数据文件进行重新组织,以便使数据具有最大的独立性,并实现对数据的共享。

数据文件:

也称库文件是具有相同性质记录的组合。

是一个二维关系表,例如课程表,你的存折等。

注意文件中的记录必需是同格式,同长度的。

记录:

是描述一个数据的集合,由若干的字段组成相当于表的一行。

字段:

是用来描述某一实体的属性,相当于表中的一列。

好,搞清楚上面几个概念是我们开始用VB来做点什麽的时候了。

我们要做的是建立一个"个人通讯录",我们目标先做到可以用人名找到朋友的联系电话。

然后补充完善它。

请按步骤跟我来做,相关的概念会随时介绍给您。

第一步:

建立数据库文件

1、打开你的VB选择建立标准EXE文件。

进入图一所示面画面。

2、选择菜单“外接程序”单击“可视化数据管理器”就会出现Visdata窗口。

选择visdata窗口的菜单“文件”选择“新建”在新建级连菜单中选“microsoftAccess版本7.0.”这时会弹出一个对话框,是要你把你的数据库文件的存盘路径输入(建议路径c:

\data\通讯录.mdb)。

完成上述操作你会看到如下图二所示窗口。

注意:

左边的是数据库窗口,它用来显示数据库的结构,包含属性、数据列表、查询项目等。

右边的是SQL语句列表,在这个窗口我们可以输入一些SQL命令,针对数据库现有的数据列表进行查询操作。

SQL定义:

SQL(SequntialQueryLanguage)结构化查询语言,使用户能从各个不同的角度去对多个数据库进行查询,并能将查询结果直接输出至用户指定的设备上(如屏幕、磁盘文件、打印机等)。

这时我们看到在数据库窗口除了本身属性表外,什麽都没有。

好让我们给它加一个数据表。

在数据库窗口单击鼠标右键出现快捷菜单,单击新表命令即可出现如图三所示表结构对话框。

表名称:

数据表的名称,本例我们用main作为表名称。

添加字段:

单击添加字段按钮出现添加字段对话框如图四所示:

在添加字段对话框添入字段的名称(表头)、类型(支持的类型有(Boolean)逻辑型、(Byte)字节型、(integer)整型、(long)长整型、(Currency)货币型、(single)单精度型、(Double)双精度型、(Date/Time)日期/时间型、(Text)文本型、(LongBinary)长二进制型、(Memo)记忆型几种、大小(字段的长度,注意汉字占两个字节)如下表:

名称

类型

大小

拼音缩写

text

5

姓名

text

10

性别

text

2

电话

text

18

年龄

integer

2

生日

date/time

8

输入完成后单击关闭返回“添加字段对话框”。

如果还想加入字段只需再单击“添加字段”,如果要删除某些以建立的字段,可以单击该字段的名称,再单击“删除字段”按钮即可。

如何修改字段呢?

方法是先删除再重新建立即可。

关于索引我们将在以后讨论,请单击“生成表”按钮。

返回数据库窗口,这时我们看到在数据库窗口多出了一个表文件“main”。

下面我们要把图五所示记录添加到数据表文件main中。

完成后单击关闭。

返回数据库窗口。

这时我们的第一个数据表就已经建好了。

下面我们将学习使用VB数据库窗体设计器创建数据窗体,并把它添加到当前的VB工程中,以达到可以浏览、修改和查询数据的功能。

第一章初识DAO

什么是DAO?

DAO就是DatabaseAccessObject,数据库访问对象的英文缩写。

在VB中提供了两种与Jet数据库引擎接口的方法:

Data控件和数据访问对象(DAO)。

Data控件只给出有限的不需编程而能访问现存数据库的功能,而DAO模型则是全面控制数据库的完整编程接口。

Data控件将常用的DAO功能封装在其中,它与DAO控件的关系就好象内存与CACHE之间的关系一样,所以这两种方法并不是互斥的,实际上,它们常同时使用。

DAO模型是设计关系数据库系统结构的对象类的集合。

它们提供了完成管理一个关系型数据库系统所需的全部操作的属性和方法,这其中包括创建数据库,定义表、字段和索引,建立表间的关系,定位和查询数据库等。

VisualBasic中的数据库编程就是创建数据访问对象,这些数据访问对象对应于被访问物理数据库的不同部分,如数据库、表、字段和索引等,同时用这些对象的属性和方法来实现对数据库的操作,以便在VisualBasic窗体中使用绑定和非绑定控件来显示操作结果并接收用户输入。

VisualBasic通过DAO和Jet引擎可以识别三类数据库:

■VisualBasic数据库

也就是*.MDB数据库

■外部数据库

它们是使用几种流行格式的“索引顺序访问方法(ISAM)”数据库,这些流行格式包括Btrieve、dBASEIII、dBASEIV、MicrosoftFoxProversions2.0和2.5以及Paradoxversions3.x和4.0。

在VisualBasic中能够创建和操作所有以上格式的数据库。

也可以访问文本文件数据库和MicrosoftExcel或Lotus1-2-3电子表格。

■ODBC数据库

包括符合ODBC标准的客户/服务器数据库,如MicrosoftSQLServer。

要在VisualBasic中创建真正的客户/服务器应用程序,可以使用ODBCDirect直接把命令传递给服务器处理。

也就是说VisualBasic还支持其它不使用Jet数据库引擎的数据访问方法。

数据访问对象的ODBCDirect模式允许使用同样的对象模型和语法绕过Jet引擎直接访问ODBC数据。

由上面的叙述可知,对于编程人员来讲,你只须了解DAO的使用,对具体的数据库系统无须做深入的探讨,就可对几乎任何一种数据库进行操作,“以不便应万变”,而对数据库文件自身的物理操作,将由相应的数据库引擎把数据访问对象上的这些操作转换为对数据库文件自身的物理操作,这些引擎来处理所有与各种数据库的接口。

 

第二章DAO的结构

上一章我们知道了DAO是什么,它可以干什么,以及简单的了解了它是如何实现这一功能,这一章我们讲逐步学习DAO的结构。

在将讲这一章之前,首先讲两个题外话:

面向对象编程

大家对面向对象编程一定不陌生,但究竟什么是面向对象编程,很多人一下子也说不出个所以然来;在VB的DAO中又是如何体现面向对象的呢,恐怕即便是使用了一段VB的网友也很难说清。

这也难怪,VB本身并不是个完全的面向对象的编程环境,它的很多如动态数组等就不是面向对象的,但在DAO中是完全的面向对象的。

其实面向对象的最初思想就是将数据和操作封装在一起,形成对象,而在DAO中正是体现了这一点,它将数据的值作为属性,数据的查询作为方法,数据值的变化作为事件,完全封装在DAO对象中,希望诸位盟友在使用中注意,逐步领悟面向对象的编程方法。

数据库前端开发系统和后台系统

经常由朋友说他会DELPHI,会PB,实际上用前端和后台的概念来看,他们都只是会一种前端开发工具而已,严格说起来并不能算会数据库的开发。

人们往往只看到前台应用的功能而忽视了后台系统的应用,或者认为这两者根本就是一回事。

前端后台概念用在单机上,就是VB与Access,用在网络中就是VB与SQLSever,只会VB或DELPHI是不能称为掌握数据库编程的,而且在编程中,要善于利用后台数据库提供功能,这样的程序运行起来更快,程序更精练。

题外话讲完,现在切入正题。

DAO的结构如图所示:

 

以上是DAO整体结构图,下面将分章节逐步讲述每个对象的使用

第三章使用Recordset对象

 

这一章讲解Recordset对象的使用,之所以将其作为第一个作为讲解,是因为最常用的就是这个对象,使用好这个对象,VB大部分的数据库编程功能就掌握了。

本章内容包括:

Recordset对象的创建

一、Recordset对象的创建

在DAO对象一览图中我们可以看到Recordset对象是Database对象的子对象,那么在建立Recordset对象之前需要先建立Databsse对象,这就如同在C++中要先建立父类才能建立子类一样,这里有些读者可能会问,在Database对象上还有两层对象不需要建立吗?

在VB的数据库编程,DBEngine对象是最顶级的数据库访问对象,有点象JAVA中的超类概念,是不需要建立,其他DAO对象都是对它的继承,至于Workspace对象,VB中缺省建立了一个,如果不设计到多个数据库环境的话(例如:

在程序中同时使用ODBC和Jet),是不需要关心的。

在解决了这个问题我们还需要

 

将Jet3.5动态链接库加入工程中才能定义Recordset对象,步骤如下:

1、选中“工程”菜单的“引用”,出现如下图所示的窗口

选中画圈的部分即引用了Jet3.5的库,如果你的程序要求兼容Jet2.5的数据库则选中下图画圈部分

 

 

在做好这几步之后就可以在程序中创建Recordset对象了。

2、创建Recordset对象变量

1)首先,必须声明一个Recordset类型的变量,然后将变量设置为OpenRecordset方法返回的对象。

2)OpenRecordset方法在Database、Connection、TableDef、QueryDef以及已经存在的Recordset对象中使用。

    Connection和Database对象的OpenRecordset方法的语法如下:

Setvariable=database.OpenRecordset(source[,type[,options,[lockedits]]])

其它所有类型的对象的OpenRecordset方法的语法如下:

Setvariable=object.OpenRecordset([type[,options[,lockedits]])

其中:

variable参数是新的Recordset对象的名称。

      database参数是一个打开的Database或者Connection对象的名称,可用该对象创建新的Recordset对象。

object参数是一个TableDef、QueryDef或者现有的Recordset对象,我们用该对象创建新的Recordset对象。

source参数指定新的Recordset对象的记录来源。

source的值将成为新产生的Recordset对象的Name属性的值。

用Connection或者Database对象创建新的Recordset对象时,source参数可以是数据库中现有的TableDef或QueryDef对象,或者为一个有效的、返回行的SQL查询或语句。

如果用TableDef、QueryDef或者现有的Recordset对象创建新的Recordset对象,那么对象自身将为新的记录集提供数据源。

3)type、options和lockedits参数

type参数可选表

可选参数

dbOpenDynaset

dbOpenSnapshot

dbOpenForwardOnly

dbOpenDynamic

dbOpenTable

参数说明

Recordset对象表类型

Recordset对象快照类型

Recordset对象仅向前类型

Recordset对象动态类型

Recordset对象动态集类型

options参数可选表

可选参数

dbAppendOnly

dbReadOnly

dbSeeChanges

dbDenyWrite

dbDenyRead

参数说明

只能新增

只读

编辑锁定

禁止其它用户写

禁止其它用户读

备注

仅对动态集

仅对MicrosoftJet工作区

仅用于动态集类型的记录集

仅用于Recordset对象

仅用于表类型的记录集

可选参数

dbForwardOnly

dbSQLPassThrough

dbConsistent

dbInconsistent

 

参数说明

仅向前快照

source是SQL

一致更新

不一致更新

 

备注

仅用于MicrosoftJet数据源

仅用于快照

仅用于动态集类型和快照类型

仅用于动态集类型和快照类型

 

lockedits参数可选表

可以使用lockedits参数控制对记录集的锁定。

可用以下常数。

 

常数

描述

dbReadOnly

禁止用户对记录集进行修改

DbPessimistic

在多用户环境中,使用保守式锁定来决定修改记录集的方式

DbOptimisticValue

使用基于行值而非行IDs的优化并发。

仅用于ODBCDirect数据源

4)Recordset对象的类型

Recordset对象有五种类型:

表、动态集、快照、动态和仅向前

表类型的Recordset对象是指当前数据库中的本地表或者MicrosoftJet创建的外部数据库。

在创建表类型的记录集时,数据库引擎打开实际表,后续的数据操作都是直接对基本表进行的。

只能对单个的表打开表类型的记录集,而不能对联接或者联合查询打开。

如果使用基本表创建的索引,就可以对表类型的Recordset对象进行索引。

与其它类型的Recordset对象相比,表类型的搜索与排序速度最快。

定位特定的记录时,Seek方法要快于Find方法。

动态集类型的Recordset对象可以是本地的或者链接的表,也可以是返回的行查询结果。

它实际上是对一个或者几个表中的记录的一系列引用。

可用动态集从多个表中提取和更新数据,其中包括链接其它数据库中的表。

动态集类型具有一种与众不同的特点:

不同数据库的可更新联接。

利用这种特性,可以对不同类型的数据库中的表进行可更新的联接查询。

动态集和它的基本表可以互相更新。

如果动态集中的记录发生改变,同样的变化也将在基本表中反映出来。

在打开动态集的时候,如果其他的用户修改了基本表,那么动态集中也将反映出被修改过的记录。

动态集类型是最灵活的recordset类型,也是功能最强的。

不过,它的搜索速度与其它操作的速度不及表类型的Recordset。

快照类型的Recordset对象包含的数据是固定的,它反映了在产生快照的一瞬间数据库的状态。

从MicrosoftJet数据源得到的快照是不可更新的,从开放数据库互连(ODBC)数据源得到的某些快照是可以更新的,这取决于后端数据库的能力。

与动态集类型和表类型的Recordset对象相比,快照的处理开销较少。

因此,它执行查询和返回数据的速度更快,特别是在使用ODBC数据源时。

需要注意的是,对于.mdb文件,在快照中用指针表示Memo和LongBinary字段中的数据。

仅向前类型的Recordset对象,有时被称为“向前滚动快照”或者“仅向前快照”,提供了快照的一部分功能。

它提供了最基本的Recordset对象功能,但是通常可以达到最快的速度。

与快照类似,从MicrosoftJet得到的仅向前类型的Recordset对象是不可更新的。

另外,仅向前的快照只允许在记录中向前移动,而不能向相反的方向移动。

这种类型的Recordset对象不能被复制,而且只支持Move和MoveNext方法。

动态类型的Recordset对象是从一个或几个基本表中查询到的结果集,对于返回行的查询,可以在其中添加、修改或删除记录。

另外,其它用户对基本表的添加、删除和修改操作也将出现在您的记录集中。

这种类型对应于ODBC的动态游标。

5)缺省的记录集类型

DAO能够根据记录集的数据源类型,以及打开记录集的方式,自动地设置缺省的记录集类型。

因此,一般不需要指定记录集类型。

然而,可以在OpenRecordset方法中指定type参数,以取消缺省的类型。

按照打开记录集的方式,下表中列出了可用的类型和缺省的类型。

■   使用Database对象的OpenRecordset方法:

   SetrstNew=dbs.OpenRecordset("DataSource")

   

   如果DataSource为数据库中的本地表,那么可以用表类型、动态集、快照和动态类型的Recordset对象,缺省的记录集类型为表类型。

如果DataSource为其它类型,那么只能使用动态集和快照类型的Recordset对象,动态集类型为缺省的类型。

■   使用TableDef对象的OpenRecordset方法。

   SetrstNew=tdfTableData.OpenRecordset

   

   如果tdfTableData指的是MicrosoftJet数据库(.mdb)中的表,或者直接打开的ISAM数据库,那么所有的五种类型都是可用的,表类型的记录集为缺省的类型。

如果tdfTableData在ODBC数据库中,或者是外部数据库中的链接表,那么只能用动态集和快照类型的Recordset对象,动态集类型为缺省类型。

■   使用QueryDef对象的OpenRecordset方法:

   SetrstNew=qdfQueryData.OpenRecordset

   

   只能使用动态集和快照类型的Recordset对象,动态集类型为缺省的类型。

■   使用现有的Recordset对象的OpenRecordset方法:

   SetrstNew=rstExisting.OpenRecordset

   

   只能使用动态集和快照类型的Recordset对象。

缺省的类型为现有的记录集的类型,在上例中,即rstExisting的类型。

6)具体创建Recordset对象的例子

在下面的例子中可能用到一些还未讲到的东西,但由于使用的比较简单,相信大家还是能够理解。

①以表为基础创建记录集

用基本表创建Recordset对象的方法,取决于该表对于当前数据库是本地表,还是位于另一个数据库中的链接表。

   

用本地MicrosoftJet数据库中的表创建记录集

下列程序代码使用OpenRecordset方法为一个表创建了表类型的Recordset对象:

DimdbsAsDatabase,rstCustomersAsRecordset

Setdbs=OpenDatabase("Northwind.mdb")

SetrstCustomers=dbs.OpenRecordset("Customers")

   

请注意,创建表类型的记录集时无需使用dbOpenTable常数。

如果省略了type常数,DAO将根据数据源和用来创建记录集的对象的类型,选择最适当的Recordset对象类型。

当从本地表打开记录集时,可以使用表类型的记录集,DAO将使用它。

②用其它数据库格式的链接表创建记录集

下列程序段为链接的Paradox3.x表创建了一个动态集类型的Recordset对象。

当从非MicrosoftJet数据库中的链接表打开记录集时,表类型是不能使用的,因此,DAO的使用效率仅次于它的动态集类型。

DimdbsAsDatabase

DimtdfNonJetLinkedAsTableDef

DimrstTableDataAsRecordset

'打开数据库并创建TableDef。

Setdbs=OpenDatabase("Northwind.mdb")

SettdfNonJetLinked=dbs.CreateTableDef("PDXAuthor")

'连接到名为Author的Paradox表,该表位于数据库

'C:

\PDX\Publish。

tdfNonJetLinked.Connect=_

   "Paradox3.X;DATABASE=C:

\PDX\Publish"

tdfNonJetLinked.SourceTableName="Author"

'链接该表。

dbs.TableDefs.AppendtdfNonJetLinked

'为该表创建动态集类型的记录集。

SetrstTableData=tdfNonJetLinked.OpenRecordset()

   

如果先打开Paradox数据库,则可直接打开Paradox表。

③以查询为基础创建记录集

也可以基于存储的选择查询来创建Recordset对象。

在下例中,“CurrentProductList”是保存在当前数据库中的一个选择查询。

DimdbsAsDatabase,rstProductsAsRecordset

Setdbs=OpenDatabase("Northwind.mdb")

SetrstProducts=dbs.OpenRecordset_

   ("CurrentProductList")

   

如果当前并不存在存储的选择查询,OpenRecordset方法允许使用SQL字符串代替查询名。

上例可以改写为以下程序段:

DimdbsAsDatabase,rstProductsAsRecordset

DimstrQuerySQLAsString

Setdbs=OpenDatabase("Northwind.mdb")

strQuerySQL="SELECT*FROMProducts"_

   &"WHEREDiscontinued=No"_

   &"ORDERBYProductName;"

SetrstProducts=dbs.OpenRecordset(strQuerySQL)

   

这种方法的缺点在于,每次运行时都需要先编译查询字符串,而存储的查询只是在首次保存时编译一次,所以性能较佳。

注意如果在MicrosoftJet中用SQL字符串或者存储的查询创建Recordset对象,那么,在查询返回了记录集的第一行以后,程序才会继续运行。

在查询运行的时候,最好在状态栏中显示出适当的消息。

如果使用ODBCDirect,可以指定dbRunAsync,它使查询在后台执行,应用程序能够继续执行其它语句。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1