当前位置:文档之家› VB和数据库

VB和数据库

VB和数据库
VB和数据库

VB和数据库

11.1 数据库(DateBase)的基本概念

一、概念与术语

目前几乎所有的应用程序都需要存放大量的数据,这些大量数据一般都需要经过数据收集、分析后,整理成一定的组织结构,通过数据库管理系统来进行管理。数据库管理系统提供了数据在数据库内存放方式的管理能力,使程序设计人员在使用数据库时不需要考虑数据的具体操作及数据之间的关系。

数据库是一组排列成易于处理和读取的相关信息的集合。数据库按其模型结构可分为层次数据库、网状数据库和关系数据库。其中关系数据库的理论发展最为完备,因此到目前为止关系数据库的应用最为广泛。

Visual Basic默认的数据库为微软的Access数据库,可在Visual Basic中利用数据库管理器直接创建,数据库文件的扩展名为.MDB。除此之外,Visual Basic还可以处理各种外部数据库,如dBASE、FoxPro、Paradox、Btrieve、Microsoft Excel、Lotus1-2-3、Text等格式的数据库,甚至其它非关系的数据库,VB在调用这些数据时,都会自动将其转换为关系型的数据库来操作。

1.数据表(Table)

数据表是一组相关联的按行与列排列的逻辑数据的集合,简称为表。在数据库理论中常用来表示一个实体,每个数据表必须有一个表名,一个数据库一般由多个数据表组成,各个数据表之间一般应存在某种关系。

2.字段(Field)

数据表中的每一列称为一个字段。数据表是由其包含的所有字段构成的,每个字段用来描述它包含的数据。在创建数据表时,必须为每个字段起一个名称一般称为字段名,同时需要为每个字段分配一个数据类型、最大长度和其它属性。

3.记录(Record)

数据表中的每一行称为一条记录。记录是字段值的集合,所有用户对数据的访问对象是记录,因此,如果想对某个数据项进行访问,必须首先进行记录定位,严格的说,在一个数据表中不允许存在两条完全相同的记录。

4.关键字(Keyword)

如果数据表中某个字段值或若干个字段值的集合能唯一确定一条记录,则称该字段或字段的集合为该数据表的关键字。在一个数据表中,关键字可能存在多个,但需选定其中一个作为主关键字。对于数据表中的每条记录来说,主关键字的值必须唯一。

5.索引(Index)

为了提高访问数据库的速度,大多数数据库都使用索引。索引即对数据表中的某个或几个字段的值按某种特定的顺序进行排列。在VB中利用索引可以加快数据检索速度。

6.结构化查询语言(SQL)

SQL(Structure Query Language)是结构化查询语言的缩写,是数据库中通用的数据查询编程语言,它是我们访问数据库的一种利器。在Visual Basic 中访问数据库时,就可以利用SQL同数据库进行通讯。

二、数据库的设计

数据库的设计一般需要借助E- R图进行数据建模,然后把整个E-R图中的每个实体和有关的联系,都转化为关系。对每个关系再进行规范化,最后给出各个数据表完成数据库的逻辑设计,对每个关系来说,在选定的数据库管理系统下,创建数据库、数据表以及它们之间的关系,并输入数据进行测试,完成数据库的物理设计。具体内容请读者参考相关的数据库理论方面的书籍。

11.2 Visual Basic的可视数据管理器

Visual Basic 所支持的不同类型的数据库大都可以通过相应的数据库管理系统来建立,如在MS Access中可以建立.MDB的数据库。也可以使用Visual Basic下的数据库管理器来管理数据库。

启动数据库管理器有两种方法:

(1)在Visual Basic集成环境中,单击“外接程序”菜单下的“可视化数据管理器”命令,即可打开可视化数据管理器“VisData”窗口,如图11-1所示。

(2)直接运行Visual Basic系统目录中的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.3 ADO数据控件

一、编写一个简单数据库程序

首先介绍Visual Basic所提供的两个控件ADO Data Control(简称ADODC)和DataGrid处理数据库程序的方法。ADO Data Control和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中选中“Microsoft Jet 3.51 OLE DB Provider”,单击下一步按钮,进入如图11.3-5所示的数据链接属性窗口。

