技术第五单元VB访问Access数据库技术夯实考点考点VB访问Access数据库1.通过ADO对象连接数据库VB中使用ADO访问数据库。ADO是微软公司提供的一种应用程序访问数据库的编程接口。该接口包含了多个对象,其中Connection对象用于和数据库建立连接,在建立连接后,用Recordset对象查询数据表。●Connection对象用Connection建立和数据库的连接时,需要设置连接字符串ConnectionString的参数。下列语句定义一个Connection对象的实例conn,并设置conn的连接字符串:DimconnAsNewADODB.Connection技术conn.ConnectionString=Provider=Microsoft.ACE.OLEDB.12.0;DATASource=&App.Path&\Contacts.accdb其中,参数Provider用于指定连接的提供者(Microsoft.ACE.OLEDB.12.0可以访问Access2010数据库),DATASource用于指定数据库的文件名(含绝对路径),App.Path返回当前应用程序所在的绝对路径。Connection对象具有Open、Close等方法,其中Open方法用于建立到数据源的连接,Close方法用于关闭连接。2.通过Recordset对象获取数据表中的数据●Recordset对象用Recordset对象从数据库中查询记录时,要设置ActiveConnection属性的值。语句Setrs.ActiveConnection=conn,使Recordset对象的实例rs与Connection对象的实例conn建立关联。在与conn建立关联后,可用Recordset对象的Open方法查询数据表的记录。Open方法的参数为SQL命令。技术如:rs.OpenSELECT*FROMinfo运行后,记录集rs中的数据为SQL语句SELECT*FROMinfo查询到的记录。Recordset对象的Close方法用于关闭对象。Recordset对象的Fields集合用于返回当前记录中的数据,如:rs.Fields(fName)返回当前记录中“fName”字段的值;rs.Fields(1)返回当前记录中第一个字段的值,如果第一个字段名为“fName”,rs.Fields(1)与rs.Fields(fName)返回值相同。Recordset对象的MoveNext方法用于把当前移动到下一条记录。若到结尾处还继续向下移动,程序会出错,因此在使用MoveNext时要判断Recordset的EOF属性,判断是不是到达结尾处。EOF属性取值为“True”或“False”。技术3.Select语句Select语句是结构化查询语言SQL中最常见的语句,主要用于从数据表中查询数据,如语句“SELECT*FROMinfo”表示查询数据表“info”中的全部数据。技术典例1将Access数据表中的第一条记录在VB文本框中显示。(1)准备Access数据库。在文件夹“VB访问Access数据库”下的“test41”文件夹中存有数据库文件“cityaqi.mdb”,其“aqi”表的结构与部分数据分别如图5-1与图5-2所示:技术(2)建立VB工程、选择ADO引用。新建VB工程,将窗体与工程分别以“test41.frm”与“test41.vbp”为名保存于“test41”文件夹中,打开“工程”菜单,单击“引用”项,在弹出的对话框中勾选“MicrosoftActiveXDataObjects6.0Library”引用项,如图5-3所示:技术(3)在标签框中显示数据表中的数据。建立如图5-4所示:技术命令按钮“显示”(Command1)和“退出”(Command2)的事件处理过程代码如下:PrivateSubCommand1_Click()DimconnAsNewADODB.ConnectionDimrsAsNewADODB.Recordsetconn.ConnectionString=Provider=Microsoft.ACE.OLEDB.12.0.DATASource=&App.Path&\cityaqi.mdbconn.OpenSetrs.ActiveConnection=connrs.OpenSELECT*FROMaqiText1.Text=rs.Fields(地区)Text2.Text=rs.Fields(aqi)Text3.Text=rs.Fields(等级)rs.Closeconn.CloseSetrs=NothingSetconn=NothingEndSubPrivateSubCommand2_Click()EndEndSub技术(4)运行程序。单击“显示”按钮,结果如图5-5所示:技术典例2在典例1的基础上,添加一个按钮对象Command3(即“下一条”按钮),增加和修改相关代码实现:单击“下一条”按钮时,在文本框Text1和Text2显示下一条记录,显示完最后一条记录时提示“记录已全部显示完!”。程序运行界面如图5-6所示:(1)添加按钮对象Command3,将Caption属性的值修改为“下一条”。技术(2)命令按钮“显示”(Command1)和“下一条”(Command3)的事件处理过程代码如下:DimconnAsNewADODB.ConnectionDimrsAsNewADODB.RecordsetPrivateSubCommand1_Click()conn.ConnectionString=Provider=Microsoft.ACE.OLEDB.12.0.DATASource=&App.Path&\cityaqi.mdbconn.OpenSetrs.ActiveConnection=connrs.OpenSELECT*FROMaqiText1.Text=rs.Fields(地区)Text2.Text=rs.Fields(aqi)Text3.Text=rs.Fields(等级)rs.Closeconn.CloseSetrs=NothingSetconn=Nothing技术EndSubPrivateSubCommand2_Click()EndEndSubPrivateSubCommand3_Click()rs.MoveNext′移动到下一条记录IfNotrs.EOFThen′判断是否已到记录集的最后一条记录Text1.Text=rs.Fields(地区)Text2.Text=rs.Fields(aqi)Text3.Text=rs.Fields(等级)ElseMsgBox(记录已全部显示完毕!)rs.Closeconn.CloseSetrs=NothingSetconn=NothingEndIfEndSub技术典例3(2015浙江省10月选考题)某数据加密方法描述如下:(1)以字节为单位进行加密处理;(2)将1个字节的8位二进制数分割成前4位与后4位两个二进制数;(3)分别将上述两个4位二进制数转换为十进制数;(4)将每个十进制数转换为1个加密字符,对应的“密码表”如下:值(十进制)0123456789101112131415加密字符IlikeCHNP0stcard技术小明按照上述方法,设计了一个字符串(仅包含ASCII字符)加密的VB程序,功能如下:单击“加密”按钮Command1,程序依次将文本框Text1中每个字符的ASCII码值作为1个字节转换为两个加密字符,连接这些加密字符,最后在文本框Text2中输出加密结果。下表显示了字符串中一个字符的加密过程:技术程序运行效果如图5-7所示。实现上述功能的VB程序如下:(1)请在划线处填入合适代码。PrivateSubCommand1_Click()DimnAsInteger,sAsString,iAsInteger,ssAsStringDimaAsInteger′存储加密前字符的ASCII码Dimb1AsInteger,b2AsInteger′分别存储分割、转换后的两个十进制数技术s=Text1.Text①Fori=1Tona=Asc(Mid(s,i,1))b1=a/16b2=aMod16ss=ss+Code2Char(b1)+Code2Char(b2)Text2.Text=ssNextiEndSub′十进制值转换为加密字符的函数FunctionCode2Char(cAsInteger)AsStringDimsAsStrings=IlikeCHNpostcardCode2Char=②EndFunction技术(2)若将“密码表”中值为“0”对应的加密字符“I”改成“i”,加密后的密文可能无法解密,原因是。解析:(1)加密过程的实质就是将英文字符内码转换成十六进制数。通过两条语句“b1=a/16”“b2=aMod16”将每个ASCII字符分成2个十六进制数,然后通过自定义函数Code2Char,将十六进制数转换成对应的加密字符。①处代码表示为加密前字符串的长度,因此应填入n=Len(s);十六进制数包含的数字为0~15,对应字符串中字符的位置为1~16,因此②处语句为Mid(s,c+1,1)。(2)若将“密码表”中值为“0”对应的加密字符“I”改成“i”,这样加密字符i就对应两个值0和2,因此无法解密。答案:(1)①n=Len(s)②Mid(s,c+1,1)(2)加密字符i对应两个值0,2。技术典例4用VB编写一个字符串分行程序,功能如下:单击“分行”按钮Command1,将文本框Text1中的英文文本在列表框List1中分行显示(分行时单词不得跨行,每行字符尽可能多但不超过40个),并在标签Label1中输出总行数,运行效果如图5-8所示。分行算法如下:(1)将文本框中的字符串保存到变量s中;(2)当s中字符个数超过40时,循环执行下列①,②,③步,否则跳转到(3):①如果第41个字符不是英文字母,则分行位置p=40;否则,向左逐个查找,直至找到第一个非英文字母,将其位置作为分行位置p;②截取s的前p个字符,作为新增行显示在列表框List1中,同时总行数加1;③将s中未分行部分重新赋值给变量s。技术(3)将s作为新增行显示在列表框List1中,同时总行数加1。技术实现上述功能的VB程序如下,请在划线处填入合适代码。PrivateSubCommand1_Click()DimsAsString,cAsStringDimrAsInteger,totalAsInteger,pAsIntegertotal=0s=(1)DoWhileLen(s)40r=41c=Mid(s,r,1)IfNot((c=aAndc=z)or(c=AAndc=Z))Thenp=40Else′从第41个字符开始向左找到第1个非英文字母,并将其位置值赋给pDoWhile(c=aAndc=z)or(c=AAndc=Z)技术r=(2)c=Mid(s,r,1)Loopp=rEndIfList1.AddItemMid(s,1,p)total=total+1s=(3)LoopList1.AddItemstotal=total+1Label1.Caption=共+Str(total)+行EndSub技术解析:本题的难点在于:第41个字符为英文字母,即单词跨行的情况。如果单词跨行,则从当前位置往前查找,找到一个非英文字母为止,然后将前面一段字符显示在列表框List1中,再截取后面的字符做相同的处理。(1)处表示将文本框Text1中的字符赋给变量s,因此(1)处应填入Text1.Text;(2)处表示单词跨行的情况,则往前查找,因此(2)处代码为r-1;(3)表示截取分行后的后面的字符,字符个数为Len(s)-p,因此(3)处代码为Mid(s,p+1,Len(s)-p),也可用Right函数截取字符串s后面的Len(s)-p个字符,因此也可填入Right(s,Len(s)-p)。答案:(1)Text1.Text(2