2020版算法与程序设计第五单元第5讲 算法在数据管理中的应用(19张PPT课件+学案)

文档属性

名称 2020版算法与程序设计第五单元第5讲 算法在数据管理中的应用(19张PPT课件+学案)
格式 zip
文件大小 4.0MB
资源类型 教案
版本资源 通用版
科目 通用技术
更新时间 2019-11-30 14:13:28

文档简介

第5讲 算法在数据管理中的应用
考试内容
考试要求
VB访问数据库
c
算法与数据管理
c
一、VB访问数据库
1.ADO访问Access数据库
ADO是微软公司提供的一种应用程序访问数据库的编程接口。该接口包含了多个对象,其中Connection对象用于和数据库建立连接,在建立连接后,用Recordset对象获取数据表中的数据。
2.通过Connection连接数据库
在用Connection建立和数据库的连接时,需要设置ConnectionString属性的值(即连接字符串),以指定连接数据库所用的驱动程序、数据源名称、用户名和密码。下列语句定义一个Connection对象的实例conn,并设置conn的连接字符串:
Dim conn As New ADODB.Connection
conn.ConnectionString=“Provider=Microsoft.ACE.OLEDB.12.0;DATA Source=”&App.Path&“Contacts.accdb”
其中,参数“Provider”用于指定连接的提供者(Microsoft.ACE.OLEDB.12.0可以访问Access2010数据库);
DATA Source用于指定数据库的文件名(含绝对路径);
App.Path返回当前应用程序所在的绝对路径。
Connection对象具有Open、Close等方法,其中Open方法用于打开到数据源的连接,Close方法用于关闭连接。
3.通过Recordset对象获取数据表中的数据
在用Recordset对象从数据库中获取数据时,要设置ActiveConnection属性的值。
语句Set rs.ActiveConnection=conn,使Recordset对象的实例rs与Connection对象的实例conn建立关联。
在与conn建立关联后,可用Recordset对象的Open方法获取数据表中的数据。下列语句用于打开记录集,将SQL语句的查询结果保存到记录集rs中:
rs.Open“SELECT*FROM info”
该语句执行后,记录集rs中的数据为SQL语句“SELECT * FROM info”查询到的结果。
打开Recordset时,若Recordset非空,当前记录位于第一条记录。
Recordset对象的Close方法用于关闭对象。
Recordset对象的Fields集合用于返回当前记录中的数据。如:rs.Fields(“fName”)返回当前记录中“fName”字段的值;rs.Fields(0)返回当前记录中第一个字段的值,如果第一个字段名为“fName”,rs.Fields(0)与rs.Fields(“fName”)返回值相同。
Recordset对象的MoveNext方法用于把当前移动到下一条记录。若到结尾处还继续向下移动,程序会出错,因此在使用MoveNext时要判断Recordset的EOF属性,判断是不是到达结尾处。EOF属性取值为“True”或“False”。
4.Select语句
Select语句是结构化查询语言SQL中最常见的语句,主要用于从数据表中查询数据。如语句“SELECT * FROM info”表示查询数据表“info”中的全部数据。
二、算法在数据管理中的综合应用
VB程序获取到的Access数据库中的数据,可采用数组等方式进行存储,并可以通过编程对这些数据进行各种加工处理,如统计、分析、查找、排序等。
一、VB访问数据库
VB访问Access数据库,从数据表中读取相关数据,并存储在数组中。
【典例1】 读取Access数据库“student.accdb”的数据表“xsinfo”中读取记录,并分别显示在相应位置。
程序运行时,单击“显示记录”按钮Command1,并在文本框Text1、Text2、Text3中显示第一条记录的信息,单击“下一条”按钮Command2,将显示下一条记录。程序运行效果如下图所示:
实现上述功能的VB程序如下,请在划线处填入合适的代码。
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Private Sub Command1_Click()
 conn.ConnectionString = “Provider = Microsoft.ACE.OLEDB.12.0;DATA Source=” & App.Path & “____①____”
 conn.Open
 Set rs.ActiveConnection = conn
 rs.Open “SELECT * FROM ____②____”
 Text1.Text = rs.Fields(“姓名”)
 Text2.Text = rs.Fields(“班级”)
 Text3.Text = rs.Fields(“性别”)
