C# OleDbConnection проблемы с использованием LCPI.IBProvider.1

Answered C# OleDbConnection проблемы с использованием LCPI.IBProvider.1

  • 26 июля 2012 г. 16:31
     
     

    Суть проблемы:

    Использую OleDbConnection для подключения к базам в формате FireBird. Используется вот такая вот строка подключения:

    Provider=LCPI.IBProvider.1; Password=masterkey; Persist Security Info=True; User ID=SYSDBA; Data Source=Serv:D:\Base\databaseinfo.fdb; ExtendedProperties=; garbage_collect=True; dialect=3; auto_commit=True; auto_commit_level=65536; bicursor=False; free_threading=False; array_vt_type=True

    После открытия коннекта, получаю вот такое вот сообщение: Поставщик "LCPI.IBProvider.1" не зарегистрирован на локальном компьютере."

    Описание проблемы, симптомы:

    На win7 32-х разрядной машине работает без каких либо проблем, перехожу на win7 64-х разрядку - начинаются вышеописанные проблемы. На обоих машинках Provider.dll регистрируется. RegSvr32.exe говорит, что регистрация проходит без каких либо проблем.

    Однако стоит заметить, что на 32-х разрядной системе поставщик данных прекрасно наблюдается в "Свойствах канала передачи данных" (*.UDL), а вот под 64-х его там нетути. Т.е. казалось бы проблема в том, что под 64-х разрядной системе он как бы не регистрируется... Но и тут вкралась фича. Работая с той же самой строкой подключения, но через код BDS2006 и используя TADODBConnection, никаких проблем с подключения нет, к базе подключаюсь без каких либо видимых проблем.

    Получается возникает вопрос, чем TADODBConnection из DBS2006 такой уникальный, что видит то, что не видит OleDbConnection из C# 2008.

    ЗЫЖ если провайдер разрегистрировать на win7 x64 посредством regsvr32 -u provider.dll, то чуда не свершится, и BDS 2006 заругается таким же матом, как и великий шарп. Так что могу быть в полной уверенности, что провайдер используется и TADODBConnection.

    Заранее благодарю за Ваши ответы.


    • Изменено Pincher1519 26 июля 2012 г. 16:32
    •  

Все ответы

  • 26 июля 2012 г. 17:15
     
     

    Привет

    1. Вам нужно почитать про 64 битную Windows и 64 битные приложения.

    2. Скачайте и установите триальный провайдер. Там есть и 32-битный и 64-битный провайдер.

    3. Откуда вы откопали "LCPI.IBProvider.1"? Используйте в строке подключения "LCPI.IBProvider.3" - это идентификатор текущей актуальной версии.

    4. Кстати для dbGo лучше использовать Lite-версию - "LCPI.IBProvider.3.Lite"

  • 26 июля 2012 г. 17:43
     
     

    Привет

    1. Вам нужно почитать про 64 битную Windows и 64 битные приложения.

    2. Скачайте и установите триальный провайдер. Там есть и 32-битный и 64-битный провайдер.

    3. Откуда вы откопали "LCPI.IBProvider.1"? Используйте в строке подключения "LCPI.IBProvider.3" - это идентификатор текущей актуальной версии.

    4. Кстати для dbGo лучше использовать Lite-версию - "LCPI.IBProvider.3.Lite"

    1. Ну пока с приложениями написанными в c# у меня не было проблем. Все они прекрасно одинаково работали под x64 и x32. Тут скорее всего кроется проблема именно в провайдере.

    2. С этим все понятно, но проблема в том, что он триальный.

    3. Да не особо и копал. Как-то попался в дистрибутивах, так и использовал его... Не помню откуда он у меня появился.

    4. Лайт версия, как я понял, идет в пакете Pro версии. Что-то никак не могу на сайте найти отдельный линк на скачку Lite версии... =( Если знаете линк, киньте. Заранее благодарен.

    Вопрос остается до сих пор открытым. Почему БДС умудряется работать с провайдером, который по сути не видим в системе через UDL, а Шарп - сопротивляется...
    • Изменено Pincher1519 26 июля 2012 г. 17:45
    •  
  • 26 июля 2012 г. 18:18
     
     Отвечено
    Потому что БСД скорее всего 32-х битный процесс. А код на шарпе вы собрали как AnyCPU, и он не видит 32-х битного провайдера (точно так же, как не видит его 64-битный редактор UDF). Соберите код на C# с явным указанием платформы x86.
    • Помечено в качестве ответа Pincher1519 27 июля 2012 г. 7:58
    •  
  • 27 июля 2012 г. 4:49
     
     

    Привет.

    Деинсталируйте провайдер с вашего компьютера.

    Убедитесь что в диалогах "Data Link" (это редактор UDL-файлов) отсутствует упоминание о IBProvider-е

    До кучи (раз здесь форум программистов) стоит убедиться, что в реестре нет упоминания об "IBProvider" (используя 64-битный regedit.exe)

    Скачайте с сайта www.ibprovider.com текущий триал и установите все компоненты. Там будут 32/64-битные провайдеры, включая полную и Lite-версии. Инсталлятор триала, в общем, ясно об этом сообщает. Когда инсталлятор не может зарегистрировать 64битные модули, то он сообщает об этом.

    В "Data Link" диалоге появятся две записи об IBProvider-е - полная и Lite версии.

    ----

    Провайдер взаимодействует с серверами через их клиентов (gds32.dll/fbclient.dll/ibclient64.dll). Для 32-битных приложений нужны 32-битные клиенты, а для 64-битных - 64-битные. Лично я (на 64-битной Windows) копирую 32-битные в SysWOW64, а 64-битные - в System32. На 32-битной Windows я копирую 32-битных клиентов в System32

    По умолчанию провайдер использует gds32.dll. В строке подключения можно указать имя (или вообще полный путь) к любой другой клиентской библиотеке. Например так - "dbclient_library=fbclient.dll"

    Обратите внимание, что fbclient.dll (это клиент к FB) использует CRT от VS2005 (по-моему, без каких либо сервис паков - это важное замечание). Естественно, для 32-битного fbclient.dll нужен 32-битный CRT, а для 64-битного клиента - 64 битный CRT. Скачайте и установите редистры этого CRT на вашу 64-битную систему. И 32-битный CRT и 64-битный CRT. На нашем сайте есть коллекция всех редистров.

    ---

    Ваша программа на C#, скорее всего откомпилирована для "Any CPU". В результате на 64-битной Windows она будет исполняться в 64-битном процессе и ей потребуются 64-битные провайдер и клиентские библиотеки для Firebird.

    Если все равно ничего не будет получаться, то откомпилируйте ваше .NET приложение для 32-битной платформы.

  • 27 июля 2012 г. 8:01
     
     

    Если все равно ничего не будет получаться, то откомпилируйте ваше .NET приложение для 32-битной платформы.

    Благодарю за столь развернутый ответ. Помогло просто перестроить решение под x86 платформу.

    Для меня стало, конечно, открытием, что x64 не показывает провайдеры компилированные под платформу x86. Ну да ладно, век живи - век учись.