Имя: Пароль:
1C
1С v8
Работа курсоров через драйвер 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Объектов = Неопределено;
// Обработка выполнения последнего запроса
2 + 2 = 3.9999999999999999999999999999999...