End Sub
Private Sub Command2_Click()
 rs.MoveNext     ′移动到下一条记录
 If Not rs.EOF Then  ′判断是否已到记录集的最后一条记录
Text1.Text = rs.Fields(“姓名”)
Text2.Text = rs.Fields(“班级”)
Text3.Text = rs.Fields(“性别”)
 Else
MsgBox (“记录已全部显示完毕!”)
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
 End If
End Sub
解析 本题主要考查的是VB访问数据库的相关知识。划线①处为访问的数据库的名称,从题中可知数据库名称为“student.accdb”;划线②处为数据表的名称,从题中可知数据表名称为“xsinfo”。
答案 ①student.accdb ②xsinfo
【方法总结】 VB访问数据库时,需要知道正确的数据库名称和数据表的名称。
二、数据分析
【典例2】 读取Access数据库“student.accdb”的数据表“xsinfo”中读取记录,将记录显示在列表框中,并统计女生的人数。
程序运行时,单击“显示记录”按钮Command1,将记录信息分别存储在数组a、b、c中,并显示在列表框List1中,单击“统计”按钮Command2,将女生人数显示在标签Label1中。程序运行效果如下图所示:
实现上述功能的VB程序如下,请在划线处填入合适的代码。
Dim b(1 To 100) As String
Dim c(1 To 100) As String
Private Sub Form_Load()
 conn.ConnectionString = “Provider = Microsoft.ACE.OLEDB.12.0;DATA Source=” & App.Path & “student.accdb”
 conn.Open
 Set rs.ActiveConnection = conn
 rs.Open “xsinfo”
 p = 0
 Do While  ____①____
____②____
a(p) = rs.Fields(“姓名”)
b(p) = rs.Fields(“班级”)
c(p) = rs.Fields(“性别”)
rs.MoveNext      
 Loop
 rs.Close
 conn.Close
 Set rs = Nothing
 Set conn = Nothing
End Sub
Private Sub Command1_Click()
 Dim i As Integer
 List1.AddItem “姓名” + “班级” + “性别”
 For i = 1 To p
  List1.AddItem a(i) + “  ” + b(i) + “ ” + c(i)
 Next i
End Sub
Private Sub Command2_Click()
 Dim i As Integer
 Dim count As Integer
 For i = 1 To p
  If ____③____ Then count = count + 1
 Next i
 Label1.Caption = “共有女生数:” + Str(count)
End Sub
解析 本题主要考查的是VB访问数据库,将进行简单的统计分析。划线①处表示将数据表中的每一条记录存储在数组中,读取记录时需判断当前位置是否已到达记录集的最后一条记录,否则将会出错,因此①处代码为Not rs.EOF;②处代码表示统计记录的个数,用变量p进行计数,因此②处代码为p=p+1;③代码表示统计女生的人数,性别存储在数组c中,因此③处代码为c(i) = “女”。
答案 ①Not rs.EOF ②p = p + 1 ③c(i) =“女”
【方法总结】 将数据库中数据存储在数组中,可对数组中数据进行统计分析。
某同学设计了一个用于查询学考成绩的查询系统,要求如下:
(1)输入某个等级(分为A、B、C、D、E五个等级),就能查询出该等级的所有学生考号与姓名,并统计出该等级学生的总人数。
(2)学生成绩信息存储在数据库“TechGrade.accdb”中一张数据表中,该数据表的结构如图1所示;
(3)程序运行界面如图2所示,在文本框“Text1”中输入要查询的等级,单击“查询”按钮“Command1”,在列表框“List1”中显示所有该等级的学生考号与姓名,并按照考号从小到大排序,并在标签“Label3”处显示该等级学生人数,如果该等级学生人数为“0”,则“List1”列表框显示“没有该等级的学生!”。
(1)学生成绩信息(考号、姓名、等级)来源于数据库TechGrade.accdb中________数据表。
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
 Dim snum(1 To 1000) As String ′数组snum存放学生的考号
 Dim sname(1 To 1000) As String ′数组sname存放学生的姓名
 Dim n As Integer, i As Integer, j As Integer, k As Integer
 Dim tnum As String, tname As String
 grade = Text1.Text
 Dim Conn As New ADODB.Connection
 Dim RsAs New ADODB.Recordset
 Conn.ConnectionString = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” + App.Path + “Techgrade.accdb”
 Conn.Open
 Set Rs.ActiveConnection = Conn
 Rs.Open “SELECT * FROM tech where 等级=′” +________①________ + “′”
 n = 0
 Do While Not Rs.EOF
