570 likes | 711 Views
第13章 数 据 库. 本章要点: • 数据库的基本概念 • 可视化数据管理器 • 数据控件和数据绑定控件 • 使用 ADO 访问数据. 13.1 数据库的基本概念. 数据管理: 手工管理→文件管理→数据库管理 数据库功能: 数据的组织 ; 数据的管理 数据的组织 : 数据库( Data Base:DB) — 以一定方式组织并存储在一起的相互有关的数据的集合。按组织方式的不同,分为三种模型,即: 关系数据库 ;层次数据库;网状数据库。
E N D
第13章 数 据 库 本章要点: •数据库的基本概念 •可视化数据管理器 •数据控件和数据绑定控件 •使用ADO访问数据
13.1 数据库的基本概念 • 数据管理: 手工管理→文件管理→数据库管理 • 数据库功能: 数据的组织;数据的管理 • 数据的组织: 数据库(Data Base:DB)—以一定方式组织并存储在一起的相互有关的数据的集合。按组织方式的不同,分为三种模型,即: 关系数据库;层次数据库;网状数据库。 • 数据的管理: 数据库管理系统(DBMS)—用户与数据库之间的接口,提供对数据库使用和加工的操作,如对数据库的建立、修改、检索、计算、统计、删除等。 • VB可以处理多种数据库: 如Access、FoxPro、DataBase、Excel、Paradox等格式的数据库。
13.1 数据库的基本概念 13.1.1 关系数据库的结构 1. 表: 将相关的数据按行和列的形式组织成二维表格即为表,表通常用于描述某一个实体。 2. 表名称: 每个数据表的名称。 3. 关系数据库: 将数据存储在一些二维表中,然后 通过建立各表之间的关系来定义数据库的结构。一个数据库通常包含多个数据表。 4. 数据库名称 : ACCESS数据库扩展名为.mdb
13.1 数据库的基本概念 • 例如: “学生.mdb”数据库 • (1) “学生基本信息” 表 (2)“专业” 表 (3)“系” 表
13.1 数据库的基本概念 以上三个表构成一个数据库。 “学生基本信息”表与“专业”表通过“专业编号”建立关系。 “专业”表与“系”表通过“系编号”建立关系。 5. 表的结构 记录: 表中的每一行称为一个记录。 字段: 表中的每一列称为一个字段。 字段名: 每个字段一个名称。 字段类型: 每个字段一种类型。 表的结构按字段定义。
13.1 数据库的基本概念 6. 表中的关键字 •候选关键字: 如果表中的某个字段或多个字段组合 能唯一地确定一个记录,称该字段或多个字段组合为侯选关键字。侯选关键字可以有多个。 •主关键字: 只能有一个。 7. 表间的关联 按照某一个公共字段建立的一个表中记录同另一个表中记录之间的关系。 有一对一、一对多(或多对一)、多对多关系。 8. 外部键 实现与另一个表之间沟通的字段称为“外部键” 。 外部键与其他表的主关键字相匹配 。
13.1 数据库的基本概念 9. 索引 •为了加速查找而引入 • 按某个字段(或字段组合)排序 •每个表可以有多个索引,但只能有一个是主索引 • 每个索引有一个名称
13.1 数据库的基本概念 13.1.2 数据访问对象模型 在VB中,要对数据库进行访问,需要通过数据访问对象进行,数据访问对象包括: 1. DAO: Data Access Object —数据访问对象 2. RDO: Remote Data Object —远程数据对象 3. ADO: ActiveX Data Object —ActiveX数据对象 ADO是DAO/RDO的后继产物,它扩展了DAO和RDO所使用的对象模型,包含较少的对象,更多的属性、事件和方法。 通过ADO可以访问各种各样的数据源。 13.1.3 结构化查询语言(SQL) SQL—Structured Query Language 实现对数据库的检索、排序、统计、修改等多种操作。
13.2 可视化数据管理器 提供可视界面,用于建立数据库;对数据库进行修改、添加、删除、查询等操作。 13.2.1 启动可视化数据管理器 外接程序→可视化数据管理器 13.2.2 新建数据库 文件→ 新建→Microsoft Access→Verson 7.0 MDB →确定数据库文件保存位置及名称 显示: 数据库窗口、SQL语句窗口 13.2.3 打开数据库 打开: 文件→打开数据库→Microsoft Access 13.2.4 添加表 (1) 在数据库窗口快捷菜单中选择“新建表”项 (2) 在打开的“表结构”对话框添加字段和索引
动态集类型 回滚当前事务 开始事务 表类型 快照类型 提交当前事务 使用Data控件 使用DBGrid控件 不使用Data控件 13.2 可视化数据管理器 • 13.2.5 数据的增加、删除、修改 • 1. 确定记录集的类型和数据的显示方式
13.2 可视化数据管理器 (1) 记录集类型 记录集对象(Recordset对象) : 是指来自基本表或查询结果的记录全集。 VB使用记录集对象访问数据库中的记录。 三种记录集类型: 表类型(Table): 直接更新数据表中的数据。 动态集类型(Dynaset): 更新操作先在内存中进行。 快照类型(Snapshot): 数据仅供读取。 (2) 在数据编辑窗口数据记录的显示方式 使用Data控件: 不使用Data控件:使用滚动条 使用DBGrid控件
13.2 可视化数据管理器 (3) 事务方式 事务: 指对数据库的数据所作的一系列改变。 开始事务: 开始一个新的事务。 回滚当前事务: 撤消自开始事务以来所作的一切改变。 提交当前事务: 确认自开始事务以来对数据库所做的修改,原有数据将不能恢复。 2. 数据的增加、删除、修改 在数据库窗口中右击表名打开 13.2.6 数据的查询 1. 使用查询生成器 实用程序→查询生成器→保存查询 保存的查询名显示在数据库窗口中。
13.2 可视化数据管理器 显示查询: 右击查询名称→打开 修改查询: 右击查询名称→设计 在SQL窗口显示SQL语句。 • 通过修改SQL语句来修改查询。 • 单击“执行”按钮显示查询结果。 • 单击“保存”按钮保存查询。 • 单击“清除”按钮清除该SQL语句。 2. 使用SQL语句 (1) Select语句 Select [ALL|DISTINCT] <字段名表>From <表名> [Where <条件>] [Order By <排序字段> [ASC|DESC],…] 功能: 从指定的表中选出满足条件的记录,记录中包含指定的字段。
13.2 可视化数据管理器 ALL: 缺省值,显示查询到的所有记录。 DISTINCT: 在显示查询结果中如果有多个相同的记录,只取其中的一个。使用DISTINCT可以保证查询结果每一条记录的唯一性。 <表名>: 指出所要查询的表,可以指定多个表,各表名之间用逗号隔开。 <条件>: 指出查询的条件。 <字段名表> : 指明要在查询结果中包含的字段名,具体形式为: 表名.字段名,各项之间用逗号隔开,如果选择所有字段,则不用一一列出字段名,只需写成: 表名.*。 <排序字段> : 将查询结果按该字段排序。 ASC: 指定按升序排序。 ESC: 指定按降序排序。
13.2 可视化数据管理器 • 例: 选出学生基本信息表中所有男生记录,查询结果只包括班级、学号和姓名字段: Select 学生基本信息.班级,学生基本信息.学号, 学 生基本信息.姓名 From 学生基本信息 Where 学生基本信息.性别 = '男' 对于单个表的查询,可以省去各字段名前面的表名,以上Select语句可以简写成: Select 班级,学号,姓名 From 学生基本信息 Where 性别 = '男' • 例: 显示学生基本信息表中男生的所有信息: Select * From 学生基本信息 Where 性别 = '男' • 例:显示所有学生的学号、姓名和所在专业名、系名: Select 学生基本信息.学号,学生基本信息.姓名,专业.专业名称,系.系名 From 学生基本信息,专业,系 Where 学生基本信息.专业编号=专业.专业编号 And 专业.系编号=系.系编号
13.2 可视化数据管理器 (2) Insert语句 例: 设新建一个“新系”表,包括“系编号”、“系名” ①Insert Into 系 Select 系编号,系名 From 新系 Where 新系.系编号='005' 表示从“新系”表中选择系编号为005的记录,并将其添加到“系”表中。 ②Insert Into 系 Select 系编号,系名 From 新系 表示从“新系”表中选择所有记录,并将其添加到“系”表中。 ③Insert Into 新系 (系编号,系名) Values ('007', '城市建设') 表示向“新系”表中添加一条新记录,系编号字段值为“007”,系名字段值为“城市建设”。
13.2 可视化数据管理器 (3) Delete语句 从一个或多个表中删除指定的记录。 例: Delete From 新系 Where 系编号>='005' 表示从“新系”表中删除所有系编号大于“005”的记录。 (4) Update语句 更改表中一个或多个行的列值。 例: 设在某“职工工资”数据表中包含“姓名”、“性别”、“基本工资”、“奖金”、“实发工资”字段。 给所有女职工增加2%的奖金。使用语句: Update 职工工资 Set 基本工资=基本工资 * 1.02 Where 性别 = '女' 在增加奖金之后计算实发工资,使用语句: Update 职工工资 Set 实发工资=基本工资+奖金
13.2 可视化数据管理器 • 13.2.7 数据窗体设计器 将数据库中的数据或查询结果显示在界面上。 在当前工程中建立数据窗体: 实用程序→数据窗体设计器命令
绑定控件 数据控件 数据库 13.3 数据控件和数据绑定控件 数据控件: Data控件。VB早期版本提供的用于访问数据库数据的控件。用它建立与数据库的关联,并确定记录集类型。 利用Data控件可以对数据库中的数据进行操作,却不能显示数据库中的数据 绑定控件: 用于显示由数据控件所确定的记录集中的数据。 绑定控件、数据控件和数据库之间的关系如下:
13.3 数据控件和数据绑定控件 13.3.1 数据控件(Data控件): 内部控件 1. 属性 (1) DatabaseName: 数据源的名称及位置。 如 D:\mydb\学生.mdb。 (2) Connect: 连接的数据库类型。如“Access” (3) RecordSource: 数据来源,可以是数据表名称、SQL语句或是一个查询名。 (4) Recordset: 由Data控件所确定的记录集对象。 (5) BOFAction: 指示BOF属性为True时进行什么操作。 0-Move First 将第一个记录做为当前记录。 1–BOF 将当前记录位置定位在第一个记录之前。 记录集的BOF值保持True,此刻禁止Data控件上的Move Previous按钮。
13.3 数据控件和数据绑定控件 (6) EOFAction: 指示EOF属性为True时进行什么操作 0–MoveLast 保持最后一个记录为当前记录。 1–EOF 将当前记录定位在最后一个记录之后。记录集的EOF值保持True,此刻禁止Data控件上的MoveNext按钮。 2-AddNew 移过最后一个记录时自动添加一个新记录。 (7) ReadOnly: 只读(True) (8) RecordsetType: 表、动态集、快照 2. 方法 (1) Refresh: 如果DatabaseName、ReadOnly、或Connect属性的设置值发生了改变,可以使用Refresh方法来打开或重新打开数据库。
13.3 数据控件和数据绑定控件 (2)UpdateControls: 从记录集中取得当前记录,并且在绑定控件中显示当前的数据。 (3)UpdateRecord: 将被绑定控件的当前值保存到数据库中。 3. 事件 (1) Error 代码中的错误可以捕获,由错误处理程序处理。 而其他对数据库的操作在错误时发生Error事件,可在该事件过程中编写错误处理代码。 (2) Reposition: 在一条记录成为当前记录之后产生。 (3) Validate: 在移动到另一条记录之前、Update方法之前,以及进行Delete、Unload等操作之前产生。
13.3 数据控件和数据绑定控件 • 13.3.2 Recordset对象的属性与方法 Data控件的Recordset属性实际上是一个对象—Recordset对象。因此有其属性和方法。 1. 属性 (1) AbsolutePosition 指定Recordset对象当前记录的序号位置。 第一条记录的AbsolutePosition值为0。 在第一条记录成为当前记录后具有明确值。 例:在数据绑定控件上显示第6条记录 Data1.Recordset.AbsolutePosition = 5 Data1.UpdateControls (2) Bookmark 返回唯一标识Recordset对象中当前记录的书签,或者将Recordset对象的当前记录设置为由有效书签所标识的记录。
13.3 数据控件和数据绑定控件 (3) BOF、EOF 当前记录在最后一个记录之后时,EOF值为True 当前记录在第一个记录之前时,BOF值为True (4) RecordCount: 指示当前记录的总数 (5) NoMatch: 指示当使用Seek 方法或Find 方法进行查找时,是否找到匹配的记录,当找到指定的记录时,值为True,否则,值为False (6) Fields: Fields属性是一个集合。集合中包含所有Field(字段)对象。 每个Field对象对应于Recordset中的一列。 使用Field对象的Value属性可设置或返回当前记录的数据。
13.3 数据控件和数据绑定控件 • 例: 在窗体上显示当前记录的“姓名”字段的内容: Print Data1.Recordset.Fields("姓名").Value • 例: 将当前记录的“班级”字段改成“道99-3”: Data1.Recordset.Fields("班级").Value="道99-3" 或简写成: Data1.Recordset.Fields("班级") = "道99-3" (7) Index属性 设置或返回表类型记录集中的当前索引名称,该索引名称必须是已经定义的一个索引。设置或返回的值为字符串类型。 • 例:设置学生基本信息表的索引为名称为xh的索引。 Data1.Recordset.Index = "xh"
13.3 数据控件和数据绑定控件 2. 方法 (1) MoveFirst;MoveLast;MoveNext;MovePrevious MoveFirst: 将当前行记录指针移到第一条记录 MoveLast: 将当前行记录指针移到最后一条记录 MoveNext: 将当前行记录指针移到前一条记录 MovePrevious: 将当前行记录指针移到后一条记录 (2) Move: 将当前记录向前或向后移动指定的条数 格式: Move n n为正数时向后移动,n为负数时向前移动。 (3) AddNew: 在记录集中添加一条新记录。
13.3 数据控件和数据绑定控件 • 例: 给“学生基本信息”表添加一条新记录。 Data1.Recordset.AddNew Data1.Recordset.Fields("学号") = "980010104" Data1.Recordset.Fields("姓名") = "刘小波" Data1.Recordset.Fields("班级") = "建98-01" Data1.Recordset.Fields("性别") = "男" Data1.Recordset.Fields("专业编号") = "001" Data1.Recordset.Fields("出生日期") = #1/23/1980# Data1.Recordset.Update
13.3 数据控件和数据绑定控件 (4) Update: 保存对Recordset对象的当前记录所做的所有更改。 (5) Delete方法: 删除当前记录。 删除当前记录后,在移动到其他记录之前已删除的记录将保持为当前状态。一旦离开已删除记录,则无法再次访问它。 (6) Edit方法: 在对记录内容进行修改之前,需要使用该方法使记录处于编辑状态。 例: 要将当前记录的“班级”字段改成“道99-3”,需要先使用Edit方法: Data1.Recordset.Edit Data1.Recordset.Fields("班级") = "道99-3" Data1.Recordset.Update
13.3 数据控件和数据绑定控件 (7) FindFirst;FindLast;FindNext;FindPrevious 在指定的Dynaset或Snapshot类型的Recordset对象中查找与指定条件相符的记录,并使之成为当前记录。 如果要在表类型记录集中查找,需使用Seek方法。 FindFirst <条件字符串>: 查找满足条件的第一条记录。 FindLast <条件字符串>: 查找满足条件的最后一条记录。 FindNext <条件字符串>: 从当前记录开始查找下一条满足条件的记录。 FindPrevious <条件字符串>:从当前记录开始查找上一条满足条件的记录
13.3 数据控件和数据绑定控件 (8) Seek方法 在表类型记录集中查找满足条件的记录,使用之前必须先打开索引,要查找的内容为索引字段的内容。 Recordset.Seek <比较字符>, <关键字1>,<关键字2>… 比较字符为字符串类型: < 、 <= 、 = 、 >= 、 > 可以有多个关键字,分别对应于当前索引字段。 Seek总是在当前记录集中找出满足条件的第一条记录,如果在同一个记录集中多次使用同一个Seek方法,那么找到的总是同一条记录。 例如:打开学生基本信息表的学号索引(名称为xh),查找学号为“990020203”的记录: Data1.Recordset.Index = "xh" Data1.Recordset.Seek "=", "990020203"
13.3 数据控件和数据绑定控件 • 13.3.3 数据绑定控件 要使数据绑定控件能够显示数据库记录集中的数据,必须首先在设计时或在运行时设置这些控件的两个属性: DataSource属性: 返回或设置一个数据源,通过该数据源,数据绑定控件被绑定到一个数据库。 DataField属性: 返回或设置数据绑定控件将被绑定到的字段名。
Text1 Text2 Text3 Text4 13.3 数据控件和数据绑定控件 • 【例13-1】利用 “学生”数据库中的数据,用文本框显示“学生基本信息”表中的班级、学号、姓名、性别。使用命令按钮实现记录的向前、向后移动。 • 设计界面如下图所示。
13.3 数据控件和数据绑定控件 “上一个”按钮: 显示上一个记录,当显示到第一个记录时,继续单击“上一个”按钮,则该按钮变为无效,而把焦点定位到“下一个”按钮。 “下一个”按钮: 显示下一个记录,当显示完最后一个记录后,再单击“下一个”按钮,则该按钮无效,焦点定位到“上一个”按钮。 文本框: 用于浏览数据,不允许修改。 运行时不显示Data控件。
13.3 数据控件和数据绑定控件 “上一个”按钮: 显示上一个记录,当显示到第一个记录时,继续单击“上一个”按钮,则该按钮变为无效,而把焦点定位到“下一个”按钮。 “下一个”按钮: 显示下一个记录,当显示完最后一个记录后,再单击“下一个”按钮,则该按钮无效,焦点定位到“上一个”按钮。 文本框: 用于浏览数据,不允许修改。 运行时不显示Data控件。
13.3 数据控件和数据绑定控件 • “上一个”按钮Command1的Click事件过程如下: Private Sub Command1_Click() Command2.Enabled = True If Data1.Recordset.BOF Then Command1.Enabled = False Command2.SetFocus Else Data1.Recordset.MovePrevious End If End Sub
13.3 数据控件和数据绑定控件 • “下一个”按钮Command2的Click事件过程如下: Private Sub Command2_Click() Command1.Enabled = True If Data1.Recordset.EOF Then Command2.Enabled = False Command1.SetFocus Else Data1.Recordset.MoveNext End If End Sub
13.3 数据控件和数据绑定控件 • 【例13-2】利用 “学生”数据库中的数据,使用表格控件浏览数据库中的数据。在表格中显示系名称、专业名称、班级、学号、姓名,性别。 设计步骤如下: (1) 先生成一个查询。查询名称为“综合信息” Select 系.系名,专业.专业名称,学生基本信息.班级, 学生基本信息.学号,学生基本信息.姓名, 学生基本信息.性别 From 专业,系,学生基本信息 Where 专业.系编号=系.系编号 And 专业.专业编号=学生基本信息.专业编号 (2) 打开“部件”对话框,选择Microsoft FlexGrid Control 6.0,添加MSFlexGrid。并添加到窗体上
MSFlexGrid 13.3 数据控件和数据绑定控件 (3) 向窗体上添加一个Data控件Data1。 (4) 设置Data控件的以下属性: DatabaseName —E:\Mydb\学生.mdb RecordSource —综合信息 (5) 设置MSFlexGrid的以下属性: DataSource—Data1 FixCol—0(没有左侧的固定列) 运行结果如下:
13.4 使用ADO访问数据 ADO: ActiveX Data Objects Microsoft的一个最新的数据访问技术 通过OLE DB访问数据 13.4.1 ADO对象模型 使用ADO对象之前,首先要向当前工程添加ADO的对象库。 添加方法: 工程引用打开“引用”对话框选择“Microsoft ActiveX Data Object 2.0 Library”选项。
Connection对象 Error集合 Error对象 Command对象 Parameter集合 Parameter对象 Recordset对象 Field集合 Field对象 13.4 使用ADO访问数据 • ADO对象模型定义了一个可编程的分层对象集合,如下图所示:
13.4 使用ADO访问数据 1. Connection对象 Connection对象用于连接数据源。 例: 使用以下语句连接并打开一个Access数据库 “学生.mdb”。 ' 建立一个Connection对象Mycon Dim Mycon As New ADODB.Connection ' 定义Mycon对象的ConnectionString属性 Mycon.ConnectionString ="provider=Microsoft jet OLEDB 3.51;" &"data source=D:\mydb\学生.mdb" ' 按指定的连接打开数据库 Mycon.Open 打开数据库之后,接下来就可以使用Recordset对象实现对数据库的各种操作。
13.4 使用ADO访问数据 • 2. Recordset对象 • 同样可以对ADO的Recordset对象进行数据记录的移动操作、数据的搜索、记录的添加、删除、更新等,也可以使用BOF和EOF来判断记录的位置。 • 【例13-3】打开学生数据库“D:\mydb\学生.mdb”,显示学生数据库中所有学生的姓名。 • (1) 添加“Microsoft ActiveX Data Object 2.0 Library” • (2) 编写代码: • Private Sub Form_Load() • ' 定义Mycon为Connection对象 • Dim Mycon As New ADODB.Connection • ' 定义MyRS为Recordset对象 • Dim MyRS As New ADODB.Recordset
13.4 使用ADO访问数据 Mycon.ConnectionString = _ "provider=Microsoft.jet.OLEDB.3.51;" & _ "data source=D:\mydb\学生.mdb" Mycon.Open ' 打开数据库 ' 打开一个由查询指定的记录集 MyRS.Open "select * from 学生基本信息", Mycon MyRS.MoveFirst ' 移动到记录集的第一条记录 Show Do While Not MyRS.EOF ' 打印记录集中当前记录的“姓名”字段 Print MyRS.Fields("姓名") MyRS.MoveNext ' 移动到记录集的下一条记录 Loop End Sub
13.4 使用ADO访问数据 3. Command对象 用于定义将对数据源执行的命令,主要用于提供一个通过SQL命令来操纵数据库的功能。 【例13-4】将上例改写成用Command对象实现: Private Sub Form_Load() Dim Mycon As New ADODB.Connection Dim MyRS As New ADODB.Recordset ' 定义Mycom为Command对象 Dim Mycom As New ADODB.Command Mycon.ConnectionString = _ "provider=Microsoft.jet.OLEDB.3.51;" & _ "data source=D:\mydb\学生.mdb" Mycon.Open ' 打开数据库
13.4 使用ADO访问数据 ' 定义一个查询字符串 strSQL = "select * from 学生基本信息" ' 指定Command对象属于Mycon连接 Set Mycom.ActiveConnection = Mycon ' 指定Command对象的命令文本为strSQL Mycom.CommandText = strSQL ' 执行在CommandText属性中指定的查询 Set MyRS = Mycom.Execute MyRS.MoveFirst ' 移动到第一条记录 Show Do While Not MyRS.EOF Print MyRS.Fields("姓名") MyRS.MoveNext Loop End Sub
13.4 使用ADO访问数据 4. Error对象 任何涉及ADO对象的操作都可能产生一个或多个提供者错误。产生错误时,可以将一个或多个Error对象置于Connection对象的Errors集合中。其他ADO操作产生错误时,将清空Errors集合,并且将新的Error对象置于Errors集合中。 5. Field对象 Fields集合包含Recordset对象的所有Field对象。每个Field对象对应于Recordset中的一列。使用Field对象的Value属性可以设置或返回当前记录的数据。使用Name属性可返回字段名。
13.4 使用ADO访问数据 • 【例13-5】在例13-4的基础上增加一个Field对象,将程序改成: Private Sub Form_Load() Dim Mycon As New ADODB.Connection Dim MyRS As New ADODB.Recordset Dim Mycom As New ADODB.Command Dim f As ADODB.Field ' 定义f为Field对象 Mycon.ConnectionString = _ "provider=Microsoft.jet.OLEDB.3.51;" & _ "data source=D:\mydb\学生.mdb" Mycon.Open strSQL = "select * from 学生基本信息" Set Mycom.ActiveConnection = Mycon Mycom.CommandText = strSQL Set MyRS = Mycom.Execute
13.4 使用ADO访问数据 MyRS.MoveFirst Show Do While Not MyRS.EOF For Each f In MyRS.Fields Debug.Print " " & f.Name & " = " & f.Value Next f MyRS.MoveNext Loop End Sub 程序中使用f.Name显示字段名称 使用f.Value显示字段值。