在Access的系统构建中,有时需要访问某个特定的元组,即需要访问特定行和列上特定单元的值。由于SQL是面向集合操作的语言,采用SQL定位元组往往不太方便。特别是如果我们访问的元组的行数和列数都需要动态的变化的话,由于SQL对于列的引用只能通过域名,这就给实现带来更多的困难。此时,采用Visual Basic用ADO对象编程能够较方便地解决这个问题。
我们知道,利用ADO操作时对数据集的操作是通过动态集Recordset来完成的。由于Recordset在数据集中遍历时其游标只指向当前记录,所以对它的行的访问是很方便的。而要想访问当前行上特定元组的值,我们则可以利用Recordset的Fields集合来进行这个工作。Fields对象是由Field对象组成的集合,每个Field对应Recordset中的一列,Fields对象通过Fields.Item(n).Value来访问特定的n列的值,n的值从0开始计数。我们也可以直接通过recordset(n).Value的方式来访问该列的值,上述两种方式实际上是等价的,如下面的程序所示:
Dim db As Database
Dim tbRd As Recordset
Dim tbJN As Recordset
Dim tbQn As Recordset
Dim ind As Integer
Dim ZB(50) As String
Dim tbRd As Recordset
Set tbJN = db.OpenRecordset("SELECT * FROM 经济指标汇总查询1")
Set db=CurrentDb
Set tbQN = db.OpenRecordset("SELECT * FROM 经济指标汇总查询2")
Set tbRd = db.OpenRecordset("经济指标表") ‘注意写Set,否则出错
ind = 0
While tbRd.EOF = False ‘为ZB数组赋经济指标表第一列的值
ZB(ind) = tbRd.Fields.Item(0).Value ‘访问第0列,第一种写法
ind = ind + 1
tbRd.MoveNext
Wend
For ind = 0 To 25
If IsNull(tbJN(ind).Value) Then ‘访问第ind列,第二种写法
DoCmd.RunSQL ("UPDATE 经济指标表 SET 本年数据=NULL WHERE 指标名称='"+ZB(ind)+"'") ‘如果tbJN(ind)的为空,则经济指标表的本年数据赋空
Else
DoCmd.RunSQL ("UPDATE 经济指标表 SET 本年数据="+ CStr(tbJN(ind).Value) + " WHERE 指标名称='" + ZB(ind) + "'") ‘否则,赋tbJn(ind)的值
End If
If IsNull(tbQN(ind).Value) Then
DoCmd.RunSQL ("UPDATE 经济指标表 SET 去年同期数据=NULL WHERE 指标名称='" + ZB(ind) + "'")
Else
DoCmd.RunSQL ("UPDATE 经济指标表 SET 去年同期数据=" + CStr(tbQN(ind).Value) + " WHERE 指标名称='" + ZB(ind) + "'")
End If
Next
当然,上面描述的是通过Fields和Field属性的方法来进行这样的操作。其实由于recordset每次所操作的是一个记录行,从本质上就决定了它与SQL的多记录的集合操作方式不同,即每一次对recordset的特定的列的访问都只能访问到当前记录上特定的元组,而不象SQL访问的是一列的多个元组。其实在DAO中,规范的对特定元组的操作方法是通过对列名的引用来完成的,其形式为myRecordset!fieldName,如假设前例中的recordset tbJN的第5列的列名为“销售额”,其值为1330,则下列的形式在实质上是等价的:
tbJN!销售额 值为1330,优点是不用顾及所在列号,直接通过名字引用
tbJN(4).Value 值为1330,优点是可以利用变量引用不同列,灵活
而tbJN(4).Name的值则为“销售额”,是该列的列名。tbJN(4)从道理上讲则应该是该元组field对象,应该理解这些区别。