Проблема с подключением Embedded через ODBC

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Urslan
Сообщения: 16
Зарегистрирован: 11 июл 2006, 15:25

Проблема с подключением Embedded через ODBC

Сообщение Urslan » 18 янв 2007, 17:08

У меня есть проект на MS Access (база 1 Гиг) и соответственно стал вопрос о переносе на сервер.
Переписать интерфейс не реально по срокам (>100 тыс. строк кода в интерфейсной части) и было принято логику оставить в Access, базу загнать в FB.
Продукт ставится как на сервер и несколько клиентов, так и на отдельные ПК.
Предвидя проблему столкнуться с ПО юзающим другие релизы IB/FB попытался использовать Embedded и вышла лажа: ODBC не хочет коннектиться к базе.

Использую Firebird-2.0.0.12748-0-Win32_pdb и Firebird-2.0.0.12748-0_embed_win32 и Firebird_ODBC_2.0.0-Win32.
fbembed.dll переименован в gds32.dll
Настройки ODBC:
Имя: smetaxxi
Драйвер: Firebird/Interbase(r) driver MT
Клиент: D:\IT\fb smeta xxi.xp\local\gds32.dll (полный путь)
остальные поля либо пустые, либо по умолчанию
Строка соединения: Set db = OpenDatabase("smetaxxi", dbDriverNoPrompt, False, "ODBC;DATABASE=d:\smetaxxi.mdb;UID=sysdba;PWD=masterkey;DSN=smetaxxi")