n = n + 1
snum(n) = Rs.Fields(“考号”)
sname(n) = Rs.Fields(“姓名”)
Rs.MoveNext
 Loop
 Rs.Close
 Conn.Close
 List1.Clear ′清除列表框
 If n < > 0 Then
i = 1
Do While ________②________
 k = i
 For j = i + 1 To n
   If ________③________ Then k = j
 Next j
 If k < >i Then
 tnum = snum(i): snum(i) = snum(k): snum(k) = tnum
 tname = sname(i): sname(i) = sname(k): sname(k) = tname
 End If
 i = i + 1
Loop
For i = 1 To n
List1.AddItem snum(i) + “ ” + sname(i)
 Next i
 Else
List1.AddItem “没有该等级的学生!”
 End If
 Label3.Caption = grade + “等学生共有” + Str(n) + “名”
End Sub
解析 (1)本题主要考查的是数据库中的数据表。从语句“Rs.Open “SELECT * FROM tech where 等级=′” + grade + “′””可知,考生信息来源于数据表tech;(2)划线①处循环表示读取数据表中等级为grade的记录,并存储在相应数组中,循环条件表示记录还没读完时,即当前位置还未到达数据表的末尾,因此①处代码为grade;划线②处的循环表示将学生信息按考生升序排序,这里使用的是选择排序, 划线②处表示n个数进行排序,共需进行n-1趟,因此②处代码为i<=n-1或isnum(j)或snum(j)答案 (1)TECH (2)①grade ②i<=n-1或i③snum(k)>snum(j)或snum(j)基础巩固
1.小王准备编写一个依据技术学考、加试成绩进行赋分的VB程序,需对成绩进行预处理。预处理算法的基本思想:先从数据库中读取考生的考号、学考、加试成绩,然后进行排序,排序规则是按学考+加试的总分降序,若总分相同按加试成绩降序排列。再根据排序结果给出名次,同分同名,学考、加试成绩相同,则名次相同。
程序运行时,学生数据显示在列表框List1中,单击“计算”按钮Command1,计算结果显示在列表框List2中,程序运行界面如图所示。
实现上述功能的VB程序如下,请回答下列问题:
(1)如图所示,学生总数为1500人,排名前1%的学生可赋分为100,则共有________名学生可赋分为100。
(2)分析数据,可知存放学生成绩的数据库文件为________。
(3)请在划线处填入合适的代码。
Dim kh(1 To 1500) As String  ′存放学生考号
Dim a(1 To 1500) As Integer  ′存放学考成绩
Dim b(1 To 1500) As Integer   ′存放加试成绩
Dim pm(1 To 1500) As Integer  ′存放排名
Dim n As Integer        ′存放总人数
Private Sub Form_Load()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
conn.ConnectionString = “Provider = Microsoft.ace.OLEDB.12.0;DATA Source=” + App.Path + “cj.accdb”
conn.Open
Set rs.ActiveConnection = conn
rs.Open “select * from stu_cj”
List1.AddItem “ 考号 ” & “ 学考 ” & “加试”
n = 0
Do While Not rs.EOF ′到记录集最后一条记录后退出循环
n = n + 1  ′计数
kh(n) = rs.Fields(“考号”)
a(n) = rs.Fields(“学考成绩”)
b(n) = rs.Fields(“加试成绩”)
List1.AddItem kh(n) & “ ” & Str(a(n)) & “  ” & Str(b(n))
  ____①____
