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