更多可以在資料錄集中移動的方法
下列四種方法可用於在 Recordset 中移動或捲動:MoveFirst、MoveLast、MoveNext 和 MovePrevious。 (上述的部分方法不適用於順向資料指標。)
MoveFirst 會將目前記錄位置變更為 Recordset 中的第一筆記錄。 MoveLast 會將目前記錄位置變更為 Recordset 中的最後一筆記錄。 若要使用 MoveFirst 或 MoveLast,Recordset 物件必須支援書籤或逆向資料指標移動;否則,方法呼叫將產生錯誤。
MoveNext 會將目前記錄位置往前移動一個位置。 如果您在呼叫 MoveNext 時位於最後一筆記錄上,則 EOF 將設定為 True。 MovePrevious 會將目前記錄位置往後移動一個位置。 如果您在呼叫 MovePrevious 時位於第一筆記錄,則 BOF 將設定為 True。 當使用這些方法時,請務必檢查 EOF 和 BOF 屬性,如果您在 Recordset 任一端中移出,請務必將資料指標移回有效的目前記錄位置,如下所示:
. . .
oRs.MoveNext
If oRs.EOF Then oRs.MoveLast
. . .
或者,若為 MovePrevious 方法:
. . .
oRs.MovePrevious
If oRs.BOF Then oRs.MoveFirst
. . .
如果已篩選或排序 Recordset 並變更目前記錄的資料,則位置也可能會變更。 在這類情況下,MoveNext 方法可正常運作,但請注意,位置會從新的位置向前移動一筆記錄,而不是舊位置。 例如,變更目前記錄中的資料,使記錄移至排序的 Recordset 尾端,這表示呼叫 MoveNext 會導致 ADO 將目前記錄設定為 Recordset 中最後一筆記錄之後的位置 (EOF = True)。
在某些程度上,Recordset 物件的各種 Move 方法行為取決於 Recordset 內的資料。 新增至 Recordset 的新紀錄初始會以特定順序新增,該順序由資料來源所定義,而且可能會隱含或明去相依於新記錄中的資料。 例如,如果在填入 Recordset 的查詢內完成排序或聯結,新紀錄將會插入至 Recordset 內的適當位置。 如果在建立 Recordset 時未明確指定順序,資料來源實作中的變更可能會導致傳回的資料列順序不當變更。 此外,Recordset 的排序、篩選和編輯函式可能會影響順序,以及在資料錄集中可顯示的資料列。
因此,MoveNext、MovePrevious、MoveFirst、MoveLast 和 Move 皆會受相同 Recordset 上執行的其他作業影響。 ADO 將一律嘗試維護您目前的位置,直到您明確移動為止,但有時候,中間變更會讓您難以理解後續移動的結果。 例如,如果您呼叫 MoveFirst 以定位於已排序 Recordset 的第一個資料列且您將排序從遞增排序變更為遞減排序,則您仍會位於相同的資料列,但現在該資料列為 Recordset 中的最後一個資料列。 MoveFirst 會將您移至不同資料列 (新的第一個資料列)。
另一個範例是,如果您位於 Recordset 的中間特定資料列且您呼叫 Delete 和 MoveNext,則您現在會位於緊接已刪除記錄後面的記錄。 但呼叫 MovePrevious 會使您刪除記錄的前一筆記錄成為目前記錄,因為刪除的記錄不再計入 Recordset 的使用中成員資格。
儘管可變更目前記錄中的資料,針對相對於目前記錄的方法 (MovePrevious、MoveNext 和 Move),仍會難以定義所有提供者的一致移動語意。 例如,如果您要使用排序、篩選的 Recordset 且變更目前記錄中的記錄,使其位於所有其他記錄之前,但您變更的資料也不再符合篩選條件,無法確認 MoveNext 將您移至的位置。 最安全的結論是在編輯、新增或刪除記錄同時變更資料時,Recordset 內的相對移動較絕對移動的風險高 (例如使用 MoveFirst 或 MoveLast)。 排序和篩選應根據主索引鍵或識別碼,因為此類型的值不應變更。