从图3-26中可以看到数据库中一共有两条age为50的记录,那么在脚本中只有一个MSGBOX来打印出结果。读者会说那就再重复打印一次field语句,那么就在原来那行MsgBox adoRst.Fields.Item("age").Value脚本下再复制一行:
'获得结果集中年龄字段的值 MsgBox adoRst.Fields.Item("name").Value MsgBox adoRst.Fields.Item("name").Value |
但是非常遗憾的是,在执行完以上脚本后,执行结果是两个值都是zzxxbb112,而不是zzxxbb112和51testing。为什么不会打印第二个?难道就没办法了吗。其实解决办法很简单,不过在解决这个问题之前,需要给读者介绍一个名词,它叫“游标”,我们都知道在测量中有游标卡尺,而游标在游标卡尺中的作用是可以移动到任何地方并测量出对应的结果数据。当然在数据库中也有这样一个概念,游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。当SQL语句执行完毕并获得多条结果集时,游标在初始状态下是指向第一条记录的,此处可以利用数据库游标来随意移动获取到需要的结果记录。
MoveNext方法:用于移动游标到下一条记录
那么原来的脚本只需要改成:
'打印结果集的第一条记录 MsgBox adoRst.Fields.Item("name").Value ‘将游标移动到下一条记录 adoRst.MoveNext ‘打印结果集中的第二条记录 MsgBox adoRst.Fields.Item("name").Value |
分析:
以上脚本其实已经完成了之前的要求,但还不是一个完整又灵活的脚本,因为现在我们是知道数据库查询结果集的个数,一旦数据集非常多的情况,又无法知道需要移动多少次游标时,这样的脚本就完不成任务了。那么应该如何去更改我们的脚本呢?在这里提供两种方法供读者参考。
方法1:FOR循环法。
‘获取结果集的个数,并进行遍历 For i=1 To adoRst.Fields.Count ‘打印结果集中name的值 MsgBox adoRst.Fields.Item("name").Value ‘移动游标到下一条记录 adoRst.MoveNext Next |
分析:
执行脚本后能够正确获取到对应的两条记录结果,此处的adoRst.Fields.Count是获取记录集的个数,通过for循环进行遍历,并在每次循环next之前把游标移动到下一条记录上。从而获取到所有对应的记录值。
方法2:EOF循环法。
‘如果游标不为最后一条记录就一直循环 While Not adoRst.EOF ‘打印结果集中name的值 MsgBox adoRst.Fields.Item("name").Value ‘移动游标到下一条记录 adoRst.MoveNext Wend |
分析:
注意,这里脚本中的EOF代表最后一条记录的意思,缩写为End Of File,翻译过来就是文件结束。那么在脚本里是作为一个文件结束的标志,也就是说,如果游标定位没有移动到末尾处,也就是最后一行就继续循环,直到游标移动到最后一条记录跳出循环。执行以上脚本结果和上面的方法1完全一样,同样也是把所有记录都一一打印出来。
这里两种方式都是可以的,就看读者比较偏向哪一种了,本人比较偏向第二种,因为第二种方法可以省去一个循环变量i,而且EOF方法是ADO内置的一种专门针对多条数据记录准备的,因此,个人认为,在性能或者是稳定性上应该比方法1好一些。