【注】Microsoft Jet 3.51OLE DB Provider只能打开Access97下的数据库,不能打开Access2000及以上版本的数据库,如要打开Access2000下的数据库,则必须选用Jet 4.0,否则系统会出错。

图11.3-5 数据链接属性窗口

在图11.3-5中,单击“…”按钮,选择所要打开的数据库文件后确定,即可单击“测试连接”按钮,测试是否连接成功。如果测试连接成功,则单击“确定”按钮后,返回图11.3-2。

【注】如果数据库文件与工程文件保存在同一个文件夹下,则可把上图所示的文件xjgl.mdb前的字符删除,这样生成的程序,在复制到其它计算机上后不需重新对数据库进行连接即可运行。

通过以上步骤,我们只是完成了ADODC控件的ConnectionString属性设置,其值如下:

Provider=Microsoft.Jet.OLEDB.3.51;Data Source=e:\xjgl\xjgl.mdb;Persist Security Info=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-7 DataGrid 与ADODC 控件的关系 2)关键属性和参数总结

ADODC 控件的属性及参数:

(1)ConnectionString(连接字符串)属性:该属性有两个重要参数Provider 和Data Source 。

Provider 参数:Provider 是OLE DB Provider 的简称,其主要用途在于指定存取数据库所使用的OLE DB 驱动程序。如“Microsoft Jet 3.51 OLE DB Provider”。

Data Source (数据源)参数:此参数通常用来指定数据库文件的完整路径和文件名。有了此参数,ADODC 控件才能打开指定的数据库文件。

(2)CommandType(命令类型)属性:共有四个值:adCmdTable(数据表)、adCmdText (指令)、adCmdStoredProc (存储过程)、adCmdUnknown (未定义)。

(3)RocordSoure(记录源)属性:指定确定的表。 DataGrid 控件的属性:

(1)DataSource(数据源)属性:由于DataGrid 控件并不直接存取数据库中的数据,因此必须将其属性设置成某一个ADODC 控件,DataGrid 控件才能具备存取数据库的能力。

(2)AllowAddNew(允许新增)属性:若允许用户新增数据,须将此属性设置为True 。 (3)AllowDelete(允许删除)属性:若允许用户新增数据,须将此属性设置为True 。 (4)AllowUpdate(允许更新)属性:此属性的默认值为True 。 三、Visual Basic 中与数据库中相关的对象

就像数据库是有组织结构的一样,VB 所提供的数据库对象也是有组织的,而且与数据库的组织结构有着很好的对应关系。

1.Field 对象与字段

字段是数据库中最小的数据单位。在VB 所提供的对象中,与字段对应的对象是Field ,我们从Field 对象的以下属性可以得知字段的相关信息:

Name 属性:字段的名称 Value 属性:字段的数据

Name 属性 Field 对象

Value 属性

2.Fields 集合对象与数据记录

对VB 所提供的对象而言,Field 对象的集合构成Fields 集合对象,所以Fields 集合对象可以视为与数据库记录对应的对象。

Fields 对象编号:0 1 2

Fields(0) Fields(1) Fields(2) 共同构成Fields 集合对象

由于Fields 是一个集合对象,所以可以利用Count 属性得知某一个Fields 集合对象中的Field 对象的数目,并可利用下面的方法显示集合中的Field 对象的内容,如:

For i=0 to fds.Count-1 …fds 为一个Fields 集合对象 Debug.Print fds(i).Name …显示字段名称

学号 姓名 年龄

1001 张三

18 学号 姓名 年龄 1001 张三

18

Debug.Print fds(i).Value …显示字段数据内容

Next

3.Recordset对象与数据记录集合

Visual Basic中与数据表对应的对象称为Recordset对象,先介绍“当前数据记录”的概念。

1)由于数据库无法将整个数据表完全装入到内存中,因此便规定程序每次只能存取一条记录,此记录数据就称为“当前记录数据”。

注:虽然程序每次只能存取当前记录数据,但并不表示数据库每次只装入一条记录数据,为了提高执行效率,数据库每次会装入一大段记录数据,但程序存取的动作还是以一条为单位。

2)利用Recordset对象改变当前记录数据的方法

程序运行后当前记录数据,将定位于第一条记录。若要改变当前记录,程序必须调用Recoedset对象的方法改变当前数据记录,方可存取每一条数据记录,进而达到存取整个数据表的功能。下表为Recoedset对象的几个常用方法。

