Visual-Basic程序设计课件第9章 数据库管理_第1页
Visual-Basic程序设计课件第9章 数据库管理_第2页
Visual-Basic程序设计课件第9章 数据库管理_第3页
Visual-Basic程序设计课件第9章 数据库管理_第4页
Visual-Basic程序设计课件第9章 数据库管理_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章数据库管理.VisualBasic在数据库应用程序的开发方面提供了包含数据管理器、数据控件和数据访问对象等功能强大的工具,可协助编程人员轻松地连接数据库文件,快捷、简便地实现对数据库的访问和操作。在VisualBasic6.0的集成开发环境中,用户可以用各种集成的可视化数据库工具以及数据环境设计器管理和操作各种数据库(包括像Oracle、SQLServer这样的大型数据库),并且能够创建出各种可重用的数据访问查询,以及在报表设计器中通过拖动方式轻松地创建出优秀的报表。9.1数据库管理基本知识

在实际应用中,我们常常需要借助数据库管理系统(DBMS,DataBaseManagementSystem)管理大量的数据。VisualBasic提供强有力的数据库管理功能,可在单机或网络上生成并访问数据库。VisualBasic6.0将数据库技术与面向对象的编程技术结合在一起,并加入了可任意与数据绑定的ActiveX技术,使编程人员能够很轻松地开发出使用方便、易于掌握的应用程序,从而在很大程度上减轻了编程工作量,更有效地管理信息。VisualBasic建立的数据库格式默认MSAccess应用程序的MDB数据库格式,不仅具有数据库引挚,还能处理其它数据库格式(如dBASE、Foxbase、FoxPro、Paradox等),针对其中的数据进行访问操作。此外,VisualBasic也可以通过ODBC(开放式数据库连接,OpenDataBaseConnectivity)以客户/服务器方式来连接SQLServer等关系型数据库管理系统。9.1.1数据库的体系结构

数据库是特定主题或目的相关的数据集合。该集合进一步组成表,用大家熟悉的记录(行)和字段(列)格式表示特定主题的信息。数据库通常由数据库管理系统(DBMS)来建立和管理。例如,FoxPro、Paradox等都是数据库管理系统。数据库无论大小,都是由数据按照一定的结构组织起来。数据库的组织称为结构,包括表、字段名、字段数据类型、字段大小(宽度)和索引等。数据库的结构必须在数据存入数据库前定义。一个满足用户需求的数据库,其结构必须仔细地设计。表含有所有数据,表中的每个字段有特定的数据类型;记录存储特定的人、事件和事物的所有信息(如一个学生的学籍信息)。在表中,所有的记录含有相同的字段,表由相同类型的记录集合组成。在表中,特定数据值存放在字段(列)和记录(行)的交叉点。例如,学生“张萍”的出生年月存放在“张萍”记录的“出生年月”字段中,可以通过查找记录来查看该字段是否有相应的数据值。数据库中的数据可根据不同项目进行分类管理。以学籍表为例,学生的数据按顺序分类成学号、姓名、性别、出生年月等字段,如表9-1所示。除此之外,还可以对每个学生的成绩数据、奖惩情况、家庭情况等再建立多个表,形成一个彼此关联的表群组。所谓的数据库,就是由这些表群组的成员组成。因此,不仅数据库中的数据可视需要随时更新,数据库中所包含的表成员也可视需要进行增减。学号姓名性别出生年月D001王涛男1982/5/4D002李冰女1982/1/3D003张红女1980/9/17D004郑洁女1980/10/15D005袁明男1981/2/10D006张萍女1980/11/2D007张骏男1980/12/23D008罗娟女1981/5/249.1.2数据库管理的概念

本节简单介绍数据库管理中常用到的术语。1.数据库和表目前使用的大部分数据库都是关系型数据库(RelationalDatabase)。一个关系型数据库通过若干个表(Table)来存储数据,并且通过关系(Relational)将这些表联系在一起。表以二维表格形式来表示。表是由行和列组成的数据集合,表中一行为一个记录(Record),一列为记录中的一个字段(Field)。例如,表9-1中所示的学籍表中,学号、姓名、性别、出生年月等都是字段,每个学生的字段数据构成了该学生的一条记录。可以将表看成是一种用户自定义类型,表中的每一条记录是一个这种用户自定义类型的变量,字段是这种用户自定义类型的各个分量。例如,若将表9-1称为“学籍表”,该表可以看作是以下用户自定义类型:

Type学籍表学号AsString姓名AsString性别AsString

出生年月AsDataEndType

其中,“学号”、“姓名”、“性别”和“出生年月”是组成用户自定义类型“学籍表”的四个变量,正好与表中的四个字段对应。表中的所有记录相当于一组被声明为用户自定义类型“学籍表”的变量。2.记录和字段在表9-1中,每一行数据构成了学籍表中的一条记录,记录是数据库管理中操作的基本数据。每一列数据构成了学籍表中的一个字段,每个字段都有相应的字段名、数据类型、数据宽度等结构描述信息。3.索引(Index)为了快速查询数据,数据库中一般都使用索引。索引是以某个字段作为关键字进行排序,对数据库中的数据进行组织。在某些条件下查询数据库时,使用索引可以显著提高查询的速度。4.关系在数据库中,将表中可用来唯一标识记录的字段称为主关键字。主关键字指定的字段中,不能出现相同的值。例如,在表9-1的“学籍表”中,“学号”字段可唯一地标识不同的学籍记录,因而可指定为该“学籍表”的主关键字。主关键字不仅可以是一个字段,也可以是多个字段。一般情况下,数据库中表与表之间的关系是指某个表的主关键字和另一个表的主关键字之间的对应关系。5.查询(Query)由数据库中按照关系组合而成的具有实际使用意义的表,称为查询。查询不是数据库中存储的表,而是按照各种规则和要求“查”出来的表。查询可通过SQL(StructuredQueryLanguage,结构化查询语言)创建。SQL是一种标准的查询语言,几乎所有的关系数据库系统都支持这种语言。各种关系型数据库中的SQL语言有所不同,但最基本的语句和使用方法是一样的。存储在数据库中的查询,称为视图(View)。存储在客户/服务器数据库中的、用SQL语句编写的程序段,称为存储过程(StoredProcedure)。