Loop
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub
Private Sub Command1_Click()
 Dim i As Integer, j As Integer, t As Integer, k As String
 For i = 1 To n - 1
For j = n To i + 1 Step -1
If a(j) + b(j) > a(j - 1) + b(j - 1) Or ____②____Then
   t = a(j): a(j) = a(j - 1): a(j - 1) = t
   t = b(j): b(j) = b(j - 1): b(j - 1) = t
   k = kh(j): kh(j) = kh(j - 1): kh(j - 1) = k
End If
Next j
 Next i
 
 pm(1) = 1
 For i = 2 To n
If a(i) = a(i - 1) And b(i) = b(i - 1) Then
   ____③____
Else
pm(i) = i
End If
 Next
 List2.Clear
 List2.AddItem “排名” & “考号” & “ 学考” & “加试”
 For i = 1 To n
List2.AddItem pm(i) & “ ” & kh(i) & “  ”
& a(i) & “  ” & b(i)
 Next i
End Sub
解析 本题考查VB程序的综合能力。(1)1500人的1%为15名之前,从图中可知为17人。(2)本小题主要考查VB连接数据库的知识,从代码中可知数据库cj.accdb。(3)本小题阅读程序代码可知采用冒泡排序。①空处程序的功能是读完一条记录后,光标移到下一条记录,因此代码为rs.MoveNext;排序时,若第一关键词相同,则按第二关键词进行排序,若总分相同按加试成绩降序,所以②空答案为a(j) + b(j) = a(j - 1) + b(j - 1) And b(j) > b(j - 1)。③空位置程序段为进行排名,若a(i) = a(i - 1) And b(i) = b(i - 1),也就是第i个学生的学考和加试与第i-1个学生的成绩完全相同,则名次相同,pm(i) = pm(i - 1),否则第i个学生排名在第i位,pm(i) = i。
答案 (1)17 (2)cj.accdb (3)①rs.MoveNext ②a(j)+b(j)=a(j-1)+b(j-1) And b(j)> b(j-1) ③pm(i) = pm(i - 1)
2.某校开展“七选三”选课调查,选课数据存数据库文件“student.accdb”中,如图a所示。“选课”字段存储7位“0”、“1”组成的数串,每位对应一个科目,从左往右依次为“物化生政史地技”,“1”表示选择,“0”表示未选择,如“1110000”表示选择科目“物化生”。小吴设计了一个VB程序统计全校选课情况,功能如下:程序启动时从数据库中读入全校学生的学籍辅号、姓名、班级、选课信息,处理后在列表框List1中显示,单击“选课统计”按钮Command1,在列表框List2中按选课人数从高到低输出各选课组合及人数。程序界面如图b所示(学籍辅号和姓名的部分内容不显示)。
图a
图b
实现上述功能的VB程序如下,请回答下列问题:
(1)若某记录“选课”字段值为“1100001”,则该生的选课科目是________________。
(2)请在划线处填上合适的代码。
Const max = 1000
Const s = “物化生政史地技”
Dim n As Integer  ′存放学生人数
Dim xjfh(1 To max) As String, xm(1 To max) As String ′数组xjfh、xm分别存储学籍辅号和姓名
Dim bj(1 To max) As Integer, xk(1 To max) As String ′数组bj、xk分别存放班级和选课标志
Dim zh(1 To 35) As String, tj(1 To 35) As Integer
′数组zh存储不同选课组合,数组tj存储某一组合选课的学生数
Function adj(a As String, n As Integer) As String
 ′函数功能:在被显示数据之后添加上合适的空格,代码略