方法说明

MoveNext 将当前数据记录移到下一条

MovePrevious 将当前数据记录移到上一条

MoveFirst 将当前数据记录移到第一条

MoveLast 将当前数据记录移到末一条

EOF 当前数据记录是否在最后一条之后

BOF 当前数据记录是否在第一条之前

如图11.3-8为Visual Basic中几个对象间的关系。

11.3-8 ADODC、Recordset、Fields、Field几个对象关系图

在上图中位于下方的称为上方对象的子对象。若要存取某一个对象,必须从最上层的父对象向下指定对象的路径。如:Adodc1.Recordset

Adodc1.Recordset.Fields

Adodc1.Recordset.Fields(i)

11.4 Recordset对象

Recordset 对象是数据记录的集合,而数据记录又是字段的集合,因此利用Recordset对象,在程序中就可以存取所有数据记录的每一个字段的数据了,所以说Recordset对象是存取数据库数据最重要的源头。在数据库的程序设计中,Recordset对象是最为重要的对象。

一、Recordset与数据表的存取

前面介绍几个改变Recordset对象的当前数据记录的方法――MoveNext、MovePrevious、MoveFirst、MoveLast 方法,通过这几个方法就可以存取整个数据表的数据。其关系可用图11-15来表示。

MoveFirst

MovePrevious

MoveNext

MoveLast

Recordset对象数据表

当前记录

以Recordset.Fields

来存取

图11.4-1 Recordset 对象与数据表之间的关系 如程序:

for I=0 to Adodc1.Recordset.Fields.Count-1

Debug.Print Adodc1.Recordset.Fields(i).Value Next

1.避免没有当前数据记录的错误

利用MovePrevious 、MoveNext 移到记录指针时,应注意移过头现象发生。所谓移过头是指: 指针位于第一天记录时,调用MovePrevious 方法。 指针位于最后一条记录时,调用Monenext 方法。

我们可以利用Recordset 对象的EOF 或BOF 属性,来加以判断。 BOF 及EOB 属性的应用: Adodc1.Recordset.MoveFirst While Not Adodc1.Recordset.Eof s=””

For I=0 to Adodc1.Recordset.Fields.Count-1

s=s & Adodc1.Recordset.Fields(i).Value & vbTab Next

List1.Additem s

Adodc1.Recordset.MoveNext Wend

Adodc1.Recordset.MoveNext While Not Adodc1.Recordset.Bof s=””

For I=0 to Adodc1.Recordset.Fields.Count-1

s=s & Adodc1.Recordset.Fields(i).Value & vbTab Next

List1.Additem s

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.Find Criteria,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)如果字段名称中含有空格字符,则字段名称前后必须加[ ]。

3)表达式之“比较的数据”

表达式=字段名称比较符号比较的数据

(1)比较的数据是常量

比较的数据按数据类型可分为“数值”、“日期时间”和“字符串”三种类型。

数据类型表达式

数值“语文>85”

字符串“姓名=…张三?”

日期数据“出生日期>#1975/7/1#”

(2)比较的数据是变量

设v为数值:“字段名称比较符号>” & v

v为日期数据:“字段名称比较符号#” & v & “#”

v为字符串:“字段名称比较符号…” & v “?”

4)表达式之“比较符号”

表达式=字段名称比较符号比较的数据

VB程序中的比较符号包含=、<>、>、<、>=、<=均可用于记录数据的比较。此外,Like比符号也可用于比较表达式中。其格式:

字段名称Like 比较的字符串

该表达式用于字符串数据的“近似”(Like)比较,其中“比较的字符串”部分可以包含“%”、“*”或“_”(下划线)通配符。如:

“姓名Like…张%?”

11.5 Data-Aware(数据识别)控件

前面介绍了两种存取数据的方法:使用Recordset对象和DataGrid控件。经过比较容易发现DataGrid控件比Recordset对象简便得多。。

像DataGrid 控件一样具有自动显示和更新数据功能的控件,称为Data-Aware(数据识别)控件(简称数据识别控件)。在Visual Basic中,除了DataGrid控件外,数据识别还有Label、TextBox、CheckBox、ListBox、ComboBox、Image、PictureBox、MonthView、DTPicker、DataList、DataCombo等控件。如能充分运用,就可在数据库程序的设计中游刃有余了。

