While Not rsAuthors.EOF Response.Write rsAuthors("au_lname:) & ", " & _ rsAuthors("au_fname") & "<BR>" rsAuthors.MoveNext Wend 上面的例子一直循环到EOF属性为True时才退出。MoveNext方法用于移到下一条记录。 如果记录集允许向后移动,则可以使用MovePrevious方法。在这种情况下,循环中需要检测BOF属性值。另外分别还有移动到第一条和最后一条记录的MoveFirst和MoveLast方法: rsAuthors.Open "authors", strConn, adOpenDynamic ' Now on first record
rsAuthors.MoveLast ' Now on last record rsAuthors.MovePrevious rsAuthors.MovePrevious ' Now three rows from the end of the recordset
rsAuthors.MoveFirst ' Back at the beginning again 3. 使用Fields集合 Fields集合包含记录集中每一字段(列)的Fields对象。Fields集合是记录集的缺省集合,因此在访问字段时可以省略,就如同上面的While...Wend例子中的情况。因此,有多种访问字段的方法: rsAuthors.Fields("au_lname").Value rsAuthors("au_lname).Value rsAuthors(1).Value rsAuthors.Fields(1).Value 可以使用字段名,或使用它在集合中的位置。使用名字是最好的,因为这样将使代码更易于维护。 Value属性是字段的缺省属性,因此也可以省略,比如: rsAuthors("au_lname") 如果想遍历所有字段,可以使用For Each结构: For Each fldAuthor In rsAuthors.Fields Response.Write fldAuthor.Name & " : " & _ fldAuthor.Value & "<BR>" Next 这个例子将打印每一个字段的名字和值。 4. 书签 当在记录集中移动时,可能需要保留记录的位置,以后再移回来。同真实的书签相似,一个记录集书签是一个指向单个记录的唯一的指针。 为了使用书签,只需将Bookmark属性值赋予一个变量: varBkmk = rsAuthors.Bookmark 然后,可以在记录集中移动,以后可以通过相反的命令将记录移到做过书签标记的相应记录上: rsAuthors.Bookmark = varBkmk 在记录集中查找记录时,书签是非常有用的。在本章稍后的8.4.5节中有一个相关的例子。 注意,并非所有记录集都支持书签,Supports方法(在下面讨论)将能识别其是否支持书签。 值得注意的重要一点是,不能跨越不同的记录集使用书签,即使这些记录集是相同的命令创建的。考虑一下以下代码: rsAuthors.Open "authors", strConn rsAuthorsOther.Opne "authors", strConn
尽管两个记录集是用相同的命令创建的,但记录集的书签是不一样的。 可以使用Clone方法获得可交换的书签,但在这里我们不讨论它。 5. 支持的功能 如上所述,并非所有的记录集都支持书签。还有许多其他的记录集选项也不是被所有的提供者或记录集类型支持的,因此可以用Supports方法验证一下。 Supports方法使用一个或多个CursorOptionEnum值作为参数,返回True或False表明是否支持该选项。这些值的列表相当庞大,所以将其列于附录F中。 例如: If rsAuthors.Supports(adBookmark) Then ' The recordset supports bookmarks varBkMk = rsAuthors.Bookmark End If 可以使用Or或加号“+”组合多个常数: If rsAuthors.Supports(adBookmark Or adFind) Then ' The recordset supports bookmarks and use of Find varBkMk = rsAuthors.Bookmark End If
' Save bookmark for the first record avarBkmk(0) = rsAuthors.Bookmark
' Move forward two records rsAuthors.MoveNext rsAuthors.MoveNext
' Save bookmark for the third record avarBkmk(1) = rsAuthors.Bookmark
' Move to the end and save the bookmark rsAuthors.MoveLast avarBkmk(2) = rsAuthors.Bookmark
' Now apply the filter rsAuthors.Filter = Array(avarBkmk(0), avarBkmk(1), avarBkmk(2))
' Now loop through the recordset While Not rsAuthors.EOF Response.Write rsAuthors("au_lname") & "<BR>" rsAuthors.MoveNext Wend 当循环至记录集末尾位置时,会发现只有三条记录,因为只有三个书签应用于过滤条件。 注意,不能直接使用数组avarBkmk,必须使用Array函数将各个书签转换成不同的数组。
8.4.5 查找记录 查找单个的记录由Find方法来完成。它类似于使用条件的过滤方法: rsAuthors.Find "au_lname = 'Lloyd'" 它们之间最主要的区别在于这种方法只能有一个条件,不允许使用And或Or。 可以使用可选的参数指定一些额外的选项,其完整的语法如下: Recordset.Find Criteria, [SkipRows], [SearchDirection], [Strat] SkipRows是一个数字,表示在开始查找记录前跳过的行数。缺省为0,查询从当前行开始。 SearchDirection可以是adSearchForward,表示向前搜索记录;或者adSearchBackward,表示向后搜索记录。 Start是一个书签,指出开始查找记录的位置。 如果打开相应的记录,当前指针将位于匹配的记录上,如果没有找到记录,那么将位于下面两个位置中的一个: · 如果是向前搜索,则位于记录集末尾位置的后面,EOF被设置为True。 · 如果是向后搜索,则位于记录集开始位置的前面,BOF被设置为True。 使用书签保存位置 如果没有找到相应的记录,记录的重新定位可以由书签轻松解决,因为可以为当前位置制作书签,如果在查找记录过程中没有找到所需的记录,那么再移回到上次保存的位置。 例如: ' Save the current position varBkmk = rsAuthors.Bookmark
' Find the record rsAuthors.Find "au_lname = 'Sussman'"
' Was it found If Not rsAuthors.EOF Then Response.Write "Found: " & rsAuthors ("au_lname") & ", " & _ rsAuthors("au_fname") & "<BR>" Else Response.Write "Not found. Moving <BR>" rsAuthors.Bookmark = varBkmk End If 使用Filter属性强于Find方法的一个原因是Find语句只能一个查询条件,而Filter属性允许指定多个条件。也就是说,当想要查找的字段条件不止一个时,不能使用Find方法。然而,可以先过滤记录,如果找到记录可以再删除过滤条件。
End With 这只是添加了一条新记录,设置四个强制型的字段值。 另一种方法是使用AddNew方法的可选参数,这是两个数组,一个是字段名,另一个是字段的值。 With rsAuthors .Open "authors", strConn, adOpenDynamic, _ adLockOptimistic, adCmdTableDirect
.AddNew Array("au_id", "au_lname", "au_fname", "contract"), _ Array("123-12-1234", "Lloyd", "Janine", 0) End With 这个方法不需要调用Update方法。 2. 编辑记录 编辑记录与添加记录的方法相似,不同之处在于不需要调用AddNew方法: strSQL = "SELECT * FROM authors" & _ "WHERE au_lname='Lloyd'"
With rsAuthors .Open strSQL, strConn, adOpenDynamic, _ adLockOptimistic, adCmdText