End Function
Function convert(x As String) As String
 Dim i As Integer, st As String
 st = “ ”
 For i = 1 To Len(x)
If Mid(x, i, 1) = “1” Then st = st + Mid(s, i, 1)
 Next i
 convert = st
End Function
Private Sub Form_Load()
 Dim i As Integer, km As String
 Dim conn As New ADODB.Connection
 Dim rs As New ADODB.Recordset
conn.ConnectionString = “provider=microsoft.ace.oledb.12.0;data source=” + App.Path + “student.accdb”
conn.Open
 Set rs.ActiveConnection = conn
 rs.Open “select * from stu_info”
 n = 0
 Do While Not rs.EOF
n = n + 1
xjfh(n) = rs.Fields(0):xm(n) = rs.Fields(1)
bj(n) = rs.Fields(2):xk(n) = rs.Fields(3)
①____
List1.AddItem xjfh(n) + adj(xm(n), 4) + adj(Str(bj(n)), 4) + adj(km, 6)
rs.MoveNext
 Loop
 ′剩余部分代码略
 功能:产生35种选课组合的“0”、“1”数串,存数组zh,;数组tj各元素初始化为0。
End Sub
Private Sub Command1_Click()
 Dim i As Integer, j As Integer, temp2 As Integer, temp1 As Integer
 For i = 1 To 35
For j = 1 To n
  If xk(j) = zh(i) Then ____②____
Next j
 Next i
 For i = 1 To 34
For j = 35 To i + 1 Step -1
  If ____③____Then
temp1 = zh(j): zh(j) = zh(j - 1): zh(j - 1) = temp1
temp2 = tj(j): tj(j) = tj(j - 1): tj(j - 1) = temp2
  End If
Next j
 Next i
For i =1 To 35
 List2.AddItem Str(i) + adj(convert(zh(i)), 6) + adj(Str(tj(i)), 6)
Next i
End Sub
解析 (1)“选课”字段值为“1100001”,7选3科目顺序为“物化生政史地技”,因此可知所选科目为物化技。(2)自定义函数convert(x)的功能是将选科标志转换为对应的科目,学生的选科标志存放在数组xk中,数组元素xk(n)表示第n位学生的选科标志,科目信息存储在变量km中,因此①处代码为km = convert(xk(n));②处代码表示统计各选科组合的人数,因此②处代码为tj(i) = tj(i) + 1;③处代码表示采用冒泡排序按各组合的人数降序排序,因此代码为tj(j) >tj(j - 1)。
答案 (1)物化技 (2)①km = convert(xk(n)) ②tj(i) = tj(i) + 1 
③tj(j) >tj(j - 1)
能力提升
3.小林和小王合作编写了一个查询英语单词的VB程序:小林编写一个过程,单击“读取数据库”按钮Command1,从一个数据库中读取英语单词和中文含义,分别保存在a数组和b数组中,并显示在List1中;小王编写另一个过程,在文本框Text1中输入要查询的单词,单击“查询”按钮Command2,将查询单词的中文含义显示在Text2中,程序界面如图所示。
(1)分析程序,“英语单词”和“中文含义”被保存在数据表________中。
(2)实现上述要求的VB程序如下,请在划线处填入合适的代码。
Const n=3500′存储单词的总数
Dim a(1 To n) As String′依次存储每个英语单词
Dim b(1 To n) As String′依次存储每个英语单词的中文含义
Private Sub Command1_Click()
 Dim conn As New ADODB.Connection
 Dim rs As New ADODB.Recordset
 Dim strSQL As String
 conn.ConnectionString = “Provider=Microsoft.ACE.OLEDB.12.0;Data source=” &App.Path& “dictionary1.accdb”
 strSQL = “select * from list”
 conn.Open
 Set rs.ActiveConnection = conn
 rs.Open strSQL
 num = 0
 Do While Not rs.EOF
