第十章数据库应用技术.ppt
1,第10章数据库应用基础,10.1 数据库概述10.2 VB 数据库访问 10.3 记录集对象 10.4 综合应用,10.1 数据库概述,1.数据库:是指一组排列成易于处理或读取的相关信息,它是由一个或多个表对象组成的集合。这有些类似于Excel的工作簿和工作表。根据数据模型,即实现数据结构化所采用的联系方式,数据库可以分为层次数据库、网状数据库和关系数据库。,10.1.1关系型数据库模型,关系型数据库模型将数据用表的集合来表示。通过建立简单表之间的关系来定义结构,1.记录(行):每张二维表均由若干行和列构成,其中每一行称为一条记录2.字段(列):二维表中的每一列称为一个字段,每一列均有一个名字,称为字段名,各字段名互不相同3主键:关系数据库中的某个字段或某些字段的组合定义为主键,每条记录的主键值都是唯一的,这就保证了可以通过主键唯一标识一条记录。,10.1.2 使用SQL查询数据库,结构化查询语言(Structure Query Language,SQL)是操作关系数据库的标准语言 通过SQL命令,可以从数据库的多个表中获取数据,也可对数据进行更新操作 用户提出一个查询,数据库返回所有与该查询匹配的记录。SQL的主要语句:,SELECT语句,SELECT语句的基本语法形式SELECT 字段表 FROM 表名 WHERE 查询条件 GROUP BY 分组 字段 HAVING 分组条件 ORDER BY 字段ASC|DESCSELECT 目标表达式列表 FROM 表名 WHERE 查询条件 GROUP BY 分组字段 HAVING 分组条件 ORDER BY 排序关键字段 ASC|DESC它包含4部分,其中SELECT和FROM子句是必须的,通过使用SELECT语句返回一个记录集。例 在学生基本情况表中查询物理系的学生情况:SELECT*FROM 基本情况 WHERE 专业=物理,SELECT语句-输出表达式,目标表达式为查询结果要显示的字段清单(字段间用逗号分开)。数据的显示顺序由字段清单的顺序决定。可用星号*代表所有字段;可用AS短语指定字段别名;可通过构造表达式对原始数据进行复杂的运算处理,产生查询结果。例如,根据出生年月计算每个学生的年龄SELECT 姓名,(Year(Date()-Year(出生年月)AS 年龄 FROM 基本情况,SELECT语句-查询条件,WHERE子句用于限制记录的选择例如,查询1985-01-01到1986-12-31之间出生的学生:SELECT*FROM 基本情况 WHERE 出生年月 BETWEEN#1985-01-01#AND#1986-12-31#要枚举出若干项进行查询,使用运算符IN例如:查询物理系和数学系的学生数据:SELECT*FROM 基本情况 WHERE 专业 IN(物理,数学)等价于:SELECT*FROM 基本情况 WHERE专业=物理 OR 专业=数学 复合条件:如查询数学和英语成绩均不及格的学生信息SELECT*FROM score WHERE 数学60 AND 英语60,SELECT语句-合计函数,合计函数用于对记录集进行统计,例如,统计物理系学生的人数:SELECT COUNT(*)AS 学生人数 FROM 基本情况 WHERE专业=“物理”COUNT(*)在统计时包含值为空值的记录COUNT(表达式)统计时忽略表达式值为空值的记录,SELECT语句-分组,GROUP BY子句将指定字段列表中有相同值的记录合并成一条记录。例如,计算每个学生各门课程平均分:SELECT 学号,AVG(成绩)AS 平均分FROM 成绩表 GROUP BY 学号 要对分组后的数据进行过滤,可在GROUP BY子句后结合HAVING子句在分组中选择。例如,查询平均分在80分以上的学生:SELECT 学号,AVG(成绩)AS 平均分FROM 成绩表 GROUP BY 学号HAVING AVG(成绩)=80,SELECT语句-排序,ORDER BY子句决定了查询结果的排列顺序在ORDER BY子句中,可以指定一个或多个字段作为排序关键字,ASC选项代表升序,DESC代表降序。例如查询学生成绩表中的所有数学成绩及格的学生信息,并将查询结果按数学成绩降序排列SELECT*FROM score WHERE 数学=60 ORDER BY 数学 DESC,SELECT语句图解,SELECT语句-多表连接,若查询的数据分布在多个表中,则必须建立连接查询:SELECT目标表达式列表 FROM 表1,表2 WHERE 表1.字段=表2.字段例如,学生成绩表中只有学号,如何在查看学生成绩的同时能够直观地看到学生姓名?这就要在两表之间建立连接。SQL语句如下:SELECT基本情况.姓名,成绩表.*FROM 基本情况,成绩表 WHERE成绩表.学号=基本情况.学号,10.2 VB数据库访问,10.2.1 ADO数据控件使用基础 ADO(ActiveX Data Object)数据访问接口数据库应用程序引例例10.1 设计一个窗体,用DataGrid控件显Student.mdb数据库中“基本情况”表的内容。,ADO数据控件使用,VB采用ADO(ActiveX Data Objects)数据访问技术,编写本程序,需要完成以下工作:在窗体上添加ADO数据控件使用ADO连接对象建立与数据提供者之间的连接使用ADO命令对象操作数据源,从数据源中产生记录集并存放在内存中建立记录集与数据绑定控件的关联,在窗体上显示数据DataGrid控件是一种类似于电子表格的数据绑定ActiveX控件(Microsoft DataGrid Control 6.0),需要配合ADO控件一起使用。它用若干行、列来表示Recordset对象的记录和字段。,数据源连接设置操作,右单击ADO控件,选择快捷菜单ADODC属性命令,打开ADO控件属性页窗,选择提供程序,选择提供程序,指定访问的数据库,指定要访问的数据库文件,连接对象重要属性,1.连接对象最重要的属性是ConnectionString:它是一个字符串,包含了用于与数据源建立连接的相关信息典型的 ConnectionString 属性值如下:Provider=Microsoft.Jet.4.0 OLE DB Provider;Data Source=Student.mdbProvide:指定连接提供程序的名称;Data Source:用于指定要连接的数据源文件。,VB数据库访问过程,2.CommandType:指定获取记录源的命令类型,3.RecordSource属性 RecordSource确定具体可访问的数据来源,这些数据构成记录集对象Recordset。该属性值可以是数据库中的单个表名,也可以是使用SQL查询语言的一个查询字符串。例:要指定记录集对象为Student.mdb数据库中的“基本情况”表,则设置RecordSource=“基本情况”若要用所有物理专业的学生数据构成记录集对象,则设置RecordSource=“Select*From 基本情况 Where 专业=物理”,3.ADO数据控件的其他属性、事件和方法(1)Recordset(记录集)对象:记录集”对象描述来自数据表或命令执行结果的记录集合.记录集对象中的每个字段值用Recordset.Fields(“字段名”)获得(2)BOFAction和EOFAction属性BOF:当前记录位置位于 Recordset 对象的第一个记录之前 EOF:当前记录位置位于 Recordset 对象的最后一个记录之后(3).Refresh方法:建立或重新显示与Data控件相连接的数据库记录集。当在运行状态改变ADO数据控件的数据源连接属性后必须使用Refresh方法激活这些变化例:记录集由“基本情况”改为“成绩表”Adodc1.RecordSource=“成绩表”Adodc1.Refresh,(4)WillMove和MoveComplete事件。当用某种方法改变记录集的指针使其从一条记录移到另一条记录,产生WillMove事件MoveComplete事件发生在一条记录成为当前记录后,它出现在WillMove事件后,数据访问过程,应用程序通过连接对象与数据源建立连接(不同类型的数据库使用各自的连接提供程序)命令对象发出SQL命令从数据源中获取数据数据集对象用来保存所查询到的数据记录 应用程序对记录集进行操作记录集表示内存中来自基本表或命令执行结果的集合,也由记录(行)和字段(列)构成,可以把它当作一个数据表来进行操作,10.2.2 数据绑定,数据绑定是一个过程,即在运行时自动为与记录集中的元素关联的控件设置属性。以便通过控件显示数据集中的数据。,数据绑定,Windows 窗体有简单数据绑定和复杂数据绑定简单数据绑定简单数据绑定:将控件绑定到单个数据字段。每个控件仅显示数据集中的一个字段值。最常用的简单数据绑定是将数据绑定到文本框和标签在设计或运行时设置控件属性建立绑定:DataSource:指定ADO数据控件DataField:设置记录集中有效的字段,简单数据绑定,例10.2 设计一个窗体,用以浏览Student.mdb数据库中基本情况表的内容 界面设计ADO数据控件3个文本框2个组合框5个标签控件,建立连接和产生记录集1.选中ADO数据控件-单击右键-ADODC属性-打开属性页-使用连接字符串-选Microsoft.Jet.4.0 OLE DB Provider2.单击下一步-选择数据库文件-测试连接3.在属性页中单击“记录源”-命令类型选2-表名称选择,设置绑定属性 1.将文本框、组合框的DataSource属性设置为Adodc12.数据显示格式通过DataFormat属性改变3.将文本框、组合框的DataField选择4.若将ADO控件的EofAction属性设置为2,则应用程序具有添加新记录的功能,复杂数据绑定,复杂数据绑定允许将多个数据字段绑定到一个控件,同时显示记录源中的多行或多列。支持复杂数据绑定的常用控件:DataGrid 数据网格 MSHFlexGrid 数据网格 DataList 数据列表框 DataCombo 数据组合框,复杂数据绑定,例10.3复杂数据绑定的操作过程 界面设计:ADO数据控件、DataGrid、2个命令按钮建立连接和产生记录集:Adodc1控件记录源选“基本情况”或“成绩表”为默认值DataGrid DataSource属性设置为Adodc1数据绑定 本例DataGrid控件要绑定不同的表,故需要通过代码设置控件的DataSource 属性。,程序代码Private Sub Command1_Click()Adodc1.RecordSource=基本情况“Adodc1.RefreshEnd SubPrivate Sub Command2_Click()Adodc1.RecordSource=成绩表“Adodc1.RefreshEnd Sub,例10.4使用SQL语句选择数据表部分数据构成记录集。在网格上绑定部分字段,需要对数据网格布局进行编辑Adodc1控件记录源-命令类型选8-adCmdUnknown-在命令文本框内输入“Select*from 基本情况 Where 性别=“男”,鼠标右击DataGrid-选检索字段-点击是将表中字段装载到DataGrid控件中,10.3 记录集对象,10.3.1 浏览记录集,1.AbsoloutPostion属性 返回当前记录指针值,从1到Recordset对象所含记录数,第n条记录的AbsoloutPostion属性值为n2.BOF和EOF的属性BOF判定记录指针是否在首记录之前EOF判定记录指针是否在末记录之后如果BOF和EOF的属性值都为True,则记录集为空若当前记录指针值位于BOF,AbsoloutPostion属性返回AdPosBOF(-2)若当前记录指针值位于EOF,AbsoloutPostion属性返回AdPosEOF(-3)记录集为空,AbsoloutPostion属性返回AdPosUnknown(-1),3.RecordCount属性对Recordset对象中的记录计数,该属性为只读属性Private Sub Adodc1_MoveComplete()Adodc1.Caption=Adodc1.Recordset.AbsolutePosition&/&Adodc1.Recordset.RecordCountEnd Sub 可以在数据控件的标题区显示当前记录的序号和记录总数,4.Find方法 在Recordset对象中查找与指定条件相符的第一条记录,并使之成为当前记录。如果找不到,则记录指针指在记录集末尾。Recordset.Find 搜索条件,位移,搜索方向,开始位置例:搜索条件是一个字符串Adodc1.Recordset.Find“学号=50102”或者 mt=“50102”Adodc1.Recordset.Find“学号=“&”&mt&”若为数值类型则不加单引号使用Like运算符Adodc1.Recordset.Find“学号Like 50*”,5.Move方法组Move方法可代替对数据控件对象的4个箭头按钮的操作遍历整个记录集。(1)MoveFirst方法移至第1条记录。(2)MoveLast方法移至最后一条记录。(3)MoveNext方法移至下一条记录。(4)MovePrevious方法移至上一条记录。(5)Move n 方法向前或向后移n条记录。,记录集属性方法小结,例10.5用命令按钮代替数据控件对象的4个箭头按钮的功能,使用Find方法查找记录(例10.2的基础上),Private Sub Command1_Click(Index As Integer)Select Case Index Case 0 Adodc1.Recordset.MoveFirst Case 1 Adodc1.Recordset.MovePrevious If Adodc1.Recordset.BOF Then Adodc1.Recordset.MoveFirst Case 2 Adodc1.Recordset.MoveNext If Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast Case 3 Adodc1.Recordset.MoveLast Case 4 Dim mno As String mno=InputBox(请输入学号,查找窗)Adodc1.Recordset.Find 学号 like&mno&,1 If Adodc1.Recordset.EOF Then MsgBox 无此学号!&Adodc1.Recordset.AbsolutePosition,提示“End Select,10.3.2 记录集的编辑,1数据编辑方法 记录集中数据的增、删、改涉及到4个方法:AddNew方法:在记录集中增加入一个新行Delete方法:删除记录集中的当前记录Update方法:确定修改并保存到数据源中CancelUpdate方法:取消未调用Update方法前对记录所做的所有修改,增加新记录,2增加新记录(1)调用AddNew方法增加一条空记录(2)给新记录各字段赋值:可以通过绑定控件直接输入或使用程序代码给字段赋值,格式为:Recordset.Fields(“字段名”)=值(3)调用Update方法,确定所做的添加,将缓冲区内的数据写入数据库,删除记录,3.删除记录(1)定位被删除的记录使之成为当前记录(2)调用Delete方法(3)移动记录指针注意:使用Delete方法当前记录立即删除,不加任何的警告或者提示。删除一条记录后,绑定控件仍旧显示该记录的内容。因此,必须移动记录指针刷新绑定控件。,修改记录,4.修改记录 当改变数据项的的内容时,ADO自动进入编辑状态,在对数据编辑后,只要改变记录集的指针或调用Update方法,即可确定所做的修改。,Adodc1.Recordset.AddNew 增加记录,数据库,UpData,填入新数据,编辑记录删除记录 给各字段赋值 调用Delete方法 调用Update方法 移动记录指针,数据修改小结,例11.6在例10.5的基础上加入“新增”、“删除”、“更新”、“放弃”和“结束”5个按钮,通过对按钮的编程建立增、删、改功能,Private Sub Command2_Click(Index As Integer)Dim ask As Integer Select Case Index Case 0 Adodc1.Recordset.AddNew Case 1 ask=MsgBox(删除否?,vbYesNo)If ask=6 Then Adodc1.Recordset.Delete Adodc1.Recordset.MoveNext If Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast End If Case 2 Adodc1.Recordset.Update Case 3 Adodc1.Recordset.CancelUpdate Case 4 End End SelectEnd Sub,10.3.3 查询与统计,通过SQL语句从数据源中获取信息,查询条件由Select语句的Where短语构成,使用And与Or运算符组合出复杂的查询条件。模糊查询使用运算符Like,百分号%代替任意不确定的内容,用下划线_代替一个不确定的内容。例如:姓名 Like 张%将查询所有张姓的人员 姓名 Like 张_ 将查询张姓两个字的人员,例10.7 根据输入的专业名称,在网格内显示Student.mdb数据库中该专业所有学生信息 设置ADO数据控件、DataGrid、1个命令按钮、标签、文本框,Private Sub Command1_Click()If Text1 Then Adodc1.RecordSource=select*from 基本情况 where 专业=“mlink=mlink+Data Source=+mpath+Student.mdb Adodc1.ConnectionString=mlink Adodc1.CommandType=adCmdUnknown End Sub,例10.8使用数据列表框或数据组合框提供专业名称,实现查询设置2个ADO数据控件、DataGrid控件、DataList控件,Private Sub DataList1_Click()Adodc1.RecordSource=select*from 基本情况 where 专业=“mlink=mlink+Data Source=+mpath+Student.mdb Adodc1.ConnectionString=mlink Adodc1.CommandType=adCmdUnknown End Sub,例10.9使用SQL的函数和分组功能,统计各专业的人数、年龄分布。,Private Sub Command1_Click()Adodc1.RecordSource=Select 专业,count(*)as 人数 from 基本情况 group by 专业“Adodc1.RefreshEnd SubPrivate Sub Command2_Click()Adodc1.RecordSource=Select year(出生年月)as 出生年月,count(*)as 人数 from 基本情况 group by year(出生年月)“Adodc1.RefreshEnd SubPrivate Sub Form_Load()Dim mpath$,mlink$mpath=App.Path If Right(mpath,1)Then mpath=mpath+“mlink=Provider=Microsoft.Jet.OLEDB.4.0;“mlink=mlink+Data Source=+mpath+Student.mdb Adodc1.ConnectionString=mlink Adodc1.CommandType=adCmdUnknown End Sub,10.3.4 BLOB数据处理,二进制大型对象(Binary Large Object,BLOB)是指任何需要存入数据库的随机大块字节流数据,例如图形或声音文件。数据库中存放BLOB的字段必须是二进制类型(在Access中为OLE对象),在ADO中如何处理BLOB类型的数据,把图形作为数据库的一个字段值存放在数据库,并能显示图形数据?,BLOB数据处理,1.AppendChunk方法将BLOB数据写入数据库语法格式:ADO对象.Recordset.Fields(字段).AppendChunk Data用二进制访问方式打开BLOB数据文件定义一个与文件长度相同大小的字节型数组将文件保存到数组使用ADO对象的AppendChunk方法写入数据库 2.GetChunk方法从数据库中读出BLOB数据语法格式:变量=ADO对象.Recordset.Fields(字段).GetChunk(Size),例10.10选择指定图形文件将数据写入到数据库,在浏览记录时显示照片。在窗体上设置ADO数据控件、命令按钮、图像控件、通用对话框、文本框、标签控件,Private Sub Command1_Click()Dim strb()As Byte CommonDialog1.ShowOpen Open CommonDialog1.FileName For Binary As#1 Image1.Picture=LoadPicture(CommonDialog1.FileName)fl=LOF(1)ReDim strb(fl)Get#1,strb Adodc1.Recordset.Fields(照片).AppendChunk strb Close#1End Sub,例10.11 设计一个多媒体信息管理系统,要求能将多媒体数据保存在数据库,具有记录的增加、删除、统计和多媒体信息重现等功能。,例10.12 设计一个飞行航班信息查询系统,要求具有记录的增加、编辑、删除、查询等功能,