SQL语言的主要功能由八个动词来表达,用户只需要写出做什么,就可以得到查询的结果。(1)数据查询功能。SQL中用动词Select实现查询。查询是SQL语言的核心,SQL的查询操作可以从一个或多个表中找出满足条件的元组。用Select可以实现数据库的选择、投影和连接等操作。例如,用以下Select语句可从数据库中列出满足查询条件的指定字段值:

Select<字段列表>From<表列表>WHERE<查询条件>

该语句可从<表列表>所指定的表中取出<字段列表>指定的字段,并通过<查询条件>进行筛选,只有满足条件的记录才可被选出,从而创建了一个查询。(2)数据定义功能。SQL的数据定义功能包括定义数据库、定义基本表、定义视图、定义索引等。SQL的数据定义可用相应的动词实现,如Create等。(3)数据更新功能。SQL中用动词Insert、Delete、Update实现数据更新。(4)数据控制功能。SQL中用动词Grant、Revote实现数据控制。由于不同的数据库管理系统在实现SQL语言时各有差别,并且一般都做了某种的扩充。因此,用户在使用时应参阅系统提供的有关手册。6.Recordset(记录集)对象应用程序开始运行后,VisualBasic根据数据控件的设置打开所选取的数据库,同时建立Database对象和Recordset对象。该对象在窗体的Form_Load()事件开始执行前已自动产生。简单地说,Recordset对象的作用是在程序中代表数据库中的表(Table)。因此,在对数据控件连接的表进行“新增”、“修改”、“删除”、“查询”操作时,实际上是以Recordset对象所属的AddNew、Edit、Delete和Seek等方法来处理。7、关系型数据库的种类通常使用的关系型数据库可分为两类:文件数据库(如Access、FoxPro、Paradox等)和客户/服务器数据库(如SQLServer、Oracle、Sybase等)。客户/服务器数据库是最典型的分布应用结构。客户/服务器应用程序分为两部分,一部分位于客户机,负责向用户提供信息以及和用户进行交互;另一部分位于服务器,负责进行具体的计算和数据库的操作。在客户/服务器数据库中,对数据的处理和操作都是通过存储过程(StoredProcedure)来完成的。存储过程是用SQL语句编写的程序段,就像VisualBasic中的函数或子程序。用户可以通过编写存储过程在服务器端完成诸如修改数据、添加数据、删除数据和查询等工作。在使用中,只要通过位于客户端的应用程序调用这些存储过程,就可以在服务端完成相应的操作。由于存储过程经过预编译和优化,因而具有很高的效率。客户/服务器数据库的特点决定了其适用于大型、分布式、多用户的数据库系统。文件数据库也可以放在服务器上供多个用户使用,由于文件数据库只能提供存取数据的功能,数据库文件中被申请的所有数据都会被传送到客户机,在客户机中进行查询操作,而查询出来的数据量一般只占所传送数据的一小部分,从而增加了网络流量,降低了应用程序的性能。此外,对文件数据库进行添加、删除、修改等操作都要在客户端通过查询来完成。例如,若需要修改数据库中的某个数据,只能将表中的所有数据都传送到客户端,经过修改后再将整个表送回到服务器端的数据库中。因此,文件数据库适用于小型的、单机的数据库系统。进行数据库开发时,应先根据各种数据库的特点和具体情况选择一种合适的数据库类型。9.1.3VisualBasic数据库应用程序的组成

1.用户界面用户界面包括用于与用户交互的所有界面和代码,如对数据库记录进行添加、修改、删除、查询的VisualBasic代码,完成查询和数据更新的窗体等。用户界面不对数据库进行实际的操作,而是请求数据库服务的数据访问对象和方法。2.数据库引擎数据库引擎是一组动态连接库(DLL),主要任务是解释应用程序的请求并形成对数据仓库的物理操作,管理对数据库的物理操作,维护数据库的完整性和安全性,处理结构化查询语言SQL的查询操作,实现对数据库的检索、添加、删改,管理查询返回的结果等。应用程序运行时,这些功能通过将动态连接库连接到VisualBasic程序中来实现。3.数据仓库数据仓库是存放数据的地方,由若干个表文件组成。数据仓库只包含数据,而对数据的计算、检索、排序等操作都由数据库引擎来完成。可见,数据库引擎是VisualBasic应用程序与数据库之间的桥梁,应用程序通过数据库引擎来完成对数据库文件的存取操作。9.1.4用户与数据库引擎的接口

VisualBasic6.0中提供了生成并访问数据库的大量部件,包括数据控件(DataControl)、数据访问对象(DAO,DataAccessObjects)和ActiveX数据对象(ADO,ActiveXDataObjects),可以用这些工具作为与数据库引挚的接口。1.数据控件(DataControl)用数据控件可以不经过编程而访问数据库。根据需要设置好数据控件的属性后,即可通过诸如文本框之类的控件与数据控件绑定,从而实现对数据库中各个记录的访问。但是,数据控件的功能有限,若要完成复杂的功能,还是需要编程来解决。2.数据访问对象(DAO)数据访问对象(DAO)是由MicrosoftJet数据库引擎定义的对象,是通过程序访问数据库的对象结构。可以用数据访问对象(如Database、TableDef、Recordset对象)表示在代码中用来组织和操作数据的对象。

DAO模型采用与关系型数据库逻辑结构相同的类的结构,对应于数据库的不同部分,存在相应的数据访问对象(如Database、TableDef、Field和Index对象),因而具有较高的效率。DAO模型向用户提供创建数据库、定义表和字段、建立和维护索引、建立表间的关系、进行结构化查询等工具在内的一系列操作的属性和方法。DAO不仅简化了代码,而且使数据库的底层结构更加透明,编程人员可以用同样的对象、属性和方法来处理各种不同数据库格式,从而具有更多的灵活性。3.ActiveX数据对象(ADO)

