Создание курсоров через ADO | |
---|---|
nikepopov Автор Сообщений: 10 Дата регистрации: 14.03.2018 |
Строка подключения:
Driver={Microsoft Visual FoxPro Driver};UID=;PWD=;SourceDB=D:\Base;SourceType=DBC;Exclusive=NO;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=No; Данные драйвера: Provider = MSDASQL.1 Version = 10.0 Задача: Перетаскиваю данные одной известной системы на FoxPro на другую известную систему. Для фильтра требуется таблицу передать на сторону FoxPro (в курсор). Для этого выполняю последовательно следующие запросы к FoxPro (1 команда - 1 запрос): CREATE CURSOR Table1 (ID C(4)); INSERT INTO Table1 (ID) VALUES("0000") -- тут вываливается ошибка INSERT INTO Table1 (ID) VALUES("0001") INSERT INTO Table1 (ID) VALUES("0002") INSERT INTO Table1 (ID) VALUES("0003") Ошибка: [Microsoft][ODBC Visual FoxPro Driver]File 'table1.dbf' does not exist. Думал, что я неправильно что-то делаю с INSERT. Попробовал выполнить команды: CREATE CURSOR Table1 (ID C(4)); SELECT Table1.ID FROM Table1 AS Table1 -- тут вываливается ошибка Ошибка (она же): [Microsoft][ODBC Visual FoxPro Driver]File 'table1.dbf' does not exist. Пытался использовать "USE", "FREE TABLE", "READWRITE" (все что нарывал на форумах не разбираясь). Ничего не помогает. Я знаю про обход с "CREATE TABLE" вместо "CREATE CURSOR", но с ним тоже не всё гладко и хотелось бы использовать курсоры. При том, работает набор запросов: SELECT abc.ID INTO CURSOR cursor1 FROM abc AS abc SELECT cursor1.ID FROM cursor1 AS cursor1 То есть в целом, возможность работы с курсорами поддерживается. Запрос на создание курсора проходит. Есть ощущение, что курсор создаётся "не в нужной области" или что-то подобное. Подскажите, пожалуйста, бедолаге куда копать.. |
Re: Создание курсоров через ADO | |
---|---|
PaulWist Сообщений: 14625 Дата регистрации: 01.04.2004 |
Для начала попробовать использовать VFPOleProvider.
------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Создание курсоров через ADO | |
---|---|
nikepopov Автор Сообщений: 10 Дата регистрации: 14.03.2018 |
Попробовал через VFPOleProvider. Такая же история.
|
Re: Создание курсоров через ADO | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
Что здесь делает знак "точка с запятой"? ------------------ Лень - это неосознанная мудрость. |
Re: Создание курсоров через ADO | |
---|---|
nikepopov Автор Сообщений: 10 Дата регистрации: 14.03.2018 |
Её нет в выполняемых командах. Формирую одну строку выполняемых команд, потом разделяю команды с разделителем ";". Это нужно для визуального просмотра выполняемых запросов (чтобы не в цикле 20 строк смотреть, а видеть все запросы целиком). Забыл когда выкладывал удалить символы.
|
Re: Создание курсоров через ADO | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Какие курсоры могут быть в рамках ODBC соединения? Делай постоянную таблицу (можно временную - т.е. потом удалять её).
VFP ODBC застрял на 6-й версии. Лучше OLEDB провайдер напрямую использовать. Хотя и там никаких CREATE CURSOR не следует применять - только TABLE. ------------------ WBR, Igor |
Re: Создание курсоров через ADO | |
---|---|
nikepopov Автор Сообщений: 10 Дата регистрации: 14.03.2018 |
Я сейчас так и делаю. Просто решение "некрасивое" (по сравнению с курсорами).
Странно, что работают такого характера команды: SELECT abc.ID AS ID INTO CURSOR cursor1 FROM abc as abc SELECT cursor1.ID AS ID FROM cursor1 as cursor1 То есть в целом, курсоры доступны. Такая последовательность команд даёт правильный результат. Я естественно пишу упрощённо. В реальной работе у меня используется в JOIN-е по 4-5 курсоров. Так удобно. При этом следующая команда не вылетает с ошибкой: CREATE CURSOR cursor1 (ID C(4)). То есть FoxPro эти курсоры даже создаёт. |
Re: Создание курсоров через ADO | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Он то их может и создаёт, вопрос в какой "области видимости" - т.е. когда одно ODBC обращение-вызов перестаёт видеть другое.
Если использовать хранимые процедуры (в т.ч. триггера), тогда внутри такой ХП использование курсора будет вполне нормальным вариантом. Но никто не обещает что между разными вызовами фокс будет сохранять всё состояние - открытые курсоры, созданные глобальные переменные и т.п. Тем более если нет прямого контроля над последовательностью вызовов функций ODBC АПИ, а используется та или иная "прослойка", в т.ч. MSDASQL ------------------ WBR, Igor |
Re: Создание курсоров через ADO | |
---|---|
nikepopov Автор Сообщений: 10 Дата регистрации: 14.03.2018 |
Я использую один объект "ADODB.Connection", который остаётся "живым" на протяжении всей работы программы. Но для каждой команды использую свой ADODB.Command.
При том, опять же, курсоры, полученные методом "SELECT ... INTO CURSOR" видимы в других запросах, а созданные "CREATE CURSOR" - нет... |
Re: Создание курсоров через ADO | |
---|---|
PaulWist Сообщений: 14625 Дата регистрации: 01.04.2004 |
Попробуйте создавать курсоры на основе любой таблицы через select, например
в принципе почти определение курсора. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Создание курсоров через ADO | |
---|---|
nikepopov Автор Сообщений: 10 Дата регистрации: 14.03.2018 |
Я тоже уже к этому пришёл Но по ощущениям "пошловато" это как-то
|
Re: Создание курсоров через ADO | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Начнём с того что ты НЕ работаешь с VFPOLEDB, а ходишь через конвертер к ODBC драйверу - что и как он делает - одним авторам известно.
Ну и самое простой - чего ты хочешь то в итоге Ну не работает оно в таком виде - продукт не поддерживается уже много лет как - ODBC драйвер наверное все 20 лет (он 6-й версии остался), провайдер - чуть меньше, но тоже прилично. Никто ничего исправлять не будет - тем более что они (и ODBC и OLEDB) формально никаких CREATE CURSOR поддерживать и не обязаны (хотя по факту внутри ХП работают без проблем, насколько я знаю - ну да там "область жизни" совершенно чётко будет одна и та же - в коде создающем и тут же использующем этот самый курсор). msdn.microsoft.com docs.microsoft.com Где там есть хоть слово про CREATE CURSOR ------------------ WBR, Igor |
Re: Создание курсоров через ADO | |
---|---|
nikepopov Автор Сообщений: 10 Дата регистрации: 14.03.2018 |
Я в общем то и не спорю, что у меня запросы неадекватные Просто когда за что-то берусь, всегда хочу сделать максимально технологично. Если сам не могу - курю документацию, FAQи и форумы. Ну, если не получается - значит "не шмогла я, не шмогла"
Эти ссылки я уже заучил как отче наш. Всем спасибо за советы! Остановлюсь, наверное на этом:
|
Re: Создание курсоров через ADO | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Если ты хочешь сделать по уму - не используй никаких "хитрых приёмов", и тем паче г*нокода, к которому очень приближается такой вот select. Кстати, он будет ReadOnly (и на кой хрен он тебе нужен в таком виде) а сработает ли опция READWRITE, я не знаю
Если есть сам фокс - можешь сделать на нём COM-сервер с нужным функционалом и использовать из 1с (но могут быть проблемы с 64-битностью, и с необходимостью устанавливать или хотя-бы размещать рядом с dll фоксовый рантайм, да и сам com-сервер нужно регистрировать). Как разновидность первого варианта - сделать не просто COM сервер, а обернуть его в web-service и установить на какой-нить специально выделенной машине - поближе к фоксовой БД и помягче с требованиями к ПО (лучше всего на XP или старинном Windows Server - вполне можно "виртуальном"). Насколько я понимаю с использованием веб-сервисов в 1с нет особых проблем. Из плюсов - сам 1с (особенно если это серверная установка) останется "чистым" - никаких фоксовых компонент на машине не нужно будет держать. Если хочешь остаться в рамках VFPOLEDB провайдера - можешь просто написать несколько хранимок в dbc (при том даже не обязательно чтобы сами живые данные были в таблицах этого самого dbc контейнера) - в 9-й версии в принципе можно обойтись через XMLTOCURSOR() для приёма "списка" и SETRESULTSET() для возврата собственно конечного результата - внутри кода ХП как раз не проблема будет использовать курсор. Минусы схожие - провайдер только 32-битный, его нужно "устанавливать" там где он будет использоваться (т.е. на том же 1с сервере). Есть и ещё гораздо более плохие варианты - написать просто exe на фоксе - принимающий к примеру файлы и выдающий данные в файлы же (XML как наиболее универсальный, но и старорежимный dbf подойдёт - его 1c напрямую сможет прочесть и даже записать XBase классом или как там его). Т.е. сложную/тяжелую логику можно таким вот образом сделать, а в 1с чисто формирователи файлов-параметров и читатели файлов-результатов делать. Или exe который САМ лезет к 1с через тот же коннектор и что надо берёт, что надо выкладывает обратно. Это если можно "инициатором процесса" держать не 1с, а другую сторону. Тут, конечно, потребуется более фундаментальный знаток фокса - чтобы это реализовать (как и для первых вариантов). Только ХП можно рисовать сравнительно слабо понимая фокс (тем более там и сам язык сильно ограничен - скажем объектов/классов нет вообще). ------------------ WBR, Igor |
Re: Создание курсоров через ADO | |
---|---|
Foxtrot Сообщений: 3408 Откуда: Куда: Дата регистрации: 25.04.2003 |
если речь про 1с, то на кой вся эта лабуда когда оно может работать с дбф напрямую/из коробки
------------------ Мойте ноги, моя ноги вы моете и руки |
Re: Создание курсоров через ADO | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Ну щас это не модно
Нужно запилить минимум свою отдельную фабрику классов Потом на фабрике построить кучу станков для производства станков. И на энной итерации тех станков запилить ружье, из которого стрелять тоже нельзя. Так как нужны библиотеки шаблонов для реализации физических условий, при которых ружье вообще может стрелять И когда вы покажете макет ружья главному командиру, он вам радостно сообщит, что оборудование устарело, скоро нам завезут новые фабрики фабрик фабрик - и вот тогда то мы начнем разрабатывать спецификации по утверждению планов выпуска чертежей нового ружья. |
Re: Создание курсоров через ADO | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
- Смотря какие DBF, не все он прожуёт. Про "гениальность" системы требующей русские региональные настройки - да да, не системную локаль, не поддержку 1251, а именно чтобы в качестве форматов дат/чисел стояла "Россия", иначе никакой тебе кириллицы - это я вообще молчу. Тут даже индусы отдыхают - Смотря какой объём данных. Заливать через XBase миллионы записей для того чтобы в итоге выбрать всего пяток, и так в интерактиве - скажем на ввод чего-либо в какой-либо документ - так себе вариант... Т.е. можно, но с массой ограничений и нюансов - и не факт что это будет приемлемо. ------------------ WBR, Igor |
Re: Создание курсоров через ADO | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Эк бомбануло то Оно то да... Но и "кондовый код" на 100500 страниц единой простынёй без всякого понимания ООП - с кучей глобальных сущностей, связью "всего со всем" и прочими прелестями, которые так любят ненавистники паттернов и ОО подхода... Вызывает желание взять таки настоящее ружьё, и отыскать автора ------------------ WBR, Igor |
Re: Создание курсоров через ADO | |
---|---|
Foxtrot Сообщений: 3408 Откуда: Куда: Дата регистрации: 25.04.2003 |
если оно так, то такую задачу так точно не стоит решать
приемлемо или нет это уже ТС скажет, потому как мульонов записей (слава фантазии ИК!) нам не привели ------------------ Мойте ноги, моя ноги вы моете и руки |
Re: Создание курсоров через ADO | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Цитата:По моему мнению означает что объём данных таков, что забрать всё и отфильтровать "своими силами" становится накладно... ------------------ WBR, Igor |
© 2000-2024 Fox Club  |