第9章 访问数据库 9.1 数据库的概念与建立 9.2 用Data控件访问数据库
9.1 数据库的概念与建立 9.1.1 数据库概念 数据库是具有一定组织结构的相关信息的集合。它是将一些相关的数据表组织在一起,通过设置某些功能,使数据表之间建立关系,这样就构成了一个完整数据库。
数据库的结构形式(即数据之间的联系)称为数据模型。目前最为流行的是关系模型。 关系模型采用二维表格形式存储数据。
字段名 学生成绩表 记录 字段 班级 学号 姓名 数学 英语 语文 95 86 90 78 67 69 87 77 72 89 49 64 A A40001 张薇 95 86 90 B B40001 刘磊 78 67 69 A40003 吴晓琛 87 77 72 C C40005 李锡林 89 49 64 B40011 刘勇 51 65 70 A40004 金永清 81 66 63 A40006 郭丽娜 68 C40008 李冉 60 46 61 记录 字段
9.1.2 数据库和表的建立 【例9.1】建立一个学期成绩管理数据库中学生成绩表。
建立步骤: (1)启动数据管理器: 【外接程序】|【可视化数据管理器】
(2)建立数据库: 数据库窗口 SQL语句
(3)建立数据表结构:在数据库窗口中按鼠标右键,在弹出的快捷菜单中选择“新建表”后,打开图所示的“表结构”对话框。 输入表名 向表中添加字段
学生成绩表结构 字段名 类型 大小 班级 Text 6 数学 Integer 2(默认) 学号 8 英语 姓名 10 语文
(4)编辑数据表中的数据。在数据表名处单击鼠标右键,在弹出的快捷菜单中选择“打开”项,打开下图所示的记录操作对话框。 依次输入 6项字段值
9.2 用Data控件访问数据库 【例9.2】将例9.1 所建立的数据库中的记录信息显示在文本框中,在窗体上添加6个标签、6个文本框和1个Data数据控件。
可以浏览表中的不同记录信息
说明: Data数据控件是VB的标准控件,利用它能方便地创建应用程序与数据库之间的连接,并实现对数据资源的访问; 为了在程序运行时,使Data数据控件能够访问指定表中的记录信息,应设置该控件的DatabaseName属性和RecordSource属性; 要在各文本框中显示Data控件所连接的数据表中的数据,必须将文本框与Data数据控件进行绑定。
程序代码: Private Sub Form_Load() For i = 0 To 5 txtStu(i).Locked = True Next i End Sub Private Sub Data1_Reposition() Data1.Caption = “第” & (Data1.Recordset.AbsolutePosition + 1) & "条" End Sub 设置文本框不可编辑 使某条记录成为当前记录后,触发此事件。 设置当前记录数
程序说明: 在Data1的Reposition事件中出现的Recordset是Data1控件所控制的记录集对象,通过此对象对数据表中的记录进行浏览和操作。访问数据库的记录集可用Data1.Recordset实现。
【例9.3】在例9.2所建立的窗体基础上增加4个命令按钮。 在数据表中添加一条空记录 修改当前显示的一条记录 删除当前显示的一条记录 单击时,退出程序
程序代码: Private Sub Form_Load() For i = 0 To 5 txtStu(i).Locked = True Next i End Sub
Private Sub cmdAdd_Click() cmdEdit.Enabled = Not cmdEdit.Enabled cmdDelete.Enabled = Not cmdDelete.Enabled For i = 0 To 5 txtStu(i).Locked = Not txtStu(i).Locked Next I If cmdAdd.Caption = "添加" Then Data1.Recordset.AddNew Data1.Caption = "新记录” cmdAdd.Caption = "保存” cmdExit.Caption = "取消” txtStu(0).SetFocus Else Data1.Recordset.Update Data1.Recordset.MoveLast cmdAdd.Caption = "添加” End If End Sub 将数据加入到新添加的空记录中 用修改后的数据替换原来的记录 使记录集中的最后一条记录成为当前记录
Private Sub cmdEdit_Click() cmdAdd.Enabled = Not cmdAdd.Enabled cmdDelete.Enabled = Not cmdDelete.Enabled For i = 0 To 5 txtStu(i).Locked = Not txtStu(i).Locked Next I If cmdEdit.Caption = "修改" Then Data1.Recordset.Edit cmdEdit.Caption = “保存” cmdExit.Caption = “取消” Else Data1.Recordset.Update cmdEdit.Caption = “修改” End If End Sub 使当前记录成为可编辑状态
Private Sub cmdDelete_Click() answer = MsgBox("确实删除该记录吗?", vbYesNo + vbQuestion, ”警告”) If answer = vbYes Then Data1.Recordset.Delete Data1.Recordset.MoveNext If Data1.Recordset.EOF Then Data1.Recordset.MoveLast End If End Sub 删除当前记录 记录指针下移一条 使最后一条记录成为当前记录
Private Sub cmdExit_Click() If cmdExit.Caption = "退出" Then End Else Data1.Recordset.CancelUpdate cmdAdd.Enabled = True cmdEdit.Enabled = True cmdDelete.Enabled = True For i = 0 To 5 txtStu(i).Locked = Not txtStu(i).Locked Next i cmdExit.Caption = "退出" cmdAdd.Caption = "添加" cmdEdit.Caption = "修改" Data1.Refresh End If End Sub 取消所做的添加、 修改记录的操作 刷新记录集中的记录
Private Sub Data1_Reposition() Data1.Caption = "第" & Data1.Recordset.AbsolutePosition + 1 & "条记录" End Sub
说明: 在程序运行中,应注意各命令按钮之间的互相制约关系,如单击“添加”按钮后,不允许再单击“修改”、“删除”等按钮。因此本例在“添加”按钮的Click事件中,用cmdEdit.Enabled = Not cmdEdit.Enabled等语句实现按钮的可用与不可用状态的设置;
对于添加记录的操作,需单击两次cmdAdd按钮后才能完成。第一次单击该按钮时,执行语句Data1. Recordset 对于添加记录的操作,需单击两次cmdAdd按钮后才能完成。第一次单击该按钮时,执行语句Data1.Recordset.AddNew,其作用是将一条空记录添加到记录集的末尾。此时可在文本框中输入各字段值; 第二次单击cmdAdd按钮时,执行语句Data1.Recordset.Update,其作用是先确认所做的添加操作后,再将新记录添加到数据库中; 语句Data1.Recordset.MoveLast的作用是将记录指针移到最后一条记录上,因为新添加的记录是最后一条;
修改记录中的语句Data1. Recordset 修改记录中的语句Data1.Recordset.Edit,其作用是调用Recordset的Edit方法,使当前记录成为可编辑的状态。在完成修改操作后,还需执行语句Data1.Recordset.Update,确认所做的修改操作;
对于删除记录的操作,语句Data1.Recordset.Delete,的作用是删除当前记录; 删除当前记录后应使下一条记录成为当前记录,为此执行语句Data1.Recordset.MoveNext; 代码中If语句的含义是如果记录指针指向最后一条记录的后面,则将记录指针移动到最后一条记录上,使之成为当前记录。其中EOF是Recordset的一个属性,当值为True时,表明记录指针已移到最后一条记录的后面;
对于取消所添加的新记录或对数据的修改操作,需执行语句Data1. Recordset 对于取消所添加的新记录或对数据的修改操作,需执行语句Data1.Recordset.CancelUpdate,其作用是放弃添加的新记录或对数据的修改。并通过执行语句Data1.Refresh,刷新与Data1相连接的记录集,同时把记录集中的第一条记录设置为当前记录。
【例9.4】编写查询数据程序。在启动窗体上添加1个数据控件、1个MSFlexGride网格控件、1个标签和1个组合框。在窗体2(自定义输入框窗体)上添加2个标签、2个文本框和1个命令按钮。 单击时,选择不同的查询方式 输入不同的查询条件
说明: MSFlexGride(网格控件)的作用是可以若干行和列表示记录集对象中的记录和字段,即以表格的形式显示数据; 将MSFlexGrid控件添加到窗体后,在该控件上按右键,选“属性”项打开MSFlexGride控件的“属性页”对话框,在“属性页”中可以设置该控件的显示格式。
窗体1的程序代码: Private Sub Form_Load() Combo1.AddItem "全体" Combo1.Text = Combo1.List(0) msfStu.ColWidth(0) = 600 msfStu.ColWidth(1) = 800 msfStu.ColWidth(2) = 800 msfStu.ColWidth(3) = 500 msfStu.ColWidth(4) = 500 msfStu.ColWidth(5) = 500 End Sub 在组合框中添加选项 设置网格控件各列的宽度
Private Sub Combo1_Click() If Combo1.ListIndex = 0 Then Data1.RecordSource = "select * from student" Data1.Refresh Else frmEx9_4_2.Show frmEx9_4_2.Text1.SetFocus End If End Sub 如果选定“全体” 显示表中的所有信息 刷新与Data1控件连接的记录集
窗体2的程序代码: Select Case frmEx9_4_1.Combo1.ListIndex Case 1 Private Sub Command1_Click() Select Case frmEx9_4_1.Combo1.ListIndex Case 1 find = Text1.Text frmEx9_4_1.Data1.RecordSource = "select * from student where 班级 = '" & find & "'" frmEx9_4_1.Data1.Refresh 从student表中查询与所输入班级相匹配的学生信息
frmEx9_4_1.Data1.RecordSource = "select * from student where 姓名 Case 2 find = Text1.Text & "*“ frmEx9_4_1.Data1.RecordSource = "select * from student where 姓名 like '"& find & "'" frmEx9_4_1.Data1.Refresh 从student表中查询与所输入的姓名或姓相匹配的学生信息
frmEx9_4_1.Data1.RecordSource = "select * from student where Case 3 find1 = Text1.Text find2 = Text2.Text frmEx9_4_1.Data1.RecordSource = "select * from student where 数学 >= " & find1 & " And 数学 <= " & find2 & "" frmEx9_4_1.Data1.Refresh End Select Text1.Text = "" Unload Me frmEx9_4_1.Show End Sub 从student表中查询数学成绩在所输入的范围内的学生信息
Private Sub Form_Activate() Select Case frmEx9_4_1.Combo1.ListIndex Case 1 Label1.Caption = "输入班级" Text2.Visible = False Label2.Visible = False Case 2 Label1.Caption = "姓名或姓" Case 3 Label1.Caption = "输入数学" Text2.Visible = True Label2.Visible = True End Select End Sub
本例通过SQL(结构化查询语言)中的查询语句select实现查询功能。 select语句的基本形式是: select * from 表名 where 查询条件式 “select *”表示选择表中的全部字段; “from 表名”表示从指定表中查询数据; “where 查询条件式”表示设置查询条件,用于查找表中满足条件的记录。