一、数据识别控件的基本概念

数据识别控件分为两类:表格式和单栏式。

表格式指DataGrid控件。

单栏式是指每次只能存取当前数据记录的某个字段的数据。单栏式控件必须设置两个属性:DataSource属性设置为ADODC控件的名称和DataField(数据字段)属性设置为某一个字段名。

二、数据识别控件的选择

数据识别控件适应的数据字段

Label 只读的文本字段

TextBox 一般性文字字段,包含文本。数值…

CheckBox Boolean字段,如“是否”、“真假”等

ComboBox、ListBox 列表式的字段

Image、PictureBox 图片字段

DTPicker、MonthView 日期类型字段

三、举例-DTPicker控件的使用

单击“工程/ 部件”打开部件对话框,选定Microsoft ADO Data Control6.0(OLEDB)和Microsoft Windows Common Controls-2 6.0,把ADODC和DTPicker控件添加到工具箱,布置窗体如图11-11所示,把ADODC控件连接到xjgl.mdb下的“基本情况表”,把Text1-Text5依次学号、姓名、性别、成分和籍贯字段进行绑定,DTPicker 控件与出生日期字段进行绑定,运行该程序并单击DTPicker 控件即出现图11-16界面,即可对出生日期字段的值进行修改。

图11.5-1 DTPicker控件的使用

11.6 结构化查询语言(SQL)

一、SQL简介

1.SQL概念

SQL(Structured Query Language,结构化查询语言)是要求数据库操作其数据的语句,它是专门为数据库设计出来的语言,比一般的程序语言简单。SQL语言主要分成两部分:DDL(Data Definition)和DML(Data Manipulation Language)。其中DDL是建立数据表和字段的语句集,而DML则是操作记录数据的语句集。

2.SQL基本格式

Select…From…

Select 学号,姓名,籍贯From 基本情况

3.利用VB下达Select语句

CommandType属性:1-adCmdText

RecordSource(记录源)属性:Select 学号,姓名,籍贯From 基本情况表

使用SQL显示xjgl.mdb下“基本情况表”的步骤:

1)添加Microsoft ADO Data Control6.0(OLEDB)和Microsoft DataGrid Control6.0

(OLEDB)到窗体,将ADODC连接到数据库xjgl.mdb。

2)设置ADODC控件的RecordSource属性,如图11.6-1所示。单击确定按钮。

3)将DataGrid控件的DataSource属性设置为ADODC控件。

运行程序,即可得到如图11.6-2所示的结果。

图11.6-1 SQL的使用

图11.6-2 SQL运行结果

二、Select语法简介

1.基本语法一:Select字段列表From 数据表

1)字段列表的变化一

(1)“*”语法

如果字段列表涵盖数据表中的所有字段,则可用“*”代表。如:

select * from 基本情况

(2)as语法

字段列表还可以是别名。如:字段名1 as 别名1,字段名2 as 别名2

2)字段列表的变化二

除了字段名可以成为Select语句的字段列表外,用字段名称组合出的表达式,也可成为字段列表成员。如:select 学号,姓名,语文,英语,数学,语文+英语+数学as 总分from 成绩

3)字段列表的变化三

在Select中只要是符合VB规则的表达式都可以用来定义新字段。如:

select right(学号,2) as 编号,姓名,数学from 成绩

2.基本语法二:select…from…where筛选表达式

如果只想筛选出部分数据,就可增加Where表达式。

1)筛选表达式的变化

筛选表达式中可使用=、>、<、<>、>=、<=等运算符,也可使用and、or、not逻辑运算符和Like近似比较运算符。

(1)字符串的近似(Like)选取

select * from 成绩where 姓名like …王%?

(2)%与_的区别

2)其它的where筛选表达式

除使用以上运算符外,还可使用以下一些运算符:

(1)where 字段名称between 值1 and 值2

where 字段名称not between 值1 and 值2

(2)where 字段名称in(值1,值2,…)集合运算

(3)where 字段名称is Null与where 字段名称is not Null

如果某一笔记录的某一字段并未输入任何数据,那么该字段就为Null字段。上面的筛选表达式可以挑出某一字段为Null或非Null的记录数据。

3)VB函数的使用