Не хочет работать в Embedded и все :(. Запускаю сервер - та же ошибка (?хотя все говорят, что можно работать в режиме клиента?).
Меняю в настройках ODBC путь к gds32 от сервера и все запускается.

Проект на Builder 6 с Embedded отрабатывает великолепно.
Помогите кто чем может.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Проблема с подключением Embedded через ODBC

Сообщение hvlad » 18 янв 2007, 17:25

Urslan писал(а): Не хочет работать в Embedded и все :(. Запускаю сервер - та же ошибка (?хотя все говорят, что можно работать в режиме клиента?).
Какая ошибка-то ?

Urslan
Сообщения: 16
Зарегистрирован: 11 июл 2006, 15:25

Сообщение Urslan » 18 янв 2007, 19:12

3151 ODBC - ошибка подключения к <имя>
То есть не нравится ему БД.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 19 янв 2007, 08:23

DATABASE=d:\smetaxxi.mdb
Уж не пытаешься ли ты заставить птичку читать акцессовскую базу??? :shock:

Брось, с акцесса лучше мигрировать на MS SQL. Там даже специальный визард есть на эту задачу.

Urslan
Сообщения: 16
Зарегистрирован: 11 июл 2006, 15:25

Сообщение Urslan » 19 янв 2007, 14:59

Dimitry Sibiryakov писал(а):Брось, с акцесса лучше мигрировать на MS SQL. Там даже специальный визард есть на эту задачу.
Визард-то есть, но у меня проект на DAO и читает только файлы *.MDB, а в проекте [/quote](>100 тыс. строк кода в интерфейсной части)[/quote]
Dimitry Sibiryakov писал(а):Уж не пытаешься ли ты заставить птичку читать акцессовскую базу???
Птичка - отличается умом и сообразительностью. База то под вторую причку, а расширение только чтобы DAO не ругался. Gemini ODBC и FB расширение файла до одного (sorry) места.

Лучше скажите можно ли вообще подконектиться к Embedded через ODBC? Ведь есть ограничение на расположение файлов сервера.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Проблема с подключением Embedded через ODBC

Сообщение hvlad » 19 янв 2007, 17:02

Urslan писал(а): Клиент: D:\IT\fb smeta xxi.xp\local\gds32.dll (полный путь)
Путь без пробелов не пробовал ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 янв 2007, 20:38

расширение только чтобы DAO не
так DAO тоже какие-то там файлы по барабану, если он через ODBC работает. А если в ODBC создать System DSN, работает или нет?

Urslan
Сообщения: 16
Зарегистрирован: 11 июл 2006, 15:25

Сообщение Urslan » 19 янв 2007, 22:48

kdv писал(а):А если в ODBC создать System DSN
ODBC работает как с сервером Classic так и Embedded.
Urslan писал(а):Set db = OpenDatabase("smetaxxi", dbDriverNoPrompt, False, "ODBC;DATABASE=D:\IT\fb smeta xxi.xp\local\smetaxxi.mdb;UID=sysdba;PWD=masterkey;DSN=smetaxxi")
В случае Classic работает и с пробелами. A вот расширения кроме *.MDB DAO воспринимать не хочет (библиотеку то писали именно для Access'a).

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 20 янв 2007, 01:01

*.MDB DAO воспринимать не хочет
сильно я сомневаюсь, что DAO нужен файл в случае работы через ODBC. Если DAO лезет к файлу помимо, то отсюда и ошибка.

то есть - коннект через ODBC есть. А из DAO к ODBC - нет. Кто виноват? Логика очень простая.

Urslan
Сообщения: 16
Зарегистрирован: 11 июл 2006, 15:25

Сообщение Urslan » 21 янв 2007, 14:49

kdv писал(а):Кто виноват?
Повторяю основной вопрос:
Почему работает Classic, но не Embedded?

Urslan
Сообщения: 16
Зарегистрирован: 11 июл 2006, 15:25

Сообщение Urslan » 27 янв 2007, 10:33

Ау!
Есть какой-то ответ на вопрос?

Во всех источниках указано, что Embedded ничем не отличается от Classic и может работать как клиент Classic, но у меня не проходит ни первый ни второй вариант.

Если какой-то момент я не учел, плз, укажите where is dog? :(

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 27 янв 2007, 19:32

Сначала научись на вопросы отвечать, хотя бы читать их

Urslan
Сообщения: 16
Зарегистрирован: 11 июл 2006, 15:25

Сообщение Urslan » 27 фев 2007, 16:02

Sorry, если что-то не понял или не так объяснил.

Попытаюсь сформулировать вопрос как можно проще:
Почему я не могу из MS Access подключиться через Gemini ODBC к базе FB2 при помощи fbembed.dll.
Аналогичный коннект с Classic Server успешно работает.

Если это где-то указывали, плз, ткните мордочкой.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 27 фев 2007, 18:03

объясняю. embedded - это dll, которая грузится тем, кто ее вызвал.
Поскольку это не коннект из компонент прямого доступа, то это не access, а dll ODBC-драйвера. Следовательно, dll ODBC-драйвера банально не может найти gds32.dll, которая нужна драйверу.
запустите filemon, посмотрите всю цепочку, кого там дергает access.
А вообще такой метод доступа (через "третьи руки") весьма сомнителен.

и приплетать тут классик (да хоть и супер), коннект к которому идет или по tcp или через локальный протокол, совершенно не надо.

кстати, я не знаю тонкостей, но думаю что gemini odbc понятия не имеет про fbembed.dll. и ищет просто gds32.dll.

Urslan
Сообщения: 16
Зарегистрирован: 11 июл 2006, 15:25

Сообщение Urslan » 23 мар 2007, 17:13

Спасибо всем за участие.
Проект уже приконнектил.

Правда обнаружился новый глюк.
Когда работаю с библиотекой АДО, то не отрабатывает метод Update у переменной типа ADODB.Recordset.

Run-time error '-2147467259 (80004005)'
Dynamic SQL Error.
SQL Error Code = -104.
Unexpected end of command - line 1, column 34.


Прочитал у Gemini, что есть более новый релиз драйверов с исправленным багом ADO Update. Скачал, не помогло.
Проверил с DAO тот же рекордсет - все работает.

Есть ли существенная разница между драйверами ODBC и OLE DB.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 мар 2007, 00:00

дык хрен знает, что у тебя драйвер на сервер посылает. включи ему trace, и посмотри, какой именно запрос к ошибке приводит.
Вообще вся эта левизна с "обновлением" рекордсетов и т.п. давно уже плешь проела еще в BDE - www.ibase.ru/devinfo/bde.htm (см. про "живые" запросы). Так что предлагаю не маяться ..., и формировать запросы вручную. Автоматизация редко доводит до добра. Особенно, когда понятия не имеешь, как именно эта автоматизация происходит.

Urslan
Сообщения: 16
Зарегистрирован: 11 июл 2006, 15:25

Сообщение Urslan » 26 мар 2007, 15:09

Спасибо всем!
Для меня все стало ясно теперь.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 мар 2007, 17:46

тогда поделись. а то нам неясно, что ж там у тебя было.

Urslan
Сообщения: 16
Зарегистрирован: 11 июл 2006, 15:25

Сообщение Urslan » 18 апр 2007, 11:18

В администраторе ODBC нужно просто зарегистрировать запись с необходимым именем, остальные параметры можно не указывать.
А вот строку коннекта прописать более полную:

Set db = OpenDatabase("smetaxxi", dbDriverNoPrompt, False, "ODBC; DATABASE=D:\IT\fb smeta xxi.xp\local\smetaxxi.mdb; UID=sysdba; PWD=masterkey; Client=D:\IT\fb smeta xxi.xp\local\gds32.dll; DSN=smetaxxi")

Выделенные параметры ОБЯЗАТЕЛЬНЫ для встроенного сервера.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 18 апр 2007, 11:55

Urslan писал(а):В администраторе ODBC нужно просто зарегистрировать запись с необходимым именем, остальные параметры можно не указывать
Осталось ещё почитать про dsnless соединения, и ничего нигде не регистрировать :wink:

Ответить