Показать сообщение отдельно
Старый 01.11.2011, 17:40   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Пока удалось выяснить, что 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() в переписанных классах? В оригинальных классах ведь его нет.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 01.11.2011 в 17:51.