num = num + 1
a(num) = rs.Fields(“word”)
b(num) = rs.Fields(“mean”)
rs.MoveNext
 Loop
 rs.Close
 conn.Close
 Set rs = Nothing
 Set conn = Nothing
 For i = 1 To n
List1.AddItem a(i) + “ ” + b(i)
 Next i
End Sub
Private Sub Command2_Click()
 Dim s As String
 s = Text1.Text
 If search(s) = -1 Then
Text2.Text=“找不到该单词”
 Else
Text2.Text=______①______
 End If
End Sub
Function search(key As String) As Integer
 Dim i, j As Integer
 Dim mid1, mid2 As Integer
 i = 1: j = n
 search = -1
 Do While i<= j
mid1 = Int(i + (j - i) / 3)
mid2 = Int(j - (j - i) / 3)
If key = a(mid1) Then
  search = mid1
  Exit Do
ElseIf key   j = mid1 - 1
ElseIf key = a(mid2) Then
  search = mid2
  Exit Do
ElseIf key >a(mid2) Then
  i = mid2 + 1
Else
  i = mid1 + 1
______②________
End If
 Loop
End Function
解析 (1)本小题主要考查的是数据表。从语句“strSQL = “select * from list””可知数据表名称为list。(2)①处代码为调用自定义函数search,自定义函数search(key)使用三分查找的思想来数组元素中查找单词key,若能找到,则返回函数值为单词在数组中的位置,若找不到,则返回的函数值为-1;②处代码表示要想找的单词在中间段中,因此将分别修改查找范围的起点i和终点j的值。
答案 (1)list (2)①b(search(s)) ②j=mid2-1
4.医院每天提前发放100个预约号。考虑到老人身体原因,预约病人按照以下规则进行就诊:
①老年人(年龄>=60)比非老年人优先就诊。
②老年人按年龄从大到小的顺序就诊,年龄相同的按预约号顺序就诊。
③非老年人按预约号顺序就诊。
小王根据以上规则编写了一个VB程序,通过引入索引数组temp,进行排序,使得age(temp(1))≥age(temp(2))≥age(temp(3))……≥age(temp(n))。示例如图a所示。
程序运行时,病人数据显示在列表框List1中,单击“”就诊排序按钮Command1,排序结果显示在列表框List2中,程序运行界面如图b所示。
图b
实现上述功能的VB程序如下,请回答下列问题:
(1)分析程序,可知程序中读取的病人名单来自________数据库中的________数据表中的________字段(填写具体的名称)。
(2)请在划线处填入合适的代码。
Dim pname(1 To 100) As String, age(1 To 100) As Integer
Dim n As Integer, num(1 To 100) As Integer
Private Sub Form_Load()
 dim conn as New ADODB.Connection,rs As New ADODB Recordset
 conn.ConnectionString = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & App.Path & “pdxt.accdb”
 conn.open
 Set rs.ActiveConnection = conn
 rs.open “select * from jzmd”
 n = 0
 List1.AddItem “就诊号 名单 年龄”
 Do While Not rs.EOF
______①____
num(n) = n
pname(n) = rs.Fields(“list”)
age(n) = n
pname(n) = rs.Fields(“age”)
List1.AddItem Str(num(n)) & “ ” & pname(temp2(n)) & “ ” & Str(age(n))
rs.movenext
 Loop
 rs.Close: conn.Close
 Set rs = Nothing: Set conn = Nothing
End Sub
Private Sub Command1_Click()
 Dim temp1(1 To 100) As Integer, temp2(1 To 100) As Integer
 Dim i As Integer, j As Integer, k1 As Integer, k2 As Integer, t As Integer
 k1 = 0: k2 = 0
 For i = 1 To n
If age(i) < 60 Then
  k1 = k1 + 1
  temp1(k1) = num(i)
Else
  k2 = k2 + 1
  temp1(k2) = num(i)
