Пока удалось выяснить, что MoveNext() не корректно интерпретирует "точку отсчета". Предположительно, он начинает отсчет с последней записи.
Однако если заменить MoveNext() на просто Move() с явным указанием отсчитывать строки от начала курсора, то все проходит корректно. Т.е. код получается примерно такой
X++:
#define.adBookmarkCurrent(0) // от текущей записи (вот это умолчание не работает)
#define.adBookmarkFirst(1) // от первой записи
#define.adBookmarkLast(2) // от последней записи
ccADORecordSet = ccADOCommand.execute();
while (!ccADORecordSet.EOF())
{
info(any2str(ccADORecordSet.fields().itemIdx(0).value()));
i++;
ccADORecordSet.move(i, #adBookmarkFirst);
}
Ну, счетчик записей можно включить непосредственно в класс, так что, можно считать, проблема решена.
Правда, не понимаю причину данной проблемы. Ощущение такое, что вместо MoveNext() выполняется Move(1, 2). Ну, или "текущая" запись интерпретируется как "последняя" запись.
PS: Кстати, замечу, что при выполнении на стороне клиента ситуация получается обратная. Приведенный код приводит к тому, что цикл выполняется только один раз. Т.е. на стороне клиента надо снова использовать MoveNext().
Цитата:
Сообщение от
raz
У нас все работает. Сделаны серверные копии классов CCADOCommand, CCADOConnection, CCADOField, CCADOFields, CCADORecordSet. Во всех методах, где есть взаимодествие с COM добавлен new InteropPermission(InteropKind::ComInterop).assert(). Все статические методы сделаны серверными.
А как у Вас реализован метод RecordSet.MoveNext() в переписанных классах? В оригинальных классах ведь его нет.