其实VB函数也可用于where筛选表达式,如:

select * from 成绩单where mid(姓名,2,1)=…小?

3.基本语法三:select…from…order by 字段列表

1)单字段排序

Order By子句主要对最终输出结果进行排序,这有助于数据的浏览与查阅。如:

Select * from 成绩order by 语文

2)多字段排序

如:Select * from 成绩order by 语文,英语,数学

3)排序方式

asc(默认)升序deac降序

4)select top:限定选取数据记录的条数

如:select * from 成绩order by 语文+英语+数学desc

select top 10 * from 成绩order by 语文+英语+数学desc `取前十条

select top 10 percent * from 成绩order by 语文+英语+数学`desc 取百分比

三、动态执行Select语句的技巧

前面已经介绍利用Recordset 对象的Find方法进行数据的查找。对SQL而言,“where 筛选表达式”中的“筛选表达式”,与Find方法的“搜寻数据的表达式”在功能上十分类似。但Find方法对数据进行逐条比较,数据量较大时,效率很低。因此,可先用SQL语句筛选符号条件的记录,然后再进行Find方法查找。

1.动态执行Select语句的技巧

要想动态执行某一Select语句,程序必须如下:

https://www.doczj.com/doc/e612802728.html,mandType=adCmdText

Adodc1.RecordSource=Select语句

Adodc1.Refresh

2.动态组合SQL语句的注意事项

字符型数据:select * from 数据表where 字段名称=?” & Text1.Text & “?”

日期型数据:select * from 数据表where 字段名称= ” & Text1.Text & “ ”

数值型数据:select * from 数据表where 字段名称=” & Text1.Text

3.Where筛选表达式与Find表达式的差异

1.Where筛选表达式可使用逻辑运算符and、or、not,Find表达式不能使用逻辑运算符。

2.Where筛选表达式中的Between…And和Is Null/Is Not Null均无法在Find中使用。

3.Where筛选表达式中可以使用VB函数,而Find表达式中是不能使用的。

11.7 ADO(Active Data Objects)对象模型

我们前面一直使用ADODC和其它数据识别控件来设计数据库程序。为了打好数据库基础,Visual Basic数据库最核心的对象群--Active Data Objects(简称ADO)就是我们必须要掌握的,如图11-19。

Connection

Recordset

Command

Errors

Fields

Field

Parameters

Parameter

Error

图11.7-1 ADO对象结构图

一、ADO的首次使用

对比图11.3-8中可以看出ADO比 ADODC控件复杂一点,实际上它们的概念是一致的。在ADO对象结构图中可以发现一个熟悉的名字—Recordset,它与我们前面使用的Recordset(ADODC的属性)是相同的对象。

先看一个ADO打开数据库的例子:

Dim conn As New ADODB.Connection

Dim rs As New ADODB.Recordset

Private Sub Form_Load()

Dim ConnStr As String

ConnStr = "Provider=Microsoft.Jet.OLEDB.3.51;" & _

"Data Source=f:\xjgl\xjgl.mdb"

conn.Open ConnStr

rs.CursorLocation = adUseClient

rs.Open "基本情况表", conn, adOpenKeyset, adLockPessimistic

End Sub

Private Sub Command1_Click() ' 显示Recordset 的所有记录数据

Dim S As String, i As Integer

rs.MoveFirst

List1.Clear

While Not rs.EOF

S=""

For i = 0 To rs.Fields.Count - 1

S=S & rs.Fields(i).Value & vbTab

Next

List1.AddItem S

rs.MoveNext

Wend

End Sub

在以上程序中,使用了MoveFirst、EOF、MoveNext方法和Fields子对象,使用这些方法和Fields子对象的对象不再是Adodc1.Recordset对象,而是rs对象。

1.打开数据库(表)

我们再看一下上面打开数据库的语句:

ConnStr = "Provider=Microsoft.Jet.OLEDB.3.51;" & _

"Data Source=e:\xjgl\xjgl.mdb"

conn.Open ConnStr

rs.CursorLocation = adUseClient

rs.Open "基本情况表",conn,adOpenKeyset,adLockPessimistic

其主要由三部分组成:

Provider参数:用来指定OLE DB驱动程序。

DataSource参数:用来指定数据库的来源,它与Provider参数合起来构成“连接字符串”。

