1、Visual Basic在数据库应用程序的开发方面提供了包含数据管理器在数据库应用程序的开发方面提供了包含数据管理器、数据控件和数据访问对象等功能强大的工具,可协助编程人员、数据控件和数据访问对象等功能强大的工具,可协助编程人员轻松地连接数据库文件,快捷、简便地实现对数据库的访问和操轻松地连接数据库文件,快捷、简便地实现对数据库的访问和操作。在作。在Visual Basic 6.0的集成开发环境中,用户可以用各种集成的集成开发环境中,用户可以用各种集成的可视化数据库工具以及数据环境设计器管理和操作各种数据库的可视化数据库工具以及数据环境设计器管理和操作各种数据库(包括像(包括像Oracle、S
2、QL Server这样的大型数据库),并且能够创这样的大型数据库),并且能够创建出各种可重用的数据访问查询,以及在报表设计器中通过拖动建出各种可重用的数据访问查询,以及在报表设计器中通过拖动方式轻松地创建出优秀的报表。方式轻松地创建出优秀的报表。u在实际应用中,我们常常需要借助数据库管理系统(DBMS,Data Base Management System)管理大量的数据。Visual Basic提供强有力的数据库管理功能,可在单机或网络上生成并访问数据库。Visual Basic 6.0将数据库技术与面向对象的编程技术结合在一起,并加入了可任意与数据绑定的ActiveX技术,使编程人员能够很
3、轻松地开发出使用方便、易于掌握的应用程序,从而在很大程度上减轻了编程工作量,更有效地管理信息。uVisual Basic建立的数据库格式默认MS Access应用程序的MDB数据库格式,不仅具有数据库引挚,还能处理其它数据库格式(如dBASE、Foxbase、FoxPro、Paradox等),针对其中的数据进行访问操作。此外,Visual Basic也可以通过ODBC(开放式数据库连接,Open DataBase Connectivity)以客户/服务器方式来连接SQL Server等关系型数据库管理系统。u数据库是特定主题或目的相关的数据集合。该集合进一步组成表,用大家熟悉的记录(行)和字段
4、(列)格式表示特定主题的信息。数据库通常由数据库管理系统(DBMS)来建立和管理。例如,FoxPro、Paradox等都是数据库管理系统。u数据库无论大小,都是由数据按照一定的结构组织起来。数据库的组织称为结构,包括表、字段名、字段数据类型、字段大小(宽度)和索引等。数据库的结构必须在数据存入数据库前定义。一个满足用户需求的数据库,其结构必须仔细地设计。表含有所有数据,表中的每个字段有特定的数据类型;记录存储特定的人、事件和事物的所有信息(如一个学生的学籍信息)。在表中,所有的记录含有相同的字段,表由相同类型的记录集合组成。u在表中,特定数据值存放在字段(列)和记录(行)的交叉点。例如,学生“
5、张萍”的出生年月存放在“张萍”记录的“出生年月”字段中,可以通过查找记录来查看该字段是否有相应的数据值。u数据库中的数据可根据不同项目进行分类管理。以学籍表为例,学生的数据按顺序分类成学号、姓名、性别、出生年月等字段,如表9-1所示。除此之外,还可以对每个学生的成绩数据、奖惩情况、家庭情况等再建立多个表,形成一个彼此关联的表群组。所谓的数据库,就是由这些表群组的成员组成。因此,不仅数据库中的数据可视需要随时更新,数据库中所包含的表成员也可视需要进行增减。学号姓名性别出生年月D001王涛男1982/5/4D002李冰女1982/1/3D003张红女1980/9/17D004郑洁女1980/10/
6、15D005袁明男1981/2/10D006张萍女1980/11/2D007张骏男1980/12/23D008罗娟女1981/5/241.数据库和表 目前使用的大部分数据库都是关系型数据库(Relational Database)。一个关系型数据库通过若干个表(Table)来存储数据,并且通过关系(Relational)将这些表联系在一起。表以二维表格形式来表示。表是由行和列组成的数据集合,表中一行为一个记录(Record),一列为记录中的一个字段(Field)。例如,表9-1中所示的学籍表中,学号、姓名、性别、出生年月等都是字段,每个学生的字段数据构成了该学生的一条记录。可以将表看成是一种用
7、户自定义类型,表中的每一条记录是一个这种用户自定义类型的变量,字段是这种用户自定义类型的各个分量。例如,若将表9-1称为“学籍表”,该表可以看作是以下用户自定义类型:Type 学籍表 学号 As String 姓名As String 性别As String 出生年月As Data End Type 其中,“学号”、“姓名”、“性别”和“出生年月”是组成用户自定义类型“学籍表”的四个变量,正好与表中的四个字段对应。表中的所有记录相当于一组被声明为用户自定义类型“学籍表”的变量。u2.记录和字段 在表9-1中,每一行数据构成了学籍表中的一条记录,记录是数据库管理中操作的基本数据。每一列数据构成了学
8、籍表中的一个字段,每个字段都有相应的字段名、数据类型、数据宽度等结构描述信息。u3.索引(Index)为了快速查询数据,数据库中一般都使用索引。索引是以某个字段作为关键字进行排序,对数据库中的数据进行组织。在某些条件下查询数据库时,使用索引可以显著提高查询的速度。u4.关系 在数据库中,将表中可用来唯一标识记录的字段称为主关键字。主关键字指定的字段中,不能出现相同的值。例如,在表9-1的“学籍表”中,“学号”字段可唯一地标识不同的学籍记录,因而可指定为该“学籍表”的主关键字。主关键字不仅可以是一个字段,也可以是多个字段。一般情况下,数据库中表与表之间的关系是指某个表的主关键字和另一个表的主关键
9、字之间的对应关系。u5.查询(Query)由数据库中按照关系组合而成的具有实际使用意义的表,称为查询。查询不是数据库中存储的表,而是按照各种规则和要求“查”出来的表。查询可通过SQL(Structured Query Language,结构化查询语言)创建。SQL是一种标准的查询语言,几乎所有的关系数据库系统都支持这种语言。各种关系型数据库中的SQL语言有所不同,但最基本的语句和使用方法是一样的。存储在数据库中的查询,称为视图(View)。存储在客户/服务器数据库中的、用SQL语句编写的程序段,称为存储过程(Stored Procedure)。SQL语言的主要功能由八个动词来表达,用户只需要写
10、出做什么,就可以得到查询的结果。(1)数据查询功能。SQL中用动词Select实现查询。查询是SQL语 言的核心,SQL的查询操作可以从一个或多个表中找出满足条件 的元组。用Select可以实现数据库的选择、投影和连接等操作。例如,用以下Select语句可从数据库中列出满足查询条件的指定字段值:Select From WHERE 该语句可从所指定的表中取出指定的字段,并通过进行筛选,只有满足条件的记录才可被选出,从而创建了一个查询。(2)数据定义功能。SQL的数据定义功能包括定义数据库、定义基本表、定义视图、定义索引等。SQL的数据定义可用相应的动词实现,如Create等。(3)数据更新功能。
11、SQL中用动词Insert、Delete、Update实现数据更新。(4)数据控制功能。SQL中用动词Grant、Revote实现数据控制。由于不同的数据库管理系统在实现SQL语言时各有差别,并且一般都做了某种的扩充。因此,用户在使用时应参阅系统提供的有关手册。u6.Recordset(记录集)对象 应用程序开始运行后,Visual Basic根据数据控件的设置打开所选取的数据库,同时建立Database对象和Recordset对象。该对象在窗体的Form_Load()事件开始执行前已自动产生。简单地说,Recordset对象的作用是在程序中代表数据库中的表(Table)。因此,在对数据控件连
12、接的表进行“新增”、“修改”、“删除”、“查询”操作时,实际上是以Recordset对象所属的AddNew、Edit、Delete和Seek等方法来处理。u7、关系型数据库的种类 通常使用的关系型数据库可分为两类:文件数据库(如Access、FoxPro、Paradox等)和客户/服务器数据库(如SQL Server、Oracle、Sybase等)。客户/服务器数据库是最典型的分布应用结构。客户/服务器应用程序分为两部分,一部分位于客户机,负责向用户提供信息以及和用户进行交互;另一部分位于服务器,负责进行具体的计算和数据库的操作。在客户/服务器数据库中,对数据的处理和操作都是通过存储过程(St
13、ored Procedure)来完成的。存储过程是用SQL语句编写的程序段,就像Visual Basic中的函数或子程序。用户可以通过编写存储过程在服务器端完成诸如修改数据、添加数据、删除数据和查询等工作。在使用中,只要通过位于客户端的应用程序调用这些存储过程,就可以在服务端完成相应的操作。由于存储过程经过预编译和优化,因而具有很高的效率。客户/服务器数据库的特点决定了其适用于大型、分布式、多用户的数据库系统。文件数据库也可以放在服务器上供多个用户使用,由于文件数据库只能提供存取数据的功能,数据库文件中被申请的所有数据都会被传送到客户机,在客户机中进行查询操作,而查询出来的数据量一般只占所传送
14、数据的一小部分,从而增加了网络流量,降低了应用程序的性能。此外,对文件数据库进行添加、删除、修改等操作都要在客户端通过查询来完成。例如,若需要修改数据库中的某个数据,只能将表中的所有数据都传送到客户端,经过修改后再将整个表送回到服务器端的数据库中。因此,文件数据库适用于小型的、单机的数据库系统。进行数据库开发时,应先根据各种数据库的特点和具体情况选择一种合适的数据库类型。u1.用户界面 用户界面包括用于与用户交互的所有界面和代码,如对数据库记录进行添加、修改、删除、查询的Visual Basic代码,完成查询和数据更新的窗体等。用户界面不对数据库进行实际的操作,而是请求数据库服务的数据访问对象
15、和方法。u2.数据库引擎 数据库引擎是一组动态连接库(DLL),主要任务是解释应用程序的请求并形成对数据仓库的物理操作,管理对数据库的物理操作,维护数据库的完整性和安全性,处理结构化查询语言SQL的查询操作,实现对数据库的检索、添加、删改,管理查询返回的结果等。应用程序运行时,这些功能通过将动态连接库连接到Visual Basic程序中来实现。u3.数据仓库 数据仓库是存放数据的地方,由若干个表文件组成。数据仓库只包含数据,而对数据的计算、检索、排序等操作都由数据库引擎来完成。可见,数据库引擎是Visual Basic应用程序与数据库之间的桥梁,应用程序通过数据库引擎来完成对数据库文件的存取操
16、作。Visual Basic 6.0中提供了生成并访问数据库的大量部件,包括数据控件(Data Control)、数据访问对象(DAO,Data Access Objects)和ActiveX数据对象(ADO,ActiveX Data Objects),可以用这些工具作为与数据库引挚的接口。1.数据控件(Data Control)用数据控件可以不经过编程而访问数据库。根据需要设置好数据控件的属性后,即可通过诸如文本框之类的控件与数据控件绑定,从而实现对数据库中各个记录的访问。但是,数据控件的功能有限,若要完成复杂的功能,还是需要编程来解决。u2.数据访问对象(DAO)数据访问对象(DAO)是由
17、Microsoft Jet数据库引擎定义的对象,是通过程序访问数据库的对象结构。可以用数据访问对象(如Database、TableDef、Recordset对象)表示在代码中用来组织和操作数据的对象。DAO模型采用与关系型数据库逻辑结构相同的类的结构,对应于数据库的不同部分,存在相应的数据访问对象(如Database、TableDef、Field和Index对象),因而具有较高的效率。DAO模型向用户提供创建数据库、定义表和字段、建立和维护索引、建立表间的关系、进行结构化查询等工具在内的一系列操作的属性和方法。DAO不仅简化了代码,而且使数据库的底层结构更加透明,编程人员可以用同样的对象、属性
18、和方法来处理各种不同数据库格式,从而具有更多的灵活性。u3.ActiveX数据对象(ADO)ADO是Visual Basic 6.0为数据访问提供的全新技术。ADO是一种建立在最新数据访问接口OLE DB之上的高性能的、统一的数据访问对象,通过它可以访问文件数据库、客户/服务器数据库甚至非关系型数据库。ADO提供了更高的性能、更小的系统开销、更简单的模型以及更灵活的操作。因此,ADO已经成为Visual Basic中最主要的数据访问对象。注意:为了与Visual Basic早期的版本兼容,使得Visual Basic早期版本创建的数据库工程能够被Visual Basic 6.0打开,原有的数据
19、访问对象还可以在Visual Basic 6.0中继续使用。Visual Basic 6.0通过数据库引擎可以识别以下三类数据库:u1.Visual Basic数据库 Visual Basic数据库文件使用与Microsoft Access相同的格式,又称内部数据库或本地数据库。由于可用Jet引擎直接创建和操作这些数据库,可以提供最大程度的灵活性和速度。u2.外部数据库 在Visual Basic 6.0中,能够创建和操作所有“索引顺序访问方法(ISAM)”数据库,如dBASE、FoxPro、Btrieve、Paradox等,还可以访问电子表格软件MS Excel或Lotus 123、文本文件
20、数据库等。u3.ODBC数据库 Visual Basic可以访问ODBC标准的客户/服务器数据库,如MS SQL Server等。利用Visual Basic提供的ODBCDirect模式,可以把命令直接传递给服务器处理,以创建真正的客户/服务器数据库管理程序。例9-1 创建一个订单管理的Access 2003数据库。分析 要实现在VB6中操作数据库,必须先规划和建立数据库。虽然VB6.0内置了一个微型的数据库设计器,一般在实际中比较少用,这里以常用的桌面小型数据库Access 2003为例,建立一个简单的订单管理数据库db1.mdb,学习在Microsoft Access 2003 中创建数
21、据库的操作方法。该数据库将作为本章后续范例的数据库。规划表结构 建立数据库前,对需要保存的信息进行分析,然后对表结构进行规划。根据一般订单需要保存的数据,规划表结构如表9-2、表9-3和表9-4所示。其中,表示该字段为主关键。表9-2 订单表字段名订单编号产品编号客户编号数量单价下单日期送货日期经手人类型(长度)文本(20)文本(20)文本(20)整数数值(2位小数)日期日期文本(20)表9-3 产品表字段名产品编号产品名称单位规格类型(长度)文本(20)文本(50)文本(10)文本(20)表9-4 客户信息表字段名客户编号姓名性别生日联系电话公司地址类型(长度)文本(20)文本(50)是/否
22、日期文本(20)文本(100)建立表结构 在Access中创建表结构的基本步骤如下:(1)启动Access 2003。(2)在菜单栏上选择“文件新建”选项,在“新建文件”任务窗格中选择“空数据库”选项(见图9-1),弹出“文件新建数据库”对话框,如图9-2所示。图9-1 “新建文件”任务窗格u(3)选择保存数据库的位置和文件名,本例保存为C:db1.mdb,如图9-2所示。图9-2 “文件新建数据库”对话框u(4)单击“创建”按钮,打开表设计器,用表设计器创建“订单表”,如图9-3所示。双 击 打 开 表设计器表设计器图9-3 打开表设计器u(5)设置“订单编号”为主关键字,保存为“订单表”,
23、如图9-4所示。建立好的订单表,双击打开进行数据录入图9-4 保存“订单表”u(6)按以上步骤依次建立“产品表”和“客户信息表”,如图9-5和图9-6所示,完成数据库的创建。图9-5 产品表图9-6 客户信息表u数据库查询语言(SQL)是关系数据库的标准语言,被很多类型的数据库所支持。本节介绍最常用的操作数据库的SQL语句,如数据查询、删除、添加和更新的实现等。其中四个最常用的SQL语句是本章使用ASP.NET数据控件的基础,即Select、Insert、delete和Update。更多的细节请参阅有关书籍。Select语句的一般格式语句的一般格式:Select Form Where 条件 功
24、能功能:Select语句功能非常丰富,可以按任意条件从一个表或多个表中查询满足条件的数据,其语法也比较复杂。u例9-2 查询“订单表”中所有的数据。命令命令:Select*From订单表 说明说明:“*”号代表表中所有的字段,也可以按例9-3的方式列出每一个选择的字段。u例9-3 以“订单编号”为查询条件,在“订单表”中列出满足条件的记录。命令命令:Select订单编号,产品编号,客户编号,数量,下单日期,送货日期From订单表 Where 订单编号=A1000 说明说明:Select 关键字后面需要列出的字段以逗号分隔;由于“订单编号”字段为字符串类型,具体的值需要用双引号作为定界符。如果将
25、该SQL语句保存到字符串变量中,需要将双引号改为单引号,如下所示:Dim sql As String sql=Select 订单编号,产品编号,客户编号,数量,下单日期,送货日期 From 订单表 Where 订单编号=A1000u例9-4 查询“订单表”中数量10或下单日期在2007-05-9与2007-09-09之间的订单。命令:Select*From订单表Where数量10 OR(下订日期=#2007-09-09#)说明:条件Where关键字后面,如果字段类型为数字,则值不需要加任何定界符;如果是日期类型,其值必须带#定界符。可以用逻辑运算符(And、Or和Not)连接多个条件。以上三个
26、例子是分别以文本类型、数值类型和日期类型字段作为条件,使用SQL命令查询数据所用的语法。可以在Access中对以上SQL语句的正确性进行验证,检查SQL语句是否正确,以及能否按照我们的条件得到所需要的结果。方法如下:u(1)在Access中打开例9-1中建立的数据库,选择“查询”对象,如图9-7所示。2134双击添加订单表图9-7 打开数据库,选择查询对象u(2)进入SQL命令的查询设计模式,如图9-8所示。添加的表选择SQL视图以便测试SQL命令图9-8 进入SQL命令查询设计模式u(3)输入SQL命令并执行命令,如图9-9所示。例9-5 统计表的记录数。命令命令:Select Count(
27、*)as 记录数 From 订单表 说明说明:在SQL语句中,可以使用内部函数对记录进行统计。Count函数作用是得到表中的记录总数。例9-6 统计“订单表”中订单编号=A1000 And客户编号=K1 的订货总数量。命令:Select Sum(数量)as 订货量 From订单表 Where 订单编号=A1000 and 客户编号=K1 说明:本例用到Count()和Sum()函数,以及其他函数,如Max()、Min()等。u例9-7 在“客户信息表”中查询姓“张”的客户信息(姓名以张开头)。命令:Select*From 客户信息表 where 姓名 Like 李*说明:Like关键字用于模糊
28、匹配,“*”代替任意多个字符;“?”代表任意一个字符。Select还有更多、更灵活的使用方式,可以满足几乎任何对表数据的查询要求(读者可参考其他相关资料)。1.输入SQL命令2 执 行SQL命令3 执行SQL命令结果4 回到设计视图图9-9 输入并执行SQL命令 例9-8 向订单表添加一条新记录。命令:Insert Into 订单表(订单编号,客户编号,产品编号,数量,单价,下订日期,送货日期)Values(A2000,K1,C100,12,12.89,#2007-09-07#,#2007-12-30#)注意:值列表的位置和个数类型应与字段列表一一对应。文本字段类型和日期字段类型对应的常数值需
29、要使用定界符。u例9-9 删除“订单表”中订单编号为 A2000的记录。u命令:Delete*From 订单表 Where 订单编号=A2000u说明:如果没有Where子句,则删除整个订单表数据。u例9-10 修改“订单表”,将订单编号为“A1000”的“数量”改为20。命令:Update订单表Set数量=20 Where订单编号=A1000 说明:如果没有Where子句,则所有记录的“数量”字段值都将修改为20。u9.3.1 ADODC控件简介u在VB6的工具箱中的Data控件,只能连接Access 2000及以下版本的数据库。因此,本节使用外部控件ADODC控件连接Access 2003
30、数据库,并使用外部表格控件显示数据库中表的数据。ADO是Visual Basic 6.0为数据访问提供的全新技术。ADO是一种建立在最新数据访问接口OLE DB之上高性能的、统一的数据访问对象,通过它可以访问文件数据库、客户/服务器数据库甚至非关系型数据库。ADO提供了更高的性能、更小的系统开销、更简单的模型以及更灵活的操作。因此,ADO已经成为Visual Basic中最主要的数据访问对象。ADODC控件是将部分ADO对象及方法包装起来,提供更加简捷的方式进行数据库的访问。u1.添加ADODC控件 要使用ADODC控件连接数据库并选择数据,必须添加ADODC控件到设计环境;要将ADODC控件
31、选择的数据显示出来,可以使用标准控件中的文本框、列表框等数据控件,也可以使用外部的表格控件,如DataGrid。图9-10是在工具箱中添加这两个控件,并添加到窗体上的操作步骤。u2.使用Adodc控件和DataGrid控件显示数据库中某个表数据的一般步骤 (1)设置Adodc控件连接字符串属性,选择连接字符串,并选择指定的数据库文件 (2)设置Adodc控件的记录源属性,按不同命令方式选择表中的数据 (3)设置DataGrid数据源为Adodc3.Adodc主要属性u(1)ConnectionString属性:连接字符串。连接字符串相当于数据库的驱动程序,不同类型的数据库有对应的连接字符串。一
32、般Access数据库连接字符串的格式如下:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=指定的mdb数据库位置 Provider部分为数据库提供者;Data Source部分为指定的数据库位置u(2)CommandType属性:命令类型。可以选择AdCmdText(使用SQL命令)、AdCmdTable(使用表名称)和AdCmdStoredProc(使用数据库中已经建立的存储过程)。如果CommandType属性的值等于adCmdUnknown(默认值),系统的性能将会降低。原因是ADO必须调用提供者,以确定 CommandText 属性是SQL语句
33、还是存储过程或表格名称。第二步第一步图9-10 控件添加u(3)RecordSource属性:记录源。如果CommandType属性值为AdCmdText,则该属性为SQL命令文本;如果CommandType属性值为AdCmdTable,则该属性为具体表名称。u4.DataGrid主要属性 (1)DataSource属性:数据来源。指明表格显示的数据来源。(2)AllowaddNew属性:是否容许添加数据 (3)AllowDelete属性:是否容许删除数据 (4)AllowUpdate属性:是否容许修改数据u例9-11 根据例9-1的内容规划和建立的“订单管理”数据库db1.mdb,在窗体上用
34、ADODC控件和数据表格控件DataGrid显示“订单表”的数据。分析 首先必须通过ADODC控件选择数据来源,即连接数据库;选择需要操作的数据库对象,即具体的表。每个ADODC控件当前只能操作一张表数据,ADODC控件没有显示数据功能,若要显示数据,需要借助数据显示控件,如文本框、列表框、表格控件等,本例选择DataGrid表格控件。u建立工程 创建工程,将ADODC控件和DataGrid控件添加到当前工具箱,然后添加到窗体,采用默认名称,分别为Adodc1和DataGrid1。设置Adodc1的Caption属性为:订单表,界面布局如图9-11所示。图9-11 界面布局图9-12 ADOD
35、C属性u属性设置u1.用鼠标右击Adodc1控件,在弹出的快捷菜单中选择“ADODC属性”,如图9-12所示。在属性页中选择“通用”选项卡,选择“连接资源”为“使用连接字符串”,单击“生成(U)”按钮,如图9-13所示。图9-13 ADODC控件属性页u2.在“数据链接属性”对话框(见图9-14)中选择Access数据库连接字符串:Microsoft Jet 4.0 OLE DB Provider,单击“下一步”按钮。图9-14 数据链接属性u3.在“连接”选项卡(见图9-15)中选择数据库所在位置;单击“测试连接”按钮,测试是否连接成功。确定后,将在“属性页”的“通用”选项卡中(见图9-16
36、)看到自动生成了连接字符串。选择数据库实际所在的位置测试是否连接成功图9-15 选择数据库及测试连接图9-16 生成连接字符串u以上过程仅指定了连接不同类型数据库使用的连接字符串,如果要显示某个表的数据,必须指定具体的表。在“属性页”对话框中选择“记录源”选项卡,按照图9-17所示进行选择,在当前数据库中准备选择具体操作的表。u最后,将DataGrid1表格控件的DataSource属性设置为Adodc1,以便显示Adodc1中选择的数据:u运行结果u完成以上操作后,按F5运行程序(不用写一行代码),即可以看到图9-18所示的运行结果。在表格控件中可以直接修改数据、删除数据和插入新记录,数据自
37、动完成更新操作。1选择命令类型为:2-adCmdTable2选择表名称:订单表图9-17 选择记录源图9-18 运行结果u总结与提高u本例在属性设置中设置了ADODC控件的几个属性,其中,图9-139-16所示操作设置了Adodc的ConnetionString属性,可以在属性窗口中看到该属性值为u图9-17所示操作设置了CommandType属性值为uRecordSource属性值为 u如果按照条件选择数据,可以用SQL语句实现条件选择。操作方法:在RecordSource属性中单击按钮,弹出图9-19所示对话框,按图选择和输入SQL命令,实现条件选择。图9-19 修改记录源u相关知识uAD
38、ODC对象组织关系如图9-20所示。ADODCRecordS相关知识ADODC对象组织关系etFieldsField如图9-20所示。u其中,Field对象代表数据表格最小的数据单位,即表格中的字段(单元格),具有名称Name(字段名)和值Value(字段值)属性;数据表格中的每一列中所有的字段,组成Fileds字段集合,第1列为Fileds(0),第2列为Fields(1),如图9-21所示。表格中的每一行,构成一条记录Record,RecordSet对象用来读取每一条记录的信息。实际上,RecordSet是指向表记录的指针,包含当前记录(行)的信息,如果需要取得每一行的数据,需要依次移动记
39、录指针来获取。图9-21 RecordSet对象和Fileds集合对象示意uVisual Basic 6.0中,在一个数据库表中取得任意字段信息(字段名和字段值)的操作步骤:“选择并连接数据库”“选择表”“移动记录指针”“读取字段属性”例如,打开图9-21中的“学生信息表”时,当前记录指针指向第1条记录,读取字段值的操作如下:取得第1个字段的值:Adodc1.recordset.Fields(0).value 取得第2个字段的值:Adodc1.recordset.Fields(1).value 取得第N个字段的值:Adodc1.recordset.Fields(N-1).valueu由于Val
40、ue是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.R
41、ecordset!字段名称字段名称必须为常数,不常用u例如:Adodc1.Recordset(“姓名”):取得当前记录的姓名字段值 Xm=“姓名”Adodc1.Recordset(Xm):取得当前记录的姓名字段值 Adodc1.Recordset!姓名:取得当前记录的姓名字段值,但不能写成:Adodc1.Recordset!Xm,使用该格式时,内必须是常数。如果要取得第2N条记录中的字段信息,ADODC提供移动记录指针的方法,参见表9-6。表9-6 Recordset对象主要方法和属性方法或属性名称描述Adodc1.Recordset.MoveFirst向前移动到第一条记录Adodc1.Rec
42、ordset.MoveLast向后移动到第最后一条记录Adodc1.Recordset.MoveNext向后移动到下一条记录Adodc1.Recordset.MovePrevious向前移动到上一条记录Adodc1.Recordset.BOF向前移动时,是否移过第一条记录Adodc1.Recordset.EOF向后移动时,是否移过了最后一条记录Adodc1.Recordset.RecordCount记录数Adodc1.Recordset.Fields.Count字段数uADODC控件中,记录的移动(记录导航按钮)实际上是调用其RecordSet对象的移动记录方法来实现,各导航按钮对应的方法如图
43、9-22所示。图9-22 记录移动方法其中,Adodc1.Recordset.AddNew为添加新记录。u例9-12 读取数据:在例9-11建立的数据库中,将“订单表”中的的记录读取到列表框中显示,结果如图9-23所示。图9-23 运行界面u建立工程u创建工程,在窗体上添加一个ADODC控件、一个List控件和一个按钮,名称默认,分别为Adodc1、List1和Command1。调整布局如图9-23所示。按照例9-11的步骤,设置Adodc1控件的ConnectionString 和RecordSource属性,连接数据库,并指定记录源。程序代码 1Private Sub Form_Load(
44、)2 Adodc1.Refresh 3End Sub 4 5Private Sub Command1_Click()6 Dim RecStr As String 7 List1.Clear 8 9 Adodc1.Recordset.MoveFirst 10 For i=0 To Adodc1.Recordset.RecordCount-1 11 For j=0 To Adodc1.Recordset.Fields.Count-1 12 RecStr=RecStr&Adodc1.Recordset.Fields(j).Value&vbTab 13 Next 14 List1.AddItem Re
45、cStr 15 RecStr=16 Adodc1.Recordset.MoveNext 17 Next 18End Sub 代码分析 行13:当Adodc控件没有绑定到任何显示的数据控件时,必须调用其Refresh方法,连接数据库,并执行记录源读取。行6:定义变量RecStr,准备保存读取的记录。行9:将记录指针移到第一条记录,以便可以重复读取记录。行10:根据数据表中的记录数RecordCount,准备循环读取记录 行11:Adodc1.Recordset.Fields.Count,每一条记录具有的字段数。行12:Adodc1.Recordset.Fields(j).Value,第j个字段的
46、值。vbTab为系统常数,相当于四个长度的空格,便于对齐数据。行16:要读取下一条记录,必须将记录指针移动到下一条。注意:本例运行前,必须将Adodc1控件连接上数据库,并设置其记录源。运行结果 按F5运行程序,单击Command1按钮,将看到图9-23所示结果。u例9-13 删除指定记录:删除订单表中订单编号为A1000的记录 建立工程 在例9-12的基础上,在界面上添加一个按钮控件,名称为Command2,编写以下代码,实现将满足条件的记录删除。程序代码 1Private Sub Command2_Click()2 Adodc1.Recordset.MoveFirst 将指针移到第一条记录
47、 3 While Not Adodc1.Recordset.EOF 依此取得每一条记录 4 If Adodc1.Recordset(订单编号)=A1000 Then 通过订单编号字段的值比较是否满足条件 5 Adodc1.Recordset.Delete 6 End If 7 Adodc1.Recordset.MoveNext 取得下一条记录,特别注意!。不移动记录将进入死循环 8 Wend 9End Subu代码说明u行2:将记录指针移动到第一条记录,准备从第一条记录到最后一条记录中查找满足条件的记录。u行3:EOF属性表示,在移动记录过程中,是否已经超过了最后一条记录,如果值为True是,
48、则已经处于最后一条记录了,不能再往前移动了,而BOF属性表示向后移动记录时,是否已经超过了第一条记录,如果值为True,则不能再往后移动了,否则将出错。u行4:判断字段值是否满足要删除的条件。这是Adodc1.Recordset.Fields(订单编号).Value的简洁写法。u行5:执行记录删除。u行7:继续移动记录,直到全部记录查找完毕。u例9-13 修改记录:将“订单表”中订单编号为A1001的记录,数量修改为20,客户编号修改为K3,送货日期修改为今天日期。u建立工程u在例9-12的基础上,在界面上添加一个按钮控件,名称为Command3,编写以下的代码,可以修改满足条件的记录。u程序
49、代码uPrivate Sub Command3_Click()u Adodc1.Recordset.MoveFirst 将指针移到第一条记录u While Not Adodc1.Recordset.EOF 依次取得每一条记录u If Adodc1.Recordset(订单编号)=A1001 Then 比较是否满足条件u Adodc1.Recordset(数量)=10 数字类型数据u Adodc1.Recordset(客户编号)=K3 字符串类型数据u Adodc1.Recordset(送货日期)=Now 日期类型格式u如果是常数,则使用如:#9/9/2009#u Adodc1.Recordse
50、t.Update 修改后,执行更新动作u End Ifu Adodc1.Recordset.MoveNextu WenduEnd Subu代码说明u本例通过Adodc控件的Recordset对象的方法实现记录的修改,基本思路:找到需要修改的记录,将字段内容设置为新的值,然后执行更新操作。其他说明见代码中的注释。u例9-14 添加新记录:添加新记录到订单表。u建立工程u在例9-12的基础上,在界面上添加一个按钮控件,名称为Command4,编写以下的代码,在当前表中插入新记录。u程序代码uPrivate Sub Command4_Click()u Adodc1.Recordset.AddNewu