Поделиться через


Дополнительные способы перемещения в наборе записей

Для перемещения или прокрутки в наборе записей используются следующие четыре метода: MoveFirst, MoveLast, MoveNext и MovePrevious. (Некоторые из этих методов недоступны на курсорах только вперед.)

MoveFirst изменяет текущую позицию записи на первую запись в наборе записей. MoveLast изменяет текущую позицию записи на последнюю запись в наборе записей. Чтобы использовать MoveFirst или MoveLast, объект Recordset должен поддерживать закладки или перемещение курсора назад; В противном случае вызов метода вызовет ошибку.

MoveNext перемещает текущую позицию записи на одно место вперед. Если вы используете последнюю запись при вызове MoveNext, EOF будет иметь значение True. MovePrevious перемещает текущую позицию записи на одно место назад. Если вы используете первую запись при вызове MovePrevious, boF будет иметь значение True. При использовании этих методов целесообразно проверка свойства EOF и BOF, а также переместить курсор обратно в допустимое текущее положение записи, если вы отойдете с любого из концов набора записей, как показано ниже:

. . .  
oRs.MoveNext  
If oRs.EOF Then oRs.MoveLast  
. . .   

Или в случае метода MovePrevious :

. . .   
oRs.MovePrevious  
If oRs.BOF Then oRs.MoveFirst  
. . .  

В случаях, когда набор записей был отфильтрован или отсортирован, а данные текущей записи изменены, позиция также может измениться. В таких случаях метод MoveNext работает нормально, но имейте в виду, что позиция перемещается на одну запись вперед из новой позиции, а не из старой позиции. Например, изменение данных в текущей записи таким образом, чтобы запись была перемещена в конец отсортированного набора записей, будет означать, что вызов MoveNext приведет к установке ADO текущей записи в положение после последней записи в наборе записей (EOF = True).

Поведение различных методов Move объекта Recordset в некоторой степени зависит от данных в наборе Recordset. Новые записи, добавленные в набор записей , изначально добавляются в определенном порядке, который определяется источником данных и может быть неявно или явно зависимы от данных в новой записи. Например, если сортировка или соединение выполняется в запросе, который заполняет набор записей, новая запись будет вставлена в соответствующее место в наборе записей. Если порядок не указан явным образом при создании набора записей, изменения в реализации источника данных могут привести к случайному изменению порядка возвращаемых строк. Кроме того, функции сортировки, фильтрации и редактирования набора записей могут влиять на порядок и, возможно, на то, какие строки в наборе записей будут видны.

Таким образом, MoveNext, MovePrevious, MoveFirst, MoveLast и Move чувствительны к другим операциям, выполняемым в одном наборе записей. ADO всегда будет пытаться сохранить текущую позицию, пока вы явно не переместите ее, но иногда промежуточные изменения затрудняют понимание последствий последующего перемещения. Например, если вызвать Метод MoveFirst для позиции в первой строке отсортированного набора записей и изменить порядок сортировки с возрастания на порядок убывания, вы по-прежнему находитесь в той же строке, но теперь это последняя строка в наборе записей. MoveFirst приведет вас к другой строке (новой первой строке).

Еще один пример: если вы находитесь в определенной строке в середине набора записей , а затем вызываете метод Delete , а затем вызываете MoveNext, вы перейдете к записи сразу после удаленной записи. Но при вызове MovePrevious запись выполняется перед текущей записью, так как удаленная запись больше не учитывается в активном членстве в наборе записей.

Особенно сложно определить согласованную семантику перемещения во всех поставщиках для методов, которые перемещаются относительно текущей записи ( MovePrevious, MoveNext и Move ), в условиях изменения данных в текущей записи. Например, если вы работаете с отсортированный, отфильтрованный набор записей и изменяете данные в текущей записи так, чтобы они предшествовали всем остальным записям, но измененные данные больше не соответствуют фильтру, неясно, куда должна выполняться операция MoveNext . Самый безопасный вывод заключается в том, что относительное перемещение в наборе Записей является более рискованным, чем абсолютное перемещение (например, с помощью MoveFirst или MoveLast), когда данные изменяются во время редактирования, добавления или удаления записей. Сортировка и фильтрация должны основываться на первичном ключе или идентификаторе, так как этот тип значения не должен изменяться.