股票行情表:出现在rs.Open方法的参数,用来指定想要打开的数据表。

结论:通过比较我们发现前面两个例子打开数据库的方法几乎是一样的,ADODC控件仍调用ADO所提供的方法来打开数据库(表)。

2.使用ADO对象之前

在使用ADO对象之前,必须先利用VB菜单的“工程/引用”来引用“Microsoft Active Data Objects 2.0 Library”,如图11-20所示,然后ADO对象群中Connection、Recordset、Command、Fields等对象才会成为可以引用的对象。否则,类似下面的语句:

dim conn as new ADODB.Connection

dim rs as New ADODB.Recordset

都会产生“用户定义类型未定义”的错误,因为“Connection”和“Recordset”都是定义在“Microsoft Active Data Objects 2.0 Library”中的。如果没有事先将其引用的话,VB将无法辨识它们。

图11.7-2 Microsoft Active Data Objects 2.0 Library的引用

3.使用ADO的基本概念

从以上例子中我们可以看到,使用ADODC比使用ADO要简单得多,但使用ADO比使用ADODC专业的多。

“对象类别”的引用及表示法:

语句格式:dim rs as ADODB.Recordset

其中,rs称为“对象变量”,Recordset称为“对象类别名称”,ADODB则称为“对象类别模块”,整个语句被解释为“建立一个Recordset类别的对象变量、而Recordset对象类型是来自ADODB对象类别模块的”。

注意:ADODB正是“Microsoft Active Data Objects 2.0 Library”在程序设计中的简称。

二、Connection对象:操作数据库的源头

ADO对象群以Connection对象为源头,通过Connection对象才可以打开其下面的Recordset及Command 对象,进而对数据库进行操作。

1.Connection对象的建立及打开

1)Connection对象的建立

要使用某一对象时,必须经过“定义”和“建立”两个步骤。即:

Dim conn as ADODB.Connection …定义一个Connection类别的对象变量

Set conn=New ADODB.Connection …建立对象,并指定给conn对象变量

也可合二为一:

Dim conn as New ADODB.Connection

2)Connection对象的打开

以上语句只是建立了Connection对象,还无法使用。要想使用Connection对象,就必须指定OLE DB Provider 和Data Source两个参数,然后再调用Open方法。如:

Connstr=“Provider=Microsoft.Jet.OLEDB3.51;” & “Data Source=f:\xjgl\xjgl.mdb”

Conn.Open Connstr

2.数据表的打开与Connection对象

打开数据表可用以下语句

Dim conn as New ADODB.Connection

Connstr=“Provider=Microsoft.Jet.OLEDB3.51;” & “Data Source= f:\xjgl\xjgl.mdb”

Conn.Open Connstr

Rs.CursorLocation=adUseClient

Rs.Open “基本情况”,conn,adOpenKeyset,adLockPessim istic

3.Connection对象的关闭及释放

当程序不再使用数据库时,可以调用Connection对象的Close方法将其关闭。

1)Connection对象的关闭

Dim conn as New ADODB.Connection

Connstr=“Provider=Microsoft.Jet.OLEDB3.51;” & “Data Source= f:\xjgl\xjgl.mdb”

Conn.Open Connstr

Rs.CursorLocation=adUseClient

Rs.Open “基本情况”,conn,adOpenKeyset,adLockPessimistic

conn.Close

2.Connection对象的归还

Connection对象一经关闭,Connection对象和Recordset对象就不可使用,但Connection对象仍然存在,还会占有一定的系统资源,如果想完全释放,则必须调用以下语句:

Set conn=Nothing

总结:从Connection对象的建立、打开数据库、打开数据表、关闭数据库到归还Connection对象所占有的系统资源,其完整过程如下:

…步骤一:建立Connection对象

dim conn as New ADODB.Connection

…步骤二:打开数据库

conn.Open ConnStr

…步骤三:打开数据表

Rs.CursorLocation=adUseClient

Rs.Open “基本情况”,conn,adOpenKeyset,adLockPessimistic

…步骤四:关闭数据库

conn.Close

…步骤五:归还Connection对象所占用的系统资源

Set conn=Nothing

一般会省略第四步和第五步,因为程序关闭时,该程序所打开的数据库会自动关闭,而Connection对象所占用的系统资源也会自动释放给系统。