ADO是VisualBasic6.0为数据访问提供的全新技术。ADO是一种建立在最新数据访问接口OLEDB之上的高性能的、统一的数据访问对象,通过它可以访问文件数据库、客户/服务器数据库甚至非关系型数据库。ADO提供了更高的性能、更小的系统开销、更简单的模型以及更灵活的操作。因此,ADO已经成为VisualBasic中最主要的数据访问对象。

注意:为了与VisualBasic早期的版本兼容,使得VisualBasic早期版本创建的数据库工程能够被VisualBasic6.0打开,原有的数据访问对象还可以在VisualBasic6.0中继续使用。9.1.5VisualBasic6.0可以访问的数据库类型

VisualBasic6.0通过数据库引擎可以识别以下三类数据库:1.VisualBasic数据库

VisualBasic数据库文件使用与MicrosoftAccess相同的格式,又称内部数据库或本地数据库。由于可用Jet引擎直接创建和操作这些数据库,可以提供最大程度的灵活性和速度。2.外部数据库在VisualBasic6.0中,能够创建和操作所有“索引顺序访问方法(ISAM)”数据库,如dBASE、FoxPro、Btrieve、Paradox等,还可以访问电子表格软件MSExcel或Lotus123、文本文件数据库等。3.ODBC数据库

VisualBasic可以访问ODBC标准的客户/服务器数据库,如MSSQLServer等。利用VisualBasic提供的ODBCDirect模式,可以把命令直接传递给服务器处理,以创建真正的客户/服务器数据库管理程序。9.1.6创建Access2003数据库

[例9-1]创建一个订单管理的Access2003数据库。

[分析]

要实现在VB6中操作数据库,必须先规划和建立数据库。虽然VB6.0内置了一个微型的数据库设计器,一般在实际中比较少用,这里以常用的桌面小型数据库Access2003为例,建立一个简单的订单管理数据库db1.mdb,学习在MicrosoftAccess2003中创建数据库的操作方法。该数据库将作为本章后续范例的数据库。

[规划表结构]

建立数据库前,对需要保存的信息进行分析,然后对表结构进行规划。根据一般订单需要保存的数据,规划表结构如表9-2、表9-3和表9-4所示。其中,表示该字段为主关键。表9-2订单表字段名订单编号产品编号客户编号数量单价下单日期送货日期经手人类型(长度)文本(20)文本(20)文本(20)整数数值

(2位小数)日期日期文本(20)表9-3产品表字段名产品编号产品名称单位规格类型(长度)文本(20)文本(50)文本(10)文本(20)表9-4客户信息表字段名客户编号姓名性别生日联系电话公司地址类型(长度)文本(20)文本(50)是/否日期文本(20)文本(100)[建立表结构]

在Access中创建表结构的基本步骤如下:(1)启动Access2003。(2)在菜单栏上选择“文件→新建”选项,在“新建文件”任务窗格中选择“空数据库…”选项(见图9-1),弹出“文件新建数据库”对话框,如图9-2所示。图9-1“新建文件”任务窗格(3)选择保存数据库的位置和文件名,本例保存为C:\db1.mdb,如图9-2所示。图9-2“文件新建数据库”对话框(4)单击“创建”按钮,打开表设计器,用表设计器创建“订单表”,如图9-3所示。双击打开表设计器表设计器图9-3打开表设计器(5)设置“订单编号”为主关键字,保存为“订单表”,如图9-4所示。建立好的订单表,双击打开进行数据录入图9-4保存“订单表”(6)按以上步骤依次建立“产品表”和“客户信息表”,如图9-5和图9-6所示,完成数据库的创建。图9-5产品表

图9-6客户信息表9.2SQL语言基础

数据库查询语言(SQL)是关系数据库的标准语言,被很多类型的数据库所支持。本节介绍最常用的操作数据库的SQL语句,如数据查询、删除、添加和更新的实现等。其中四个最常用的SQL语句是本章使用ASP.NET数据控件的基础,即Select、Insert、delete和Update。更多的细节请参阅有关书籍。9.2.1查询记录的Select语句

Select语句的一般格式:Select<字段列表>Form<表名>[Where条件]

功能:Select语句功能非常丰富,可以按任意条件从一个表或多个表中查询满足条件的数据,其语法也比较复杂。[例9-2]查询“订单表”中所有的数据。命令:Select*From订单表说明:“*”号代表表中所有的字段,也可以按例9-3的方式列出每一个选择的字段。[例9-3]以“订单编号”为查询条件,在“订单表”中列出满足条件的记录。命令:Select订单编号,产品编号,客户编号,数量,下单日期,送货日期From订单表Where订单编号="A1000"

说明:Select关键字后面需要列出的字段以逗号分隔;由于“订单编号”字段为字符串类型,具体的值需要用双引号作为定界符。如果将该SQL语句保存到字符串变量中,需要将双引号改为单引号,如下所示:

