该主题中的代码示例来源于示例应用程序 DataTree.vbp,该示例应用程序列在 Samples目录中。
在说明“ListView 控件的说明 1:与 TreeView 控件一起使用 ListView 控件”中,ListView 控件和 TreeView 控件是协同工作的。在那个说明中用 TreeView 控件的 NodeClick 事件调用名为“GetTitles”的过程充填 ListView 控件。那个过程查询“标题”表以创建记录集,然后为找到的每条记录创建 ListItem 对象。
在“标题”表中没有包含书作者姓名的信息。不过在“标题”表中有名为“ISBN”的字段,该字段保存了该书的 ISBN 编号。在另外一个名为“作者标题”的表中也有这个字段的值,在那张表中与 ISBN 值相关联的 Au_ID 字段标识了该书的作者。
要获取作者的姓名,该函数必须执行如下步骤
本说明中用到了下面的对象:
GetAuthor 函数用 ISBN 字段的值查找“作者标题”记录集。和其它数据库操作一样,先声明了一个 RecordSet 类型的对象变量,然后打开“作者标题”表,并将对该表的引用赋予对象变量。既然代码中使用了两个记录集,那么就一起声明对象变量,然后打开记录集,如下所示。
Dim rsTitleAuthor As Recordset
Dim rsAuthors As Recordset
Set rsTitleAuthor = mDbBiblio. _
OpenRecordset("Title Author", dbOpenDynaset)
Set rsAuthors = mDbBiblio. _
OpenRecordset("Authors", dbOpenDynaset)
用 rsAuthors 对象变量和 ISBN 字段中的值查找“作者标题”表:
Dim strQuery As String
strQuery = "ISBN = " & "'" & ISBN & "'"
rsTitleAuthor.FindFirst strQuery
FindFirst 方法返回在查询中符合条件的第一条记录。在“作者标题”表中的另一个字段是“Au_ID”,它包含了“作者”表中作者的 ID。这样,就能够用查询中的“Au_ID”字段的值搜索“作者”表了,如下所示:
'
重新设置查询字符串。strQuery = "Au_ID = " & rsTitleAuthor!AU_ID
'
用FindFirst
方法继续搜索。rsAuthors.FindFirst strQuery
最后,进入“作者”表后,“Au_ID”字段也找到了。假定没有发生任何错误,那么当前记录应返回作者的姓名。下面的代码使函数将作者的姓名返回给调用该函数的代码:
GetAuthors = rsAuthors!Author
完整的函数如下所示:
Private Function GetAuthor(ISBN) '
声明DAO
对象变量。Dim rsTitleAuthor As Recordset
Dim rsAuthors As Recordset
'
将对象变量设置为记录集。Set rsTitleAuthor = mDbBiblio. _
OpenRecordset("Title Author", dbOpenDynaset)
Set rsAuthors = mDbBiblio. _
OpenRecordset("Authors", dbOpenDynaset)
'
创建查询字符串。Dim strQuery As String
strQuery = "ISBN = " & "'" & ISBN & "'"
rsTitleAuthor.FindFirst strQuery
'
如果没有作者,则返回"n/a"
。'
否则,返回作者的姓名。If rsTitleAuthor.NoMatch Then
GetAuthor = "n/a"
Exit Function
Else
'
假定找到了正确的记录集。'
然后用Au_ID
字段值重新设置查询字符串,'
并搜索“作者”表。strQuery = "Au_ID = " & rsTitleAuthor!AU_ID
rsAuthors.FindFirst strQuery
'
返回Author
字段中的作者姓名。GetAuthor = rsAuthors!Author
End If
End Function