End If
 Next i
 For i = 1 To k2 - 1
For j = k2 To i + 1 Step -1
  if ____②____ then
t = temp2(j): temp2(j) = temp2(j - 1): temp2(j - 1) = t
  End If
Next j
 Next i
 List2.Clear
 List2.AddItem “就诊号  名单 年龄”
 For i = 1 To k2
List2.AddItem Str(i) & “ ” & pname(temp2(i)) & “ ” & Str(age(temp2(i)))
 Next i
 For j = 1 To k1
List2.AddItem ____③____ & “ ” & pname(temp2(j)) & “ ” & Str(age(temp2(j)))
 Next j
End Sub
解析 (1)本小题主要考查的VB访问数据库的相关知识。(2)变量n表示读取的记录数,每读取一条记录,则进行计数,因此①处为n=n+1;②处代码的功能是使用冒泡排序按年龄大小降序排序,存放年龄的数组为age,下标为temp2(j),因此②处代码为age(temp2(j))答案 (1)pdxt.accdb jzmd list 
(2)①n=n+1 ②age(temp2(j))课件19张PPT。第5讲 算法在数据管理中的应用一、VB访问数据库1.ADO访问Access数据库ADO是微软公司提供的一种应用程序访问数据库的编程接口。该接口包含了多个对象,其中Connection对象用于和数据库建立连接,在建立连接后,用Recordset对象获取数据表中的数据。2.通过Connection连接数据库在用Connection建立和数据库的连接时,需要设置ConnectionString属性的值(即连接字符串),以指定连接数据库所用的驱动程序、数据源名称、用户名和密码。下列语句定义一个Connection对象的实例conn,并设置conn的连接字符串:
Dim conn As New ADODB.Connection
conn.ConnectionString=“Provider=Microsoft.ACE.OLEDB.12.0;DATA Source=”&App.Path&“Contacts.accdb”
其中,参数“Provider”用于指定连接的提供者(Microsoft.ACE.OLEDB.12.0可以访问Access2010数据库);DATA Source用于指定数据库的文件名(含绝对路径);
App.Path返回当前应用程序所在的绝对路径。
Connection对象具有Open、Close等方法,其中Open方法用于打开到数据源的连接,Close方法用于关闭连接。3.通过Recordset对象获取数据表中的数据在用Recordset对象从数据库中获取数据时,要设置ActiveConnection属性的值。
语句Set rs.ActiveConnection=conn,使Recordset对象的实例rs与Connection对象的实例conn建立关联。在与conn建立关联后,可用Recordset对象的Open方法获取数据表中的数据。下列语句用于打开记录集,将SQL语句的查询结果保存到记录集rs中:
rs.Open“SELECT*FROM info”
该语句执行后,记录集rs中的数据为SQL语句“SELECT * FROM info”查询到的结果。
打开Recordset时,若Recordset非空,当前记录位于第一条记录。
Recordset对象的Close方法用于关闭对象。Recordset对象的Fields集合用于返回当前记录中的数据。如:rs.Fields(“fName”)返回当前记录中“fName”字段的值;rs.Fields(0)返回当前记录中第一个字段的值,如果第一个字段名为“fName”,rs.Fields(0)与rs.Fields(“fName”)返回值相同。Recordset对象的MoveNext方法用于把当前移动到下一条记录。若到结尾处还继续向下移动,程序会出错,因此在使用MoveNext时要判断Recordset的EOF属性,判断是不是到达结尾处。EOF属性取值为“True”或“False”。4.Select语句Select语句是结构化查询语言SQL中最常见的语句,主要用于从数据表中查询数据。如语句“SELECT * FROM info”表示查询数据表“info”中的全部数据。二、算法在数据管理中的综合应用VB程序获取到的Access数据库中的数据,可采用数组等方式进行存储,并可以通过编程对这些数据进行各种加工处理,如统计、分析、查找、排序等。一、VB访问数据库VB访问Access数据库,从数据表中读取相关数据,并存储在数组中。【典例1】 读取Access数据库“student.accdb”的数据表“xsinfo”中读取记录,并分别显示在相应位置。
程序运行时,单击“显示记录”按钮Command1,并在文本框Text1、Text2、Text3中显示第一条记录的信息,单击“下一条”按钮Command2,将显示下一条记录。程序运行效果如下图所示:实现上述功能的VB程序如下,请在划线处填入合适的代码。
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Private Sub Command1_Click()
 conn.ConnectionString = “Provider = Microsoft.ACE.OLEDB.12.0;DATA Source=” & App.Path & “____①____”
 conn.Open Set rs.ActiveConnection = conn
 rs.Open “SELECT * FROM ____②____”
 Text1.Text = rs.Fields(“姓名”)
 Text2.Text = rs.Fields(“班级”)
 Text3.Text = rs.Fields(“性别”)