三、Command对象与SQL语句的执行

Command对象也是ADO对象群的一员。Command对象主要是专门用来执行SQL语句的。

我们先来回忆一下前面介绍的SQL语句的执行过程:

…使用ADODC

Adodc1.RecordSource=SQL语句

https://www.doczj.com/doc/e612802728.html,mandType=adCmdText

Adodc1.Refresh

…使用Recordset.Open方法执行SQL语句

rs.Open SQL语句,conn,adopenDynamic,adLockOptimistic

显然,上面两种方法都没有使用Command对象,但一样执行SQL语句。

1.Command对象执行SQL语句

Dim conn As New ADODB.Connection

Dim cmd As New https://www.doczj.com/doc/e612802728.html,mand

Dim rs As New ADODB.Recordset

Set cmd.ActiveConnection = conn

SQL = "Select * From 基本情况表Where 姓名Like '李%'"

https://www.doczj.com/doc/e612802728.html,mandText = SQL

Set rs = cmd.Execute

做一个对比:SQL语句

Recordset对象rs.Open SQL,conn Connection对象

Command对象Set Cmd.ActiveConnection=conn

https://www.doczj.com/doc/e612802728.html,mandText=SQL Connection对象

Set rs=Cmd.Execute SQL语句

通过以上比较发现,两种方法其实是同样的。

2.带参数的SQL语句

其实Command对象最大的妙用在于执行“带参数的SQL语句”。如:

Select * from 成绩where 语文between [low] and [high]

between 60 and 90

3.执行带参数的SQL语句

如何执行带参数的SQL语句?如下:

Set cmd.ActiveConnection = conn

SQL="Select * From 成绩表Where 语文Between [low] And [high]"

https://www.doczj.com/doc/e612802728.html,mandText = SQL

Dim param(1) ' 定义两个含有两个元素的数组阵列

param(0) = Val(Text1.Text)

param(1) = Val(Text2.Text)

Set rs = cmd.Execute(, param)

以上cmd.Execute语句多了两个参数,其意义如下:

参数1:返回数据记录的条数,若省略,就表示返回所有的数据记录。

参数2:用来指定SQL语句的参数值,应该传人一个一维数组。如上例。

带有参数的SQL语句的变形:

Select * From 成绩Where 语文Between [low] And [high]

Select * From 成绩Where 语文Between ?And ?

11.8 数据环境与报表设计器

通过前面的学习,我们了解到存取数据库的首要任务,是建立Recordset对象,然而建立Recordset对象的方法有许多变化,变化之多,常令初学者不知所措,而Data Envionment的主要功能就是把这些让人眼花缭乱的内容集成在一起,一方面提供给用户容易操作的可视化环境,另一方面也提供给数据库程序一致的界面。

一、Data Envionment使用

1.Data Envionment的添加与设置

利用Data Environment打开xjgl.mdb的“基本情况表”,那么操作过程如下:

1)选取Visual Basic菜单的“工程/更多ActiveX设计器”,再单击“Data Environment”,添加一个Data Environment 到工程中,此时Data Environment所显示的窗口如图11.8-1。Data Environment默认名称为DataEnvironment1,已包含一个连接对象Connection1。

2)在Connection1对象上单击鼠标右键,选择其快捷菜单下的“属性”命令,接下来会出现“数据连接属性”对话框,然后选取“Provider”选项卡下的“Microsoft Jet 3.51 OLE DB Provider”,在“连接”选项卡中选“xjgl.mdb”,当设置完成后,单击“确定”按钮返回到Data Environment窗口中。(此设置过程与ADODC控件的设计界面是相同的)。

3) 在Connection1对象上单击鼠标右键,选择其快捷菜单下的“添加命令”命令,如图11.8-2所示,在Connection1下面会添加一个Command对象,其默认名称为Command1。

4)在Command1对象上单击鼠标右键,选择其快捷菜单下的“属性”命令,接着会出现“Command1属性”对话框,在“通用”选项卡中选取“数据库对象”下拉列表中的“表”选项,在“对象名称” 下拉列表中的“基本情况表”,如图11.8-3所示。

图11.8-1 Data Environment窗口

图11.8-2 添加命令窗口

相关主题
文本预览
相关文档 最新文档