DimsqlAsStringsql="Select订单编号,产品编号,客户编号,数量,下单日期,送货日期From订单表Where订单编号='A1000'"[例9-4]查询“订单表”中数量>10或下单日期在2007-05-9与2007-09-09之间的订单。命令:Select*From订单表Where数量>10OR(下订日期<=#2007-09-09#And下订日期>=#2007-09-09#)

说明:条件Where关键字后面,如果字段类型为数字,则值不需要加任何定界符;如果是日期类型,其值必须带#定界符。可以用逻辑运算符(And、Or和Not)连接多个条件。以上三个例子是分别以文本类型、数值类型和日期类型字段作为条件,使用SQL命令查询数据所用的语法。可以在Access中对以上SQL语句的正确性进行验证,检查SQL语句是否正确,以及能否按照我们的条件得到所需要的结果。方法如下:(1)在Access中打开[例9-1]中建立的数据库,选择“查询”对象,如图9-7所示。2134双击添加[订单表]图9-7打开数据库,选择查询对象(2)进入SQL命令的查询设计模式,如图9-8所示。添加的表选择SQL视图以便测试SQL命令图9-8进入SQL命令查询设计模式(3)输入SQL命令并执行命令,如图9-9所示。

[例9-5]统计表的记录数。命令:SelectCount(*)as记录数From订单表说明:在SQL语句中,可以使用内部函数对记录进行统计。Count函数作用是得到表中的记录总数。

[例9-6]

统计“订单表”中订单编号="A1000"And客户编号="K1"的订货总数量。命令:

SelectSum(数量)as订货量

From订单表

Where订单编号="A1000"and客户编号="K1"

说明:本例用到Count()和Sum()函数,以及其他函数,如Max()、Min()等。[例9-7]在“客户信息表”中查询姓“张”的客户信息(姓名以张开头)。命令:Select*From客户信息表where姓名Like"李*"

说明:Like关键字用于模糊匹配,“*”代替任意多个字符;“?”代表任意一个字符。

Select还有更多、更灵活的使用方式,可以满足几乎任何对表数据的查询要求(读者可参考其他相关资料)。1.输入SQL命令2执行SQL命令3执行SQL命令结果4回到设计视图图9-9输入并执行SQL命令9.2.2添加记录的Insert语句

Insert语句的一般格式:Insert

Into

表名(字段列表)Values(值列表)

功能:向表中添加一条新记录。[例9-8]向订单表添加一条新记录。命令:

InsertInto订单表(订单编号,客户编号,产品编号,数量,单价,下订日期,送货日期)Values("A2000","K1","C100",12,12.89,#2007-09-07#,#2007-12-30#)

注意:值列表的位置和个数类型应与字段列表一一对应。文本字段类型和日期字段类型对应的常数值需要使用定界符。9.2.3删除记录的Delete语句

Delete语句的一般格式:Delete*From<表名>[Where条件][例9-9]删除“订单表”中订单编号为A2000的记录。命令:Delete*From订单表Where订单编号="A2000"说明:如果没有Where子句,则删除整个[订单表]数据。9.2.4更新记录的Update语句

Update语句的一般格式:Update<表名>Set<字段名=新字段值,[字段名=新字段值,>[Where条件][例9-10]修改“订单表”,将订单编号为“A1000”的“数量”改为20。命令:Update订单表Set数量=20Where订单编号="A1000"

说明:如果没有Where子句,则所有记录的“数量”字段值都将修改为20。9.3使用ADODC控件实现数据库操作

9.3.1ADODC控件简介在VB6的工具箱中的Data控件,只能连接Access2000及以下版本的数据库。因此,本节使用外部控件ADODC控件连接Access2003数据库,并使用外部表格控件显示数据库中表的数据。ADO是VisualBasic6.0为数据访问提供的全新技术。ADO是一种建立在最新数据访问接口OLEDB之上高性能的、统一的数据访问对象,通过它可以访问文件数据库、客户/服务器数据库甚至非关系型数据库。ADO提供了更高的性能、更小的系统开销、更简单的模型以及更灵活的操作。因此,ADO已经成为VisualBasic中最主要的数据访问对象。ADODC控件是将部分ADO对象及方法包装起来,提供更加简捷的方式进行数据库的访问。1.添加ADODC控件要使用ADODC控件连接数据库并选择数据,必须添加ADODC控件到设计环境;要将ADODC控件选择的数据显示出来,可以使用标准控件中的文本框、列表框等数据控件,也可以使用外部的表格控件,如DataGrid。图9-10是在工具箱中添加这两个控件,并添加到窗体上的操作步骤。2.使用Adodc控件和DataGrid控件显示数据库中某个表数据的一般步骤(1)设置Adodc控件连接字符串属性,选择连接字符串,并选择指定的数据库文件(2)设置Adodc控件的记录源属性,按不同命令方式选择表中的数据(3)设置DataGrid数据源为Adodc3.Adodc主要属性(1)ConnectionString属性:连接字符串。连接字符串相当于数据库的驱动程序,不同类型的数据库有对应的连接字符串。一般Access数据库连接字符串的格式如下:

Provider=Microsoft.Jet.OLEDB.4.0;DataSource=指定的mdb数据库位置

Provider部分为数据库提供者;DataSource部分为指定的数据库位置(2)CommandType属性:命令类型。可以选择AdCmdText(使用SQL命令)、AdCmdTable(使用表名称)和AdCmdStoredProc(使用数据库中已经建立的存储过程)。如果CommandType属性的值等于adCmdUnknown(默认值),系统的性能将会降低。原因是ADO必须调用提供者,以确定CommandText属性是SQL语句还是存储过程或表格名称。第二步第一步图9-10控件添加(3)RecordSource属性:记录源。如果CommandType属性值为AdCmdText,则该属性为SQL命令文本;如果CommandType属性值为AdCmdTable,则该属性为具体表名称。4.DataGrid主要属性(1)DataSource属性:数据来源。指明表格显示的数据来源。(2)AllowaddNew属性:是否容许添加数据(3)AllowDelete属性:是否容许删除数据(4)AllowUpdate属性:是否容许修改数据9.3.2ADODC控件的应用

[例9-11]根据[例9-1]的内容规划和建立的“订单管理”数据库db1.mdb,在窗体上用ADODC控件和数据表格控件DataGrid显示“订单表”的数据。

[分析]

首先必须通过ADODC控件选择数据来源,即连接数据库;选择需要操作的数据库对象,即具体的表。每个ADODC控件当前只能操作一张表数据,ADODC控件没有显示数据功能,若要显示数据,需要借助数据显示控件,如文本框、列表框、表格控件等,本例选择DataGrid表格控件。[建立工程]

创建工程,将ADODC控件和DataGrid控件添加到当前工具箱,然后添加到窗体,采用默认名称,分别为Adodc1和DataGrid1。设置Adodc1的Caption属性为:订单表,界面布局如图9-11所示。图9-11界面布局

图9-12ADODC属性[属性设置]1.用鼠标右击Adodc1控件,在弹出的快捷菜单中选择“ADODC属性”,如图9-12所示。在属性页中选择“通用”选项卡,选择“连接资源”为“使用连接字符串”,单击“生成(U)…”按钮,如图9-13所示。图9-13ADODC控件属性页2.在“数据链接属性”对话框(见图9-14)中选择Access数据库连接字符串:MicrosoftJet4.0OLEDBProvider,单击“下一步”按钮。图9-14数据链接属性3.在“连接”选项卡(见图9-15)中选择数据库所在位置;单击“测试连接”按钮,测试是否连接成功。确定后,将在“属性页”的“通用”选项卡中(见图9-16)看到自动生成了连接字符串。选择数据库实际所在的位置测试是否连接成功图9-15选择数据库及测试连接图9-16生成连接字符串以上过程仅指定了连接不同类型数据库使用的连接字符串,如果要显示某个表的数据,必须指定具体的表。在“属性页”对话框中选择“记录源”选项卡,按照图9-17所示进行选择,在当前数据库中准备选择具体操作的表。最后,将DataGrid1表格控件的DataSource属性设置为Adodc1,以便显示Adodc1中选择的数据:[运行结果]完成以上操作后,按F5运行程序(不用写一行代码),即可以看到图9-18所示的运行结果。在表格控件中可以直接修改数据、删除数据和插入新记录,数据自动完成更新操作。1.选择命令类型为:2-adCmdTable2.选择表名称:订单表图9-17选择记录源图9-18运行结果[总结与提高]本例在[属性设置]中设置了ADODC控件的几个属性,其中,图9-13~9-16所示操作设置了Adodc的ConnetionString属性,可以在属性窗口中看到该属性值为图9-17所示操作设置了CommandType属性值为RecordSource属性值为如果按照条件选择数据,可以用SQL语句实现条件选择。操作方法:在RecordSource属性中单击[…]按钮,弹出图9-19所示对话框,按图选择和输入SQL命令,实现条件选择。图9-19修改记录源9.3.3ADODC控件的高级应用

[相关知识]ADODC对象组织关系如图9-20所示。ADODCRecordS[相关知识]ADODC对象组织关系etFieldsField如图9-20所示。其中,Field对象代表数据表格最小的数据单位,即表格中的字段(单元格),具有名称Name(字段名)和值Value(字段值)属性;数据表格中的每一列中所有的字段,组成Fileds字段集合,第1列为Fileds(0),第2列为Fields(1)…

…,如图9-21所示。表格中的每一行,构成一条记录Record,RecordSet对象用来读取每一条记录的信息。实际上,RecordSet是指向表记录的指针,包含当前记录(行)的信息,如果需要取得每一行的数据,需要依次移动记录指针来获取。图9-21RecordSet对象和Fileds集合对象示意VisualBasic6.0中,在一个数据库表中取得任意字段信息(字段名和字段值)的操作步骤:“选择并连接数据库”→“选择表”→“移动记录指针”→“读取字段属性”例如,打开图9-21中的“学生信息表”时,当前记录指针指向第1条记录,读取字段值的操作如下:取得第1个字段的值:Adodc1.recordset.Fields(0).value

取得第2个字段的值:Adodc1.recordset.Fields(1).value

…取得第N个字段的值:Adodc1.recordset.Fields(N-1).value由于Value是Fileds默认的属性,且Fileds是RecordSet默认的属性,因此,取得第1个字段值得方法可以为:Adodc1.recordset.Fields(0)或Adodc1.recordset.(0)。此外,也可以使用字段名的形式读取字段信息,见表9-5。表9-5存取字段数据的其他形式格式格式形式比较1Adodc1.Recordset.Fields(“字段名称”).value用字段名存取,不必关心字段位置2Adodc1.Recordset.Fields(“字段名称”)用字段名存取,省略value[默认]3Adodc1.Recordset(“字段名称”)简洁,推荐使用的格式4Adodc1.Recordset![字段名称]字段名称必须为常数,不常用例如:

Adodc1.Recordset(“姓名”):取得当前记录的姓名字段值

Xm=“姓名”

Adodc1.Recordset(Xm):取得当前记录的姓名字段值

Adodc1.Recordset![姓名]:取得当前记录的姓名字段值,但不能写成:Adodc1.Recordset![Xm],使用该格式时,[]内必须是常数。如果要取得第2~N条记录中的字段信息,ADODC提供移动记录指针的方法,参见表9-6。表9-6Recordset对象主要方法和属性方法或属性名称描述Adodc1.Recordset.MoveFirst向前移动到第一条记录Adodc1.Recordset.MoveLast向后移动到第最后一条记录Adodc1.Recordset.MoveNext向后移动到下一条记录Adodc1.Recordset.MovePrevious向前移动到上一条记录Adodc1.Recordset.BOF向前移动时,是否移过第一条记录Adodc1.Recordset.EOF向后移动时,是否移过了最后一条记录Adodc1.Recordset.RecordCount记录数Adodc1.Recordset.Fields.Count字段数ADODC控件中,记录的移动(记录导航按钮)实际上是调用其RecordSet对象的移动记录方法来实现,各导航按钮对应的方法如图9-22所示。图9-22记录移动方法其中,Adodc1.Recordset.AddNew为添加新记录。[例9-12]读取数据:在例9-11建立的数据库中,将“订单表”中的的记录读取到列表框中显示,结果如图9-23所示。图9-23运行界面[建立工程]创建工程,在窗体上添加一个ADODC控件、一个List控件和一个按钮,名称默认,分别为Adodc1、List1和Command1。调整布局如图9-23所示。按照例9-11的步骤,设置Adodc1控件的ConnectionString和RecordSource属性,连接数据库,并指定记录源。

[程序代码]1 PrivateSubForm_Load()2 Adodc1.Refresh3 EndSub4 5 PrivateSubCommand1_Click()6 DimRecStrAsString7 List1.Clear8 9 Adodc1.Recordset.MoveFirst10 Fori=0ToAdodc1.Recordset.RecordCount-111 Forj=0ToAdodc1.Recordset.Fields.Count-112 RecStr=RecStr&Adodc1.Recordset.Fields(j).Value&vbTab13 Next14 List1.AddItemRecStr15 RecStr=""16 Adodc1.Recordset.MoveNext17 Next18 EndSub[代码分析]

行1~3:当Adodc控件没有绑定到任何显示的数据控件时,必须调用其Refresh方法,连接数据库,并执行记录源读取。行6:定义变量RecStr,准备保存读取的记录。行9:将记录指针移到第一条记录,以便可以重复读取记录。

行10:根据数据表中的记录数RecordCount,准备循环读取记录行11:Adodc1.Recordset.Fields.Count,每一条记录具有的字段数。行12:Adodc1.Recordset.Fields(j).Value,第j个字段的值。vbTab为系统常数,相当于四个长度的空格,便于对齐数据。行16:要读取下一条记录,必须将记录指针移动到下一条。注意:本例运行前,必须将Adodc1控件连接上数据库,并设置其记录源。

[运行结果]

按F5运行程序,单击Command1按钮,将看到图9-23所示结果。[例9-13]删除指定记录:删除[订单表]中订单编号为A1000的记录

[建立工程]

在例9-12的基础上,在界面上添加一个按钮控件,名称为Command2,编写以下代码,实现将满足条件的记录删除。

[程序代码]1 PrivateSubCommand2_Click()2 Adodc1.Recordset.MoveFirst'将指针移到第一条记录

3 WhileNotAdodc1.Recordset.EOF'依此取得每一条记录

4 IfAdodc1.Recordset("订单编号")="A1000"Then'通过[订单编号]字段的值比较是否满足条件

5 Adodc1.Recordset.Delete6 EndIf7 Adodc1.Recordset.MoveNext'取得下一条记录,特别注意!。不移动记录将进入死循环

8 Wend9 EndSub[代码说明]行2:将记录指针移动到第一条记录,准备从第一条记录到最后一条记录中查找满足条件的记录。行3:EOF属性表示,在移动记录过程中,是否已经超过了最后一条记录,如果值为True是,则已经处于最后一条记录了,不能再往前移动了,而BOF属性表示向后移动记录时,是否已经超过了第一条记录,如果值为True,则不能再往后移动了,否则将出错。行4:判断字段值是否满足要删除的条件。这是Adodc1.Recordset.Fields("订单编号").Value的简洁写法。行5:执行记录删除。行7:继续移动记录,直到全部记录查找完毕。[例9-13]修改记录:将“订单表”中订单编号为A1001的记录,数量修改为20,客户编号修改为K3,送货日期修改为今天日期。[建立工程]在例9-12的基础上,在界面上添加一个按钮控件,名称为Command3,编写以下的代码,可以修改满足条件的记录。[程序代码]PrivateSubCommand3_Click()Adodc1.Recordset.MoveFirst'将指针移到第一条记录

WhileNotAdodc1.Recordset.EOF'依次取得每一条记录

IfAdodc1.Recordset("订单编号")="A1001"Then'比较是否满足条件

Adodc1.Recordset("数量")=10'数字类型数据

Adodc1.Recordset("客户编号")="K3"'字符串类型数据

Adodc1.Recordset("送货日期")=Now'日期类型格式'如果是常数,则使用如:#9/9/2009#Adodc1.Recordset.Update'修改后,执行更新动作

EndIfAdodc1.Recordset.MoveNextWendEndSub[代码说明]本例通过Adodc控件的Recordset对象的方法实现记录的修改,基本思路:找到需要修改的记录,将字段内容设置为新的值,然后执行更新操作。其他说明见代码中的注释。[例9-14]添加新记录:添加新记录到订单表。[建立工程]在例9-12的基础上,在界面上添加一个按钮控件,名称为Command4,编写以下的代码,在当前表中插入新记录。[程序代码]PrivateSubCommand4_Click()Adodc1.Recordset.AddNewAdodc1.Recordset("订单编号")="A2008"Adodc1.Recordset("客户编号")="KK"Adodc1.Recordset("产品编号")="C2000"Adodc1.Recordset("数量")=2Adodc1.Recordset.UpdateEndSub[代码说明]在表中添加新记录,必须通过.Recordset对象的方法AddNew先插入一空行,然后依次填充每个字段值,最后保存记录。[总结与提高]例9-11~例9-14界面布局如图9-24所示。List1Adodc1Command1~Command4图9-24界面布局完整的源代码如下:PrivateSubForm_Load()Adodc1.RefreshEndSub'读出数据按钮代码PrivateSubCommand1_Click()DimRecStrAsStringList1.Clear

Adodc1.Recordset.MoveFirstFori=0ToAdodc1.Recordset.RecordCount-1Forj=0ToAdodc1.Recordset.Fields.Count-1RecStr=RecStr&Adodc1.Recordset.Fields(j).Value&vbTabNext

List1.AddItemRecStrRecStr=""Adodc1.Recordset.MoveNextNextEndSubList1Adodc1Command1~Command4图9-24界面布局'删除记录按钮代码PrivateSubCommand2_Click()Adodc1.Recordset.MoveFirst'将指针移到第一条记录

WhileNotAdodc1.Recordset.EOF'依此取得每一条记录

IfAdodc1.Recordset.Fields("订单编号").Value="A1000"Then'通过[订单编号]字段的值比较是否满足条件

Adodc1.Recordset.DeleteEndIfAdodc1.Recordset.MoveNext'取得下一条记录,特别注意!。不移动记录将进入死循环

WendEndSub'修改记录按钮代码PrivateSubCommand3_Click()Adodc1.Recordset.MoveFirst'将指针移到第一条记录

WhileNotAdodc1.Recordset.EOF'依此取得每一条记录

IfAdodc1.Recordset("订单编号")="A1001"Then'通过姓名字段的值比较是否满足条件

Adodc1.Recordset("数量")=10'数字类型数据

Adodc1.Recordset("客户编号")="K3"'字符串类型数据

Adodc1.Recordset("送货日期")=Now'日期格式常数#9/9/2009#Adodc1.Recordset.Update'修改后,执行更新动作

EndIfAdodc1.Recordset.MoveNextWendEndSub'添加记录按钮代码PrivateSubCommand4_Click()Adodc1.Recordset.AddNewAdodc1.Recordset("订单编号")="A2008"Adodc1.Recordset("客户编号")="KK"Adodc1.Recordset("产品编号")="C2000"Adodc1.Recordset("数量")=2Adodc1.Recordset.UpdateEndSub[例9-15]记录查询:在“订单表”中查找以"A"开头的所有订单。[程序代码]Adodc1.Recordset.MoveFirstAdodc1.Recordset.Find"订单编号like'A%'",0,adSearchForwardIfAdodc1.Recordset.EOF=FalseThenMsgBoxAdodc1.Recordset("订单编号")EndIfWhileNotAdodc1.Recordset.EOFAdodc1.Recordset.Find"订单编号like'A%'",1,adSearchForwardIfAdodc1.Recordset.EOF=FalseThenMsgBoxAdodc1.Recordset("订单编号")EndIfWend[总结与提高]Recordset对象的Find方法可以实现记录的查询,它将在Recordset中查找满足指定条件的记录,如果条件符合,则记录集位置设置在找到的记录上,否则位置将设置在记录集的末尾。语法格式:Find(criteria,SkipRows,searchDirection,start)作用:查找符合某一条件的记录,然后将查找到的第一条记录设置为当前记录。参数说明:(1)criteria:字符串,包含用于搜索的指定列名、比较操作符和值的语句。criteria中的“比较操作符”可以是“>”(大于)、“<”(小于)、“=”(等于)或“like”(模糊查询),例如:数量>=10。criteria中的值可以是字符串、数字或者日期。字符串值以单引号分隔(如“state='WA'”)。日期值以“#”(数字记号)分隔,如:’下单日期>#7/22/97#’。若“比较操作符”为“like”,则字符串“值”可以包含“*”(某字符可出现一次或多次)或者“_”(某字符只出现一次)。例如: 姓名like’张%’

姓张(其中“%”号等价于“*”号)姓名like’张_’

姓张,但长度为2的姓名like’%张%’

包含张的姓名like’%华’

以华结尾的(2)下面三个参数可选:SkipRows:跳过几条记录才开始查找,默认值为0,它指定当前行或start书签的位移以开始搜索。searchDirection:查找方向,向前或向后,默认向后查找。Start:用作搜索的开始位置。可选,如果省略,表示从当前记录开始查找。Find方法只适合于单条件的简单查询。对于使用AND和OR逻辑运算符的多条件组合查询表达式,可以使用RecordSet对象的Fiter属性,以筛选满足指定条件的记录。例如,选择所有订单编号以A开头、数量大于10的记录,可以写为:

Adodc1.Recordset.Filter="订单编号like'A%'and数量>10"9.4使用ADO对象实现数据库操作

ActiveXDataObjects(ADO)是VB6.0最新提供的数据访问接口编程模型。数据访问接口是一个对象模型,代表访问数据的各个方面。在VisualBasic中,可用的数据访问接口有三种:ActiveX数据对象(ADO)、远程数据对象(RDO)和数据访问对象(DAO)。这三种接口分别代表了该技术的不同发展阶段。最新的是ADO,是比RDO和DAO更加简单,更加灵活的对象模型。对于新建的VB工程,应该使用ADO作为数据访问接口。对于现存的工程,VisualBasic继续支持DAO和RDO。ADO对象模型如图9-25所示。其中,Command对象和RecordSet对象依赖于Connection对象而存在。每个对象都具有属性集合。图9-25ADO对象模型ADO的目标是访问、编辑和更新数据源,而编程模型体现了为完成该目标所必需的系列动作的顺序。ADO提供类和对象,以完成以下活动:连接到数据源(Connection)。可选择开始一个事务。可选择创建对象来表示SQL命令(Command)。可选择在SQL命令中指定列、表和值作为变量参数(Parameter)。执行命令(Command、Connection或Recordset)。如果命令按行返回,则将行存储在缓存中(Recordset)。可选择创建缓存视图,以便能对数据进行排序、筛选和定位(Recordset)。通过添加、删除或更改行和列编辑数据(Recordset)。在适当情况下,使用缓存中的更改内容来更新数据源(Recordset)。在使用事务之后,可以接受或拒绝在事务期间所作的更改。结束事务(Connection)。使用ADO对象访问数据库的过程,与使用ADODC控件访问数据库一致,一般步骤如下:1.创建连接对象Connection,打开与数据库连接。2.仅执行SQL命令,或通过执行SQL获取记录集对象RecordSet。3.通过RecordSet对象执行各种数据操作,如:显示数据、编辑数据、查询数据等。4.关闭数据库连接。要在VB6工程中使用ADO对象模型,需要在IDE环境的菜单栏上选择“工程→引用”选项,然后添加对“MicrosoftActiveXDataObjects2.0Library”项的引用。9.4.1读取记录

[例9-15]使用ADO对象,读取订单管理数据库db1.mdb中“订单表”的数据,显示在列表框List1中。[分析]本例主要介绍使用ADO对象来建立与数据库的连接,并且读取数据库中指定表记录的一般步骤。要使用ADO对象连接数据库,首先必须创建连接对象,并设置其连接字符串,最后打开连接。读取表中记录时,必须首先创建记录集对象,通过已经建立的连接对象,执行SQL命令,最后读出记录集中的记录信息。数据读取完毕,必须关闭数据库的连接,以释放系统占用的资源。[建立工程]在窗体上添加一个按钮Commadn1和一个列表框控件List,调整布局如图9-26所示。Command1List1Command1List1图9-26界面布局[程序代码]1 PrivateSubCommand1_Click()2 '第1步:建立连接对象3 DimconnAsNewADODB.Connection4 DimrsAsNewADODB.Recordset5 6 '第2步:连接到数据库7 conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="&App.Path&"\db1.mdb"8 conn.Open9 10 '第3步:打开记录集11 rs.Open"Select*from订单表",conn,adOpenStatic,adLockReadOnly12 13 '第4步:读取数据14 WhileNotrs.EOF15 Fori=0Tors.Fields.Count-116 s=s&rs(i)&vbTab17 Next18 19 List1.AddItems20 s=""21 22 rs.MoveNext23 Wend24 25 '第5步:关闭数据库连接26 rs.Close27 conn.Close28 EndSub[代码说明]注意:本例中必须添加对“MicrosoftActiveXDataObjects2.0Library”项的外部引用。行3:创建连接对象,也可以省略ADODB,直接写成:DimconnAsNewConnection。行4:创建记录集对象。行7:设置连接对象的连接字符串属性,该连接字符串含义已经在10.4.1节进行了说明,App.Path取得当前工程所在的位置,一般数据库文件都放置在应用程序所在的位置。测试本例时,必须将db1.mdb数据库放在工程目录下。行8:创建连接对象,并设置其ConnectionString属性后,调用Open方法,打开与数据库的连接。行11:使用已经建立的连接对象,执行SQL命令,从而打开数据库中的表。记录集对象中Open方法参数含义如下:参数1:表名,或SQL命令文本;参数2:已经与数据库建立连接的对象Connection

参数3:在ADO对象模型中定义的游标“每条记录的索引”类型。有四种不同的游标类型(“读取数据方式”),如图9-27所示,含义见表9-7。图9-27四种游标类型表9-7四种不同的游标类型常量含义动态游标[多用户使用]

2—adOpenDynamic用于查看其他用户所作的添加、更改和删除,并用于不依赖书签的Recordset中各种类型的移动。如果提供者支持,可使用书签。键集游标[多用户使用]

1—adOpenKeySet其行为类似动态游标,不同的只是禁止查看其他用户添加的记录,并禁止访问其他用户删除的记录,其他用户所作的数据更改将依然可见。它始终支持书签,因此允许Recordset中各种类型的移动。静态游标[往复式读取]

3-adOpenStatic提供记录集合的静态副本以查找数据或生成报告。它始终支持书签,因此允许Recordset中各种类型的移动。其他用户所作的添加、更改或删除将不可见。这是打开客户端(ADOR)Recordset对象时唯一允许使用的游标类型。仅向前游标[只向下读取]

0-adOpenForwardOnly除仅允许在记录中向前滚动之外,其行为类似动态游标。这样,当需要在Recordset中单程移动时就可提高性能参数4:在ADO对象模型中确定提供者打开Recordset

时应该使用的锁定(并发)类型(“编辑数据方式”),如图9-28所示,含义见表9-8。图9-28四种锁定(并发)类型表9-8四种不同的锁定(并发)类型常量说明1--AdLockReadOnly(默认值)只读—

不能改变数据。2--AdLockPessimistic保守式锁定(逐个)—

提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。修改记录时,锁定,其他用户不可操作该记录,;如果被其他用户锁定,程序将出错。3--AdLockOptimistic开放式锁定(逐个)—

提供者使用开放式锁定,只在调用Update方法时才锁定记录。假定其他人不会同时编辑该条当前操作的记录4--AdLockBatchOptimistic开放式批更新—用于批更新模式(与立即更新模式相对)。同上,假设同一时间,当前操作的一批记录其他人不会同时操作如果仅仅只读取数据,则参数3和参数4一般设置为:3-adOpenStatic和1-AdLockReadOnly,如果是在单机环境下使用,为了可以读写数据,一般两者都选择方式3,以提供更多的功能支持。在网络环境下,需要根据具体要求而定。行14:EOF,判断记录是否移过末行。rs中的属性和方法,与在Adodc控件介绍中的RecordSet对象属性和方法完全一致。其实,如果是使用了ADODC打开数据库(表),ADODC最终还是调用ADO提供的方法来打开数据库(表)。ADODC是利用ADO对象建立起来的一种控件方式。如果要使数据库处理程序能更专业、更灵活的处理数据,应当象本例那样使用ADO对象。行15~19:读取记录中每一个字段值,连接成字符串,添加到List1控件中。该过程与[例9-11]一致。行22:注意,别忘记移动记录到下一条!行26:关闭打开的表,释放占用的系统资源。行27:关闭数据库。[运行结果]如图9-29所示图9-29运行结果9.4.2数据查询

[例9-16]按订单编号或下单日期查询订单信息,实现图9-30所示的执行结果。[分析]本例按条件选择数据,并将数据显示在DataGrid控件中。主要介绍使用ADO对象如何执行SQL查询命令语句Select,并动态得到查询的的结果(记录集)。图9-30运行界面[建立工程]在窗体上添加一个外部表格控件DataGrid1,添加一个框架控件Frame1,设置其标题为“查询条件”;在Frame1中依次添加两个单选按钮Option1和Option2,一个文本框Text1和一个组合框Combo1。设置Combo1的Style属性为:2-DropDownList,并在其List属性中预先输入四项内容:精确匹配;以之开头;以之结尾;包含。添加两个日期选择外部控件,名称Name分别修改为Dtp1和Dtp2,调整布局如图9-31所示。图9-31界面布局[程序代码]1 DimconnAsNewADODB.Connection2 DimrsAsNewRecordset3 4 '初始化控件5 SubInit()6 Combo1.ListIndex=07 Text1.Text=""8 DTP1.Value=Now-30'当前日期-30天,即一个月之前的日期9 DTP2.Value=Now'当前日期10 Option1.Value=True11 EndSub12 13 '连接数据库,并打开表,设置表格控件数据来源为Rec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论