在记录集中移动的更多方法

可以使用以下四种方法在 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)所面临的风险大。 应当基于主键或 ID 进行排序和筛选,因为这种类型的值不会改变。