第十二章 Recordset对象 Recordset对象是数据记录的集合,而数据记录又是字段集合。因此利用recordset对象,在程序中就可以存取所有数据记录每一个字段的数据了。所以说recordset对象是存取数据库数据最重要的源头。在数据库程序设计中,recordset对象是一个十分重要对象。 1、recordset与数据表的存取 前面我们介绍了几个改变recordset寻象当前记录的方法。 Recordset对象每次只能存取一条记录,就是当前记录。 例:在立即窗口中输出当前记录所有字段值。 For I=0 to adodc1.recordset.fields.count-1 debug.print adodc1.recordset.fields(I).value next i
1)存取字段几种格式 格式一:adodc1.recordset.fields(I).value 功能:存取adodc1绑定数据库中recordset所对应数据表的当前记录 格式二:adodc1.recordset.fields(“字段名称”).value 例如:当前记录: 股票代号 股票名称 收盘价 050001 基金金泰 12.65 则下面的语句是一样的。 Adodc1.recordset.fields(0).value adodc1.recordset.fields(“股票代号”).value 其值都是:050001 2)存取字段数据的几种变形语句: 存取字段数据的语句 说明 recordset.fields(“字段名称”) 省略了.value recordset(“字段名称”) 省略了.value recordset![“字段名称”] 字段名称处不能用变量名。
练习:实验书P7练习6 例:实验书P7练习七(ch10\练习7.vbp) 2、Recordset与数据记录的增删修改 在前面我们利用datagird控件allowaddnew、allowdelete属性改为true。实验记录的修改、新增和删除记录功能,本节不利用datagird控件来完成这些操作,而直接利用recordset对象来进行数据记录修改、新增、和删除。 1)删除数据记录(recordset.delete) 将要删除的记录设置为录前数据记录,然后调用recordset.delete 例如:要删除最后一条记录 adodc1.recordset.movelast adodc1.recordset.delete 此时当前数据记录不存在,必须调用move xxxx之类方法才能使用权recordset对象重新拥有当前数据据记录 2)连续删除多条数据记录的问题:
如果我们写的程序如下: adodc1.recordset.movefirst adodc1.recordset.delete 则执行时会产生错误,将程序修改,在每个delete后面加上doevents语句则可。 例:实验书P10练习二。 3)修改数据记录 如果把当前数据记录的每一个字段都视为一个变量,则修改字段落内容语句可以写成: adodc1.recordset(“字段名称”)=新的值 但是上面语句只是把数据写到缓冲区,只有当发生以下两种情况时,缓冲区内被更新数据才会写到数据库中 调用了 recordset.update 改变了记录位置 movexxxx
例如:下面写法可以将更新数据立即写入到数据库。 写法一:adodc1.recordset(“字段名1”)=新的值1 adodc1.recordset(“字段名1”)=新的值2 …… adodc1.recordset.update 写法二: adodc1.recordset(“字段名1”)=新的值1 adodc1.recordset.movemext 例:P10练习三(ch11\练习3.vbp) 4)取消更新数据(cancelupdate方法) recordset除了调用update方法或改变当前数据记录的位置来使要更新数据立即写到数据库之外,recordset对象也允许我们在修改数据记录之后,在数据尚未写入数据库以前,将要更新的数据撤消,让表中数据恢复原状,此时调用方法:cancelupdate方法。
例:实验书P11练习四( ch11\练习4.vbp) 5)新增数据记录 新增数据记录的方法与修改数据记录十分类似。所谓修改数据记录,是针对当前记录的数据进行修改,然后调用update方法 或移动当前数据记录将数据写入到数据库中,或是调用cancelupdate方法 取消数据的更新。 新增数据主录则是先建立一个缓冲区,并且将缓冲区设置为录前数据记录,然后就可以像修改记录的数据一样,修当前记录的内容了。最后如果确定要新增该条记录数据,就可以调用update方法或移动当前数据记录将数据写入到数据库中,如果要取消新增的记录数据的操作,就调用cancelupdate方法。新增记录大致可以写成如下: adodc1.recordset.addnew adodc1.recordset(“字段名1”)=值1 …… adodc1.recordset.update (cancelupdate)
3、recordset与数据记录的检索 所谓数据记录检索:其作用是要检索符合某一些条件的记录,然后将检索到第一条记录设置为当前数据记录。 1)检索数据记录方法 recordset.find 表达式, skiprows, searchdirection start 表达式:检索数据的表达式 skiprows:跳过几条记录才开始检索。省略时为0 searchdirection:检索方向。其值:adsearchforward 表示向下检索 adsearchbackward 表示向上检索 省略时表示从当前记录开始检索 start:开始检索的位置,省略时表示从当前记录开始检索。 例:检索表达式为:s=“收盘价>200” adodc1.recordset.find s 从当前记录起的第八条记录开始向下检索 adodc1.recordset.find s, 11 ‘当前记录在第三条记录
从第一条记录开始向下检索 adodc1.recordset.movefirst adodc1.recordset.find s 从最后一条记录开始向上检索 adodc1.recordset.mjovelast adodc1.recordset.find s , adsearchbackward 2)检索结果与当前数据记录 如果调用find方法后,找到了符合要求的记录数据后,则当前数据记录将移至被找到记录,如果调用find方法没有找到符合要求的记录数据,则当前数据记录变成不存在,此时不能利用“recordset(“字段名”)语句来存取数据,否则产生错误。 要检索find方法是否找到符合要求的记录数据,应该利用eof或bof属性来进行判断,如果检索方向是向下检索,则当recordset.eof 为true检索不到。
3)检索数据记录的表达式: 表达式基本格式: “字段名称 比较符号 比较数据 ” 其中: 字段名称:必须是已绑定数据表中字段名称,且当字段落名称中含有空格时字段名称两侧须用“[ ]”括起来。 例:涨 跌 “[涨 跌]>5.5” 而写成:“涨 跌>5.5”是错 比较数据:比较数据可分成“数值”、“日期时间”、“字符串”。它们书写样式: 比较数据是常数值: 数据类型 表达式 数值 “收盘价 > 500” 字符串 “股票名称=‘四川长虹’” 日期时间 “交易日期> #19997/7/1# ”
比较数据是变量: 变量类型 表达式 数值型(v=500) “收盘价>” & v 字符型(v=“四川长虹”) “股票名称= ‘”& v &”’” 日期时间(v=# /19997/7/1 #) “买卖日期=# ”& v &”#” 例:实验书P11练习五(ch11/练习5.vbp) 为stock01.mdb中的“股票行情表”数据表编写一个检索程序,查找所有收盘价大于200的股票,或查找所有大于指定成交量的股票。及按用户输入 的股票名称,查找该股票收盘价,将查找到信息输出到listbox框。 比较运算符 < 、<= 、>、 >=、 =、 <>及 like like : 字段名称 like 比较字符串 比较字符串可以使用:% * _ 作为通配符。 查找股票名称以“华”字开头股票且字数为2的表达式: “股票名称 like ‘华_’”
查找以华结尾的股票,其表达式: “股票名称 like ‘%华‘“ 查找中间有“华”字的股票 “股票名称 like ‘%华%‘“ 例:实验书P13练习六(ch11/练习6.vbp) 编写一个stock01.mdb数据库检索的应用程序,用户可以选择数据库中的任何一个数据表,任何一个字段及一个运算符,输入一个要比较的数据。显示所组成的检索表达式,最后检索出满足条件的记录。程序介面如下: