1、第14章 数据库应用基础,14.1 创建数据库 14.2 VB如何访问数据库 14.3 用控件访问数据库 14.4 初识记录集对象 14.5 用SQL语句生成记录集 14.6 数据库记录的操作 14.7 ADO编程模型简介 14.8 数据报表,结束,14.1 创建数据库,14.1.1 关系型数据库的基本结构 14.1.2 在VB环境中创建Access数据库 14.1.3 用MS Access建立数据库,返回首页,14.1.1 关系型数据库的基本结构(1),在讨论关系型数据库的结构之前,先来看一个记载学生基本信息的表格。 表14.1 学生基本信息表,14.1.1 关系型数据库的基本结构(2),表
2、14.1是一个由若干行和列组成的二维表格,一个关系型数据库由多个这样的二维表格组成。关系型数据库使用以下术语描述数据库中的信息: 记录(Record):二维表中的每一行为一条记录(表14.1中的第一行“学号”、“姓名”等列标题除外)。一个表中不允许含有完全相同的两条记录。 字段(Field):二维表中的每一列为一个字段。列标题为字段名(必须惟一)。,14.1.1 关系型数据库的基本结构(3),数据表(Table):二维表中的所有记录构成数据表,简称为表。 数据库(Database):多个相互关联但不同名的数据表构成数据库。 目前较流行的桌面数据库MS Access,大型网络数据库MS SQL
3、Server、Oracle和Sybase等都属于关系型数据库。本章以MS Access数据库为例讨论VB的数据库应用技术。,返回首页,返回本节,14.1.2 在VB环境中创建Access数据库(1),1. 启动数据管理器 在VB环境中执行【外接程序】菜单中的【可视化数据管理器】命令,打开可视化数据管理器(VisData),如图14.1所示。2. 建立数据库 在VisData窗口执行菜单命令【文件】|【新建】|Microsoft Access Ver 7.0 MDB,打开【选择要创建的Microsoft Access数据库】对话框,在对话框中输入数据库文件名(如“Student.mdb”)并保存
4、后,VisData窗口的工作区将出现如图14.2所示的【数据库窗口】(此时为空库,无表)。,14.1.2 在VB环境中创建Access数据库(2),图14.1 可视化数据管理器 图14.2 数据库窗口,返回,14.1.2 在VB环境中创建Access数据库(3),3. 建立数据表 右击【数据库窗口】空白处,在弹出菜单中选择【新建表】菜单项,打开如图14.3所示的【表结构】对话框,输入表名称(如“基本情况”)后,单击【添加字段】按钮,打开如图14.4所示的【添加字段】对话框,输入字段名称,设置类型和大小(仅Text类型可设置大小)。添加了所有字段后,单击图14.3中的【生成表】按钮即可建立数据表
5、。在一个库中可建立多个不同名称的表。,14.1.2 在VB环境中创建Access数据库(4),图14.3 表结构,返回,14.1.2 在VB环境中创建Access数据库(5),图14.4 添加字段,返回,14.1.2 在VB环境中创建Access数据库(6),4. 添加索引 为数据表添加索引可以提高数据检索的速度。在图14.3所示的【表结构】对话框中单击【添加索引】按钮,打开如图14.5所示的【添加索引 到 基本情况】对话框。在【名称】文本框中输入索引名称(如“sNo”),在【可用字段】列表框中选择需要为其设置索引的字段(如“学号”),并设置是否为主索引或惟一索引(无重复)。5. 输入记录 双
6、击【数据库窗口】中数据表名称左侧的图标,打开如图14.6所示的记录操作窗口,可以对记录进行增、删、修改等操作。,14.1.2 在VB环境中创建Access数据库(7),图14.5 添加索引,返回,14.1.2 在VB环境中创建Access数据库(8),图14.6 记录操作,返回,返回首页,返回本节,14.1.3 用MS Access建立数据库(1),下面以MS Access 2000为例简介数据库的创建。1. 建立数据库 启动MS Access,在对话框中选定【空 Access 数据库】单选按钮。单击【确定】按钮后,在【文件新建数据库】对话框中选择保存位置并输入文件名,然后单击【创建】按钮。2
7、. 建立数据表 新建一个空白数据库后,在MS Access主窗口中将会出现如图14.9所示的数据库窗口。在此窗口中可以管理Access数据库的各组成部分。,14.1.3 用MS Access建立数据库(2),图14.9 创建数据表,返回,14.1.3 用MS Access建立数据库(3),在数据库窗口中双击【使用设计器创建表】图标,打开如图14.10所示的表设计器窗口【表1:表】,输入字段名称,设置字段的数据类型、字段大小及其他属性。 若需设置主键,可选定拟设为主键的字段,然后单击MS Access主窗口工具栏中的【主键】图标 ,此时,被设为主键的字段名左侧会出现钥匙状的图标,同时,【字段属性
8、】中的【索引】属性将自动设为【有(无重复)】。 全部字段设置结束后,关闭表设计器窗口,系统将显示如图14.11所示的对话框,可根据提示保存新建的数据表并设置表的名称。,14.1.3 用MS Access建立数据库(4),图14.10 设计表的结构,返回,14.1.3 用MS Access建立数据库(5),图14.11 保存数据表,返回,14.1.3 用MS Access建立数据库(6),若需修改数据表的结构定义(如添加、删除或修改字段),可在如图14.12所示的数据库窗口选定数据表(如“基本信息”),然后单击该窗口工具栏中的【设计】按钮,打开前面图14.10所示的表设计器窗口进行操作。,图14
9、.12 修改表结构,14.1.3 用MS Access建立数据库(7),如果要添加一个新表,可再次双击【使用设计器创建表】图标,或者单击工具栏【新建】按钮,在如图14.13所示的【新建表】对话框中选择【设计视图】后,单击【确定】按钮,均可打开如图14.10所示的表设计器窗口。,图14.13 添加新表,14.1.3 用MS Access建立数据库(8),3. 输入记录 在数据库窗口中双击数据表,或者选定表后单击工具栏中的【打开】按钮,打开如图14.14所示的数据表窗口,向表中输入数据。输入结束后关闭该窗口,根据系统提示保存数据表。,图14.14 输入记录,14.1.3 用MS Access建立数
10、据库(9),4. 建立表间关联关系 在一个数据库中,一般需要用多个表存放不同类别而又相互关联的信息。例如,在学生信息数据库中用“基本信息”表存放学生的学号、姓名、性别等基本情况,用“成绩”表存放学生的各科成绩,用“课程”表存放已开的课程。假设这三个表中含有如表14.3表14.5所示的信息,当需要查询某位学生的一门或几门课程的成绩时,就要从上述三个表中获取数据。假如某位学生的学号在最初输入时有误,需要修改,则必须确保“基本信息”表和“成绩”表中的“学号”字段进行同步更改。因此,应当为三个表建立必要的关联关系。,14.1.3 用MS Access建立数据库(10),注:* 为主键。,返回,14.1
11、.3 用MS Access建立数据库(11),建立表间关联关系的前提是两个表各含有一个关联字段(属性必须相同),其中一个表的关联字段必须被设为主键或具有惟一索引,该表称为“主表”,另一个表称为“从表” 。下面以表14.3表14.5为例,简介建立数据表之间关联关系的一般步骤。 单击Microsoft Access主窗口工具栏【关系】按钮 ,若数据库中尚未定义任何关系,则在打开【关系】窗口的同时弹出如图14.15所示的【显示表】对话框。 在【显示表】对话框中选定需要建立关系的表,单击【添加】按钮,然后单击【关闭】按钮,屏幕显示如图14.16所示的【关系】窗口。,14.1.3 用MS Access建
12、立数据库(12),图14.15 选择拟建立关系的表,返回,14.1.3 用MS Access建立数据库(13),图14.16 【关系】窗口,返回,14.1.3 用MS Access建立数据库(14), 在【关系】窗口将【基本信息】表中的【学号】字段拖放到【成绩】表中的【学号】字段,弹出如图14.17所示的【编辑关系】对话框。,图14.17 编辑关系,14.1.3 用MS Access建立数据库(15), 在【编辑关系】对话框中,将【实施参照完整性】、【级联更新相关字段】和【级联删除相关记录】三个复选框全部选中,单击【创建】按钮。 重复第、步的操作,建立【成绩】表中的【课号】字段与【课程】表中的
13、【课号】字段的关联。 建立表间关联关系后的效果如图14.18所示。,14.1.3 用MS Access建立数据库(16),图14.18 表间关系,返回首页,返回本节,14.2 VB如何访问数据库(1),目前,Visual Basic访问数据库的主流技术是ADO。ADO是一种基于对象的数据访问接口,在VB中提供了利用ADO访问数据库的两种主要形式:ADO数据控件(ADODC)和ADO对象编程模型(ADO代码)。这两种方式可以单独使用,也可以同时使用。 使用ADO数据控件的优点是代码少,一个简单的数据库应用程序甚至可以不用编写任何代码。它的缺点是功能简单,不够灵活,不能满足编制较复杂的数据库应用程
14、序的需要。,14.2 VB如何访问数据库(2),使用ADO对象编程模型的优点是具有高度的灵活性,可以编制复杂的数据库应用程序。它的缺点是代码编写量较大,对初学者来说有一定困难。无论采用哪种方式访问数据库,都要经历以下基本步骤: 与数据库建立连接,打开数据库。 从数据库中读取数据并在适当的控件中显示。 对所获数据进行浏览以及增、删、改等操作,并将修改后的数据存入数据库。 在后面的几节中将以ADO数据控件为主详细介绍VB访问数据库的基本操作。,返回首页,14.3 用控件访问数据库,14.3.1 ADO数据控件 14.3.2 数据绑定控件 14.3.3 使用数据窗体向导,返回首页,14.3.1 AD
15、O数据控件(1),1. 加载ADO数据控件 ADO数据控件属于ActiveX控件,加载后才能使用: 右击工具箱,在弹出菜单中选择【部件】菜单项,打开【部件】对话框,在【控件】选项卡的列表中选中“Mcrosoft ADO Data Control 6.0”前面的复选框,单击【确定】按钮。 2. 连接数据库及指定记录源 ADO数据控件与数据库的连接有3种方式:数据链接文件(.UDL)、ODBC(DSN)和字符串连接。与Access数据库建立连接的常用方式是字符串连接。,14.3.1 ADO数据控件(2),通常通过属性页一次完成连接数据库和指定记录源的设置。操作步骤如下: 将ADO数据控件(Adod
16、c)添加到窗体上,右击该控件,在弹出菜单中选择【ADODC属性】菜单项,打开如图14.20所示的【属性页】对话框。 在对话框【通用】选项卡中选择【使用连接字符串】,单击【生成】按钮,打开如图14.21所示的【数据链接属性】对话框。在【提供程序】选项卡的列表中选择“Microsoft Jet 4.0 OLE DB Provider”,单击【下一步】,切换到如图14.22所示的【连接】选项卡。,14.3.1 ADO数据控件(3),图14.20 ADODC属性页,返回,14.3.1 ADO数据控件(4),图14.21 选择提供程序,返回,14.3.1 ADO数据控件(5),图14.22 连接数据库,
17、返回,14.3.1 ADO数据控件(6), 在【连接】选项卡中单击【1.选择或输入数据库名称】输入框右侧的 按钮,在弹出的【连接 Access 数据库】对话框中选择数据库,单击【打开】按钮后返回【连接】选项卡,单击【测试连接】按钮,成功后单击【确定】,完成连接数据库的设置,返回【属性页】对话框。 单击【属性页】对话框【记录源】选项卡,显示如图14.23所示的界面,在【记录源】选项卡中设【命令类型】为“2-adCmdTable”,然后在【表或存储过程名称】下拉列表中选择数据表。也可以设【命令类型】为“1-adCmdText”或“8-adCmdUnknown”,然后在【命令文本(SQL)】文本框中
18、输入SQL语句(如图14.24所示)。最后单击【确定】按钮完成设置。,14.3.1 ADO数据控件(7),图14.23 用数据表作记录源,返回,14.3.1 ADO数据控件(8),图14.24 用SQL语句作记录源,返回,14.3.1 ADO数据控件(9),上述操作实际上是设置了ADO数据控件的两个重要属性: ConnectionString(连接字符串)属性用于建立与数据库的连接。 RecordSource(记录源)属性用于指定记录源。 除了使用属性页之外,也可以通过属性窗口或程序代码设置这两个属性。 在设置ADO数据控件与数据库的连接时,有一点要提请读者注意:,14.3.1 ADO数据控件
19、(10),如图14.22所示,在【数据链接属性】窗口的【连接】选项卡中指定数据库时采用的是绝对路径。为了保证数据库应用程序移植到其它计算机上仍可正常使用,应当采用相对路径,即在测试连接成功后删除数据库名称前面的所有路径(图14.22输入框中的反相显示部分),仅保留数据库文件名。将数据库文件与工程文件存放在同一文件夹下,在工程启动窗体的Initialize事件过程中进行路径初始化处理: Private Sub Form_Initialize() ChDrive App.Path 设当前驱动器为工程所在驱动器 ChDir App.Path 设当前目录为工程所在目录End Sub,14.3.1 AD
20、O数据控件(11),3. 用代码设置或改变记录源 ADO数据控件一旦建立了与数据库的连接,就可以通过设置或改变其RecordSource(记录源)属性访问数据库中的任何表,亦可访问由一个或多个表中的部分或全部数据构成的记录集。在实际应用中,常常在程序运行时用代码设置RecordSource属性及其相关属性(如CommandType),从而使ADO数据控件具有更大的灵活性。例如: 用数据表名称作为记录源:Adodc1.CommandType = adCmdTable 设置命令类型为数据表Adodc1.RecordSource = 基本信息Adodc1.Refresh,14.3.1 ADO数据控件
21、(12), 用SQL语句生成的记录集作为记录源:Adodc1.CommandType = adCmdText 设置命令类型为SQL语句Adodc1.RecordSource = SELECT * FROM 基本信息Adodc1.Refresh 上述两段代码的效果相同。有关SQL语言的应用将在14.5节介绍。 注意:设置记录源后,必须调用ADO数据控件的Refresh方法刷新对数据库的访问。,返回首页,返回本节,14.3.2 数据绑定控件(1),ADO数据控件本身不能显示数据,需通过绑定具有显示功能的其他控件显示数据,这些控件称为数据绑定控件或数据识别(感知)控件,如文本框、DataGrid、标
22、签、图像(片)框、列表框、组合框、复选框等。其中最常用的是DataGrid和文本框。1. 数据绑定控件的相关属性 DataSource(数据源)属性:指定(绑定到)ADO数据控件。 DataField(数据字段)属性:绑定到特定字段。绑定后只要移动指针,自动将修改内容写入数据库。,14.3.2 数据绑定控件(2),2. 在属性窗口设置绑定控件属性 在属性窗口将数据绑定控件的DataSource属性设为ADO数据控件(如Adodc1)。如果是单字段显示控件(如文本框等),还需将控件的DataField属性设置为特定字段。DataGrid控件属于多字段显示控件,没有DataField属性。 【例1
23、4.1】用ADO数据控件和DataGrid控件创建一个简单的数据访问窗体,显示14.1.3节创建的Student2K.mdb数据库中“基本信息”表的内容。,14.3.2 数据绑定控件(3),右击工具箱,在弹出菜单中选择【部件】命令,在对话框【控件】选项卡的列表中选中“Microsoft ADO Data Control 6.0”和“Microsoft DataGrid 6.0”,单击【确定】。选择工具箱中新增加的ADO数据控件和DataGrid控件 ,将其添加到窗体上,默认名称分别为Adodc1和DataGrid1。按14.3.1小节所述步骤建立Adodc1与Student2K.mdb数据库的
24、连接,并设Adodc1的记录源为“基本信息”表。将DataGrid1控件的DataSource属性设为Adodc1。程序运行效果如图14.25所示。,14.3.2 数据绑定控件(4),图14.25 使用DataGrid控件,14.3.2 数据绑定控件(5),3. 用代码设置绑定控件属性 程序运行时可以动态地设置数据绑定控件的属性。例如:Set Text1.DataSource = Adodc1Text1.DataField = 姓名Set DataGrid1.DataSource = Adodc1 说明:DataSource是对象类型的属性,必须用Set语句为其赋值。,14.3.2 数据绑定控
25、件(6),4. 不用绑定方法如何显示和处理数据 不使用绑定的方法处理数据是指不对数据显示控件的DataSource和DataField属性进行设置,而是通过代码将当前记录某个字段的值显示在控件(如文本框)中。这种方法比较灵活,缺点是代码编写量较大,其中涉及到记录集对象的操作。(1)字段内容的显示控件属性 = 记录集(“字段”)例如:Text1.Text = Adodc1.Recordset(学号)Text2.Text = Adodc1.Recordset(姓名),14.3.2 数据绑定控件(7),每当记录指针移动时均需对控件属性重新赋值。若需要显示的字段较多,可以编制一个自定义过程用于记录指针
26、移动时显示各字段内容。(2)为字段赋值记录集(“字段”) = 控件属性例如:Adodc1.Recordset(学号) = Text1.TextAdodc1.Recordset(姓名) = Text2.TextAdodc1.Recordset.Update 说明:为字段赋值后,应调用记录集的Update方法更新数据库。,返回首页,返回本节,14.3.3 使用数据窗体向导(1),使用“数据窗体向导”可以快速创建一个数据访问窗体。 执行【工程】菜单中【添加窗体】命令,打开如图14.26所示的对话框,在【新建】选项卡中选择【VB数据窗体向导】,单击【打开】按钮后将会出现向导的第一个对话框。 如果是创建
27、单表访问窗体,数据窗体向导将有七个步骤:【介绍】、【数据库类型】、【数据库】、【窗体(Form)】、【记录源】、【控件选择】和【完成】,可根据向导提示操作。 图14.27是利用数据窗体向导创建的数据窗体,数据库为Student2K.mdb,记录源为“基本信息”表中的所有字段。向导中的其他步骤均采用默认设置。,14.3.3 使用数据窗体向导(2),图14.26 启动数据窗体向导,返回,14.3.3 使用数据窗体向导(3),图14.27 用数据窗体向导创建的数据窗体,返回,返回首页,返回本节,14.4 初识记录集对象(1),无论是使用ADO数据控件,还是使用ADO对象编程模型,都会涉及到记录集对象
28、。因此,在进一步讨论数据库操作之前,有必要初步了解一下记录集对象。 请看下面来自学生数据库的几个集合: 取“基本信息”表中所有学生的记录构成一个集合; 取“基本信息”表中所有男生的记录构成一个集合; 取“基本信息”表中张三的学号和姓名,根据其学号取“成绩”表(含学号、课号和分数三个字段)中该学生的各科成绩构成一个集合。,14.4 初识记录集对象(2),以上几个集合都是“记录的集合”,由此得出以下概念: 将数据库中一个或多个表中的部分或全部数据构成一个“记录的集合”,这个集合就称为“记录集”(Recordset)。记录集由行(记录)和列(字段)构成。若将记录集看作一个对象,这个对象就是记录集对象
29、。记录集对象具有特定的属性、方法和事件。 ADO数据控件的Recordset属性代表属于本控件的记录集对象。 记录集对象是ADO中的一个功能强大的对象,对数据库的绝大部分操作,如记录指针的移动,记录的查找、添加、删除和修改等,都是针对记录集对象进行的。,返回首页,14.5 用SQL语句生成记录集,14.5.1 最简单的SQL语句 14.5.2 限定记录集筛选条件 14.5.3 在VB程序中如何使用SQL语句 14.5.4 记录排序 14.5.5 记录分组 14.5.6 过滤重复记录,返回首页,14.5.1 最简单的SQL语句 (1),1. 最简单的查询语句 下面的SQL语句是最简单的查询形式,
30、生成的记录集包含整个表的全部数据: SELECT * FROM 基本信息 其中“*”指表中所有字段(列)。FROM子句用于指定数据表。 2. SELECT语句的基本语法 在实际应用中,往往需要从一个或多个表中选择符合特定条件的记录构成记录集,因此应对SELECT语句的语法有一定的了解。以下是SELECT语句的基本语法。,14.5.1 最简单的SQL语句 (2),SELECT * | 字段列表 FROM 表名 WHERE 查询条件 GROUP BY 分组字段 HAVING 分组条件 ORDER BY 排序字段 ASC | DESC说明: * | 字段列表:“*”表示所有字段;“字段列表”指定字段
31、,多个字段间用逗号分隔,来自不同表的同名字段前须加表的名称和圆点。 FROM子句:指定表。若指定多个表,用逗号分隔。 WHERE子句:指定选择记录的条件。,14.5.1 最简单的SQL语句 (3),GROUP BY及HAVING子句:分组过滤,将分组字段中同值记录合并为一条记录。 ORDER BY:排序。ASC为升序(默认);DESC为降序。【例14.2】选择“基本信息”表中的“学号”和“姓名”字段,“成绩”表中的“课号”和“分数”字段构成记录集。 SELECT 基本信息.学号,姓名,课号,分数 FROM 基本信息,成绩 WHERE 基本信息.学号=成绩.学号,返回首页,返回本节,14.5.2
32、 限定记录集筛选条件(1),在SELECT语句的各子句中,WHERE子句使用频率最高。该子句指明查询的条件。在WHERE子句中可使用各种关系(比较)运算符表示筛选记录的条件。,14.5.2 限定记录集筛选条件(2),【例14.3】选择“基本信息”表中所有男生构成记录集:SELECT * FROM 基本信息 WHERE 性别 = 男 【例14.4】取“基本信息”表中张三的学号和姓名,根据其学号取“成绩”表中该学生的各科成绩构成记录集:SELECT 基本信息.学号,姓名,课号,分数 FROM 基本信息,成绩 WHERE 基本信息.学号=成绩.学号 AND 姓名=张三 在WHERE子句中使用Like
33、运算符可实现模糊查询。SQL语句中Like运算符的通配符是“%”,可代表任何字符,字符数不限。,14.5.2 限定记录集筛选条件(3),【例14.5】用Like运算符进行模糊查询。 查询所有姓“张”的学生:SELECT * FROM 基本信息 WHERE 姓名 Like 张% 查询所有姓名中含有“小”字的学生:SELECT * FROM 基本信息 WHERE 姓名 Like %小% 查询姓名最后一个字为“刚”的所有学生:SELECT * FROM 基本信息 WHERE 姓名 like %刚,返回首页,返回本节,14.5.3 在VB程序中如何使用SQL语句(1),在程序代码中,SQL语句必须以字
34、符串形式提供。例如:Adodc1.RecordSource = SELECT * FROM 基本信息 如果SQL语句中含有字符串常量,必须将字符串常量放在一对单引号中。【例14.6】在SQL语句中引用字符串常量。Dim strSQL As StringstrSQL = SELECT * FROM 基本信息 WHERE 性别 = 男Adodc1.RecordSource = strSQL 如果SQL语句中引用了String型变量或其他控件的字符串类型的属性(如文本框的Text属性),应当采用下面的引用形式(注意单引号的位置): . & 字符串变量或控件属性 & . ,14.5.3 在VB程序中如
35、何使用SQL语句(2),【例14.7】在SQL语句中引用字符串变量。Dim strSQL As String, strSex As StringstrSex = 男strSQL = SELECT * FROM 基本信息 WHERE 性别 = _ & strSex & Adodc1.RecordSource = strSQL【例14.8】在SQL语句中引用控件的字符串类型的属性。Dim strSQL As StringText1.Text = 张strSQL = SELECT * FROM 基本信息 WHERE 姓名 Like _ & Text1.Text & %Adodc1.RecordSou
36、rce = strSQL,14.5.3 在VB程序中如何使用SQL语句(3),如果SQL语句中引用了非字符串类型的变量或控件属性,不使用单引号。【例14.9】在SQL语句中引用非字符串类型的变量。Dim strSQL As String, intGrade As IntegerintGrade = 60strSQL = SELECT * FROM 成绩 WHERE 分数 = _ & intGrade & AND 课程=英语Adodc1.RecordSource = strSQL,返回首页,返回本节,14.5.4 记录排序,用ORDER BY子句(ASC为升序,DESC为降序)对记录排序。例如:
37、SELECT * FROM 基本信息 ORDER BY 学号 ASCSELECT * FROM 基本信息 ORDER BY 姓名 DESC,返回首页,返回本节,14.5.5 记录分组,用GROUP BY子句将指定字段中数值相等的多条记录合并为一条记录。可用HAVING子句附加条件。【例14.10】以“班级”作为分组字段,查询各班女生人数。SELECT 班级,Count(*) AS 女生 FROM 基本情况 GROUP BY 班级,性别 HAVING 性别=女说明:上面的语句中Count(*)表示统计记录总数,AS子句表示存放统计结果的临时字段别名。其他SQL函数还有Sum、Avg、Max和Mi
38、n等。,返回首页,返回本节,14.5.6 过滤重复记录(1),过滤重复记录是指忽略字段值相同的重复记录。例如,假定学籍表中含有400名学生的信息,这些学生来自10个班级,现在要查询学籍表中的“班级”字段生成一个班级名称记录集,如果不进行筛选过滤,则生成的记录集将含有400条记录,会有很多班级名称相同的重复记录。过滤重复记录后,可以生成仅含10个记录的记录集,每个班级的名称都是惟一的。过滤重复记录实际上是对记录进行分类,可以通过下面的方法实现。,14.5.6 过滤重复记录(2),1. 用DISTINCT关键字 在SELECT语句中使用DISTINCT关键字忽略重复记录。例如,以下语句可以过滤重复
39、记录和空字段:SELECT DISTINCT 班级 FROM 学籍 WHERE 班级NULL AND 班级2. 用GROUP BY子句 如前所述,用GROUP BY子句可以对记录进行分组,实现重复记录的过滤。例如:SELECT 班级 FROM 学籍 GROUP BY 班级 HAVING 班级NULL AND 班级,返回首页,返回本节,14.6 数据库记录的操作,14.6.1 如何移动记录指针 14.6.2 如何查找记录 14.6.3 如何添加记录 14.6.4 如何修改记录 14.6.5 如何删除记录,返回首页,14.6.1 如何移动记录指针(1),1. 使用ADO数据控件 ADO数据控件上有
40、4个导航按钮 ,依次为首记录、上一记录、下一记录、末记录。使用这些按钮移动记录指针无须编写代码。 2. 使用程序代码 有时因为用户界面的需要,将ADO数据控件隐藏(Visibal=False),只能通过编写代码实现记录指针的移动。具体步骤如下: 在窗体上放置4个命令按钮,分别为首记录、上一记录、下一记录、末记录。,14.6.1 如何移动记录指针(2),在上述按钮的单击事件中,分别用记录集对象(ADO数据控件的Recordset属性)的Move方法组移动记录:Adodc1.Recordset.MoveFirst 首记录Adodc1.Recordset.MovePrevious 上一记录Adodc
41、1.Recordset.MoveNext 下一记录Adodc1.Recordset.MoveLast 末记录记录指针的移动如图14.29所示。,14.6.1 如何移动记录指针(3),14.6.1 如何移动记录指针(4),BOF和EOF是记录集的两个特殊位置,BOF位于第一个记录之前(记录集头),EOF位于最后一个记录之后(记录集尾)。当记录指针移到BOF时,若再向前(MovePrevious)移动,或移到EOF时,再向后(MoveNext)移动,将会引发错误。采用下面的措施可以防止发生此类错误。 在“上一记录”按钮的单击事件中作如下处理:,14.6.1 如何移动记录指针(5),Adodc1.R
42、ecordset.MovePreviousIf Adodc1.Recordset.BOF = True Then _ Adodc1.Recordset.MoveFirst 在“下一记录”按钮的单击事件中作如下处理:Adodc1.Recordset.MoveNextIf Adodc1.Recordset.EOF = True Then _ Adodc1.Recordset.MoveLast,返回首页,返回本节,14.6.2 如何查找记录 (1),1. 用Find方法 记录集的Find方法搜索记录集中满足指定条件的记录(不区分大小写)。如果条件满足,则记录集指针定位于找到的记录上,否则指针定位于记
43、录集的末尾(EOF)。语法:记录集.Find 条件,跳行,搜索方向,开始位置参数说明: 条件:字符串,类似于SQL语句中WHERE子句的条件,包括字段名、比较操作符和比较值。,14.6.2 如何查找记录 (2),如果比较操作符为“like”,则比较值可以含有一个“%”(只能放在字符串最后),实现模糊比较。例如:“姓名 like 王%” 若与变量或控件属性值比较,需用&连接。例如:Adodc1.Recordset.Find “用户名=” & _ txtUserID.Text & “” 跳行:可选,长整型值,其默认值为零,指定搜索的位移量。若该选项设为1,连续执行Find方法,可依次找出每个符合条
44、件的记录。,14.6.2 如何查找记录 (3), 搜索方向:可选。其值可为adSearchForward(头尾)或adSearchBackward(尾头)。 开始位置:可选,变体型书签,用作搜索的开始位置。0:从当前行开始,1:从首记录开始,2:从末记录开始。 调用Find方法时,通常只带有条件参数即可,调用前先将记录指针指向首记录。【例14.11】用记录集的Find方法查找记录。RecordCount为记录总数。,14.6.2 如何查找记录 (4),若非空记录集If Adodc1.Recordset.RecordCount 0 Then Adodc1.Recordset.MoveFirst
45、Adodc1.Recordset.Find 姓名 = 张三 If Adodc1.Recordset.EOF = True Then MsgBox 未查到姓名为张三的记录。 End IfEnd If2. 用循环结构 通过循环结构遍历记录集(适用于各种类型),查找符合条件的记录(默认区分大小写)。,14.6.2 如何查找记录 (5),【例14.12】用循环结构查找记录。Adodc1.Recordset.MoveFirstDo While Not Adodc1.Recordset.EOF 找到,退出循环 If Adodc1.Recordset(姓名) = 李四 Then Exit Do Adodc1
46、.Recordset.MoveNextLoop若指针指向记录集尾,说明未找到If Adodc1.Recordset.EOF = True Then .Else 否则,说明找到符合条件的记录 .End If,14.6.2 如何查找记录 (6),3. 用SQL语句 用SQL语句生成只包括待查记录的记录集,若BOF和EOF均为True,则为空记录集。【例14.13】用SQL语句查找符合条件的记录。Dim strSQL As StringstrSQL = SELECT * FROM 用户 WHERE 用户名= _ & txtUserID.Text & Adodc1.RecordSource = str
47、SQLAdodc1.RefreshIf Adodc1.Recordset.BOF = True _ And Adodc1.Recordset.EOF = True Then MsgBox 无此用户!End If,返回首页,返回本节,14.6.3 如何添加记录 (1),用记录集的AddNew方法添加记录。 语法: 记录集.AddNew 字段名, 字段值 可以先用无参数的AddNew方法添加一个空记录,然后为字段赋值,最后调用记录集的Update方法更新数据库。 【例14.14】用记录集的AddNew方法添加记录。 Adodc1.Recordset.AddNew Adodc1.Recordset(学号) = 030101001,14.6.3 如何添加记录 (2),Adodc1.Recordset(姓名) = 张三Adodc1.Recordset.Update也可以通过控件属性或变量为字段赋值,例如用文本框中的内容为字段赋值:Adodc1.Recordset.AddNewAdodc1.Recordset(学号) = txtNo.TextAdodc1.Recordset(姓名) = txtName.TextAdodc1.Recordset.Update 注意:如果在调用Update方法之前移动了记录指针,系统将自动调用Update方法。,