End Sub
?
Private Sub Command2_Click()
 rs.MoveNext     ′移动到下一条记录
 If Not rs.EOF Then  ′判断是否已到记录集的最后一条记录 Text1.Text = rs.Fields(“姓名”)
Text2.Text = rs.Fields(“班级”)
Text3.Text = rs.Fields(“性别”)
 Else
MsgBox (“记录已全部显示完毕!”)
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
 End If
End Sub解析 本题主要考查的是VB访问数据库的相关知识。划线①处为访问的数据库的名称,从题中可知数据库名称为“student.accdb”;划线②处为数据表的名称,从题中可知数据表名称为“xsinfo”。
答案 ①student.accdb ②xsinfo
【方法总结】 VB访问数据库时,需要知道正确的数据库名称和数据表的名称。二、数据分析【典例2】 读取Access数据库“student.accdb”的数据表“xsinfo”中读取记录,将记录显示在列表框中,并统计女生的人数。
程序运行时,单击“显示记录”按钮Command1,将记录信息分别存储在数组a、b、c中,并显示在列表框List1中,单击“统计”按钮Command2,将女生人数显示在标签Label1中。程序运行效果如下图所示:实现上述功能的VB程序如下,请在划线处填入合适的代码。
Dim b(1 To 100) As String
Dim c(1 To 100) As String
Private Sub Form_Load()
 conn.ConnectionString = “Provider = Microsoft.ACE.OLEDB.12.0;DATA Source=” & App.Path & “student.accdb”
 conn.Open
 Set rs.ActiveConnection = conn
 rs.Open “xsinfo”
 p = 0 Do While  ____①____
____②____
a(p) = rs.Fields(“姓名”)
b(p) = rs.Fields(“班级”)
c(p) = rs.Fields(“性别”)
rs.MoveNext      
 Loop
 rs.Close
 conn.Close
 Set rs = Nothing
 Set conn = Nothing
End SubPrivate Sub Command1_Click()
 Dim i As Integer
 List1.AddItem “姓名” + “班级” + “性别”
 For i = 1 To p
 List1.AddItem a(i) + “  ” + b(i) + “ ” + c(i)
 Next i
End SubPrivate Sub Command2_Click()
 Dim i As Integer
 Dim count As Integer
 For i = 1 To p
 If ____③____ Then count = count + 1
 Next i
 Label1.Caption = “共有女生数:” + Str(count)
End Sub解析 本题主要考查的是VB访问数据库,将进行简单的统计分析。划线①处表示将数据表中的每一条记录存储在数组中,读取记录时需判断当前位置是否已到达记录集的最后一条记录,否则将会出错,因此①处代码为Not rs.EOF;②处代码表示统计记录的个数,用变量p进行计数,因此②处代码为p=p+1;③代码表示统计女生的人数,性别存储在数组c中,因此③处代码为c(i) = “女”。
答案 ①Not rs.EOF ②p = p + 1 ③c(i) =“女”【方法总结】 将数据库中数据存储在数组中,可对数组中数据进行统计分析。
同课章节目录