|
Работа курсоров через драйвер VFP OLEDB | ☑ | ||
---|---|---|---|---|
0
NikePopov
28.12.17
✎
10:14
|
Добрый день!
Строка подключения: driver={Microsoft Visual FoxPro Driver};Exclusive=No;NULL=NO;Collate=Machine;SourceType=DBF;SourceDB="..."; Последовательно выполняю 3 запроса: 1. SELECT TOP 1 Config.value INTO CURSOR ConstOrg FROM Config WHERE Config.name = "OwnerAgent" ORDER BY Config.user_rn 2. SELECT org.orbase_rn, org.name, org.fullname INTO CURSOR OurOrg FROM org WHERE org.orbase_rn IN (SELECT ConstOrg.value FROM ConstOrg) 3. SELECT orgbase.rn, orgbase.rmnemo_org, orgbase.showname, orgbase.inn, orgbase.okato, orgbase.ogrn INTO CURSOR OurOrgbase FROM orgbase WHERE orgbase.rn IN (SELECT ConstOrg.value FROM ConstOrg) При выполнение третьего(!!!) запроса происходит ошибка: Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC Visual FoxPro Driver]File 'constorg.dbf' does not exist. Странность собственно заключается в том, что второй запрос выполняется без проблем. То есть удалось считать курсор "constorg". В добавок попробовал в третьем запросе заменить курсор "constorg" на "OurOrg". Но он тоже оказался недоступен. Есть ощущение, что драйвер после второго запроса удаляет все курсоры и не создаёт новые. Никто не сталкивался с такой проблемой? |
|||
1
kiruha
28.12.17
✎
10:25
|
Попробуй через ExecScript
http://www.1cpp.ru/forum/YaBB.pl?num=1188673318 |
|||
2
NikePopov
28.12.17
✎
10:53
|
Вопрос решен. Дело в том, что я при выполнении запроса получаю переменную (RecordSet), так как меня не интересует результат создания курсора я её благополучно переприсваиваю при выполнении следующего запроса. При удалении/переприсвоении переменной типа ComObject происходит вызов деструктора Com-Объекта. FoxPro при вызове деструктора очищает память, выделенную на данный RecordSet. А именно в этом куске памяти на самом деле и хранится курсор.
Решение вопроса: Вместо: Для каждого ТекстЗапроса Из ТекстыЗапроса Цикл РезультатЗапроса = Подключение.Execute(ТекстЗапроса); КонецЦикла; // Обработка выполнения последнего запроса Написать: МассивCOMОбъектов = Новый Массив; Для каждого ТекстЗапроса Из ТекстыЗапроса Цикл РезультатЗапроса = Подключение.Execute(ТекстЗапроса); МассивCOMОбъектов.Добавить(РезультатЗапроса ); КонецЦикла; МассивCOMОбъектов = Неопределено; // Обработка выполнения последнего запроса |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |