Недавно мне пришлось писать программу на C# для конвертации данных из базы Paradox в другую, более современную. Как я выяснил, есть разные способы подключения к базе данных из C#, например, через Microsoft Jet OLE DB, или через Microsoft Paradox Driver, я выбрал второй способ. Строку подключения можно посмотреть на connectionstrings.com После удачного подключения через Microsoft Paradox Driver я пытался получить данные, но столкнулся с ошибкой "Непредвиденная ошибка драйвера внешней базы данных (11265)".
При поиске решения проблемы я выяснил несколько важных вещей касательно Paradox в Windows 7 64 bit:
- Для 64 разрядной системы нет драйверов для базы Paradox. В этом можно убедиться, зайдя в Панель управления - Администрирование - Источники данных (ODBC) и не увидев там драйверов для Paradox-а. Однако, если зайти в Источники данных (ODBC) через c:\Windows\SysWOW64\odbcad32.exe - то мы сразу увидим там кучу дополнительных драйверов, включая Microsoft Paradox Driver.
Таким образом, я пришел к 1-му выводу: приложение должно работать в режиме 32 битного приложения чтобы оно увидело драйвера для Paradox-а. Для этого приложение нужно компилировать с флагом 32BIT, либо установить этот флаг на exe файл, например, с помощью .Net Tools. - Нужно быть внимательным при написании строки подключения Microsoft Paradox Driver. В ней обязательно должен обязательно присутствовать пробел после *.db. Без этого пробела программа не сможет найти драйвер.
- После подключения к базе через Microsoft Paradox Driver я попытался выполнить запрос к базе и получил ошибку "Непредвиденная ошибка драйвера внешней базы данных (11265)". После долгих поисков в интернете я выяснил, что это происходит из-за того, что приложение не может создать в корне диска C: файл PDOXUSRS.NET. Напрашивался вывод, что приложение нужно запускать с администраторскими правами, чтобы она смогла писать в корень системного диска. Однако, как выяснилось, это не обязательно. Можно просто в BDE Administrator указать в Configuration\Drivers\Native\Paradox NET DIR другую папку для сохранения файла.
- Так же, необходимо, чтобы у пользователя были права на файл c:\Windows\System32\odbc32.dll (спасибо за помощь Владимиру в комментарии ниже)
- В строке подключения никаким образом не указать кодировку базы, т.к. у драйвера нет таких опций. Если база в windows-кодировке, драйвер будет ее упорно выдавать как западноевропейскую 1252. Единственное корректное решение, к которому я пришел - это преобразовывать кодировку, например, так:
out_str = Encoding.GetEncoding(1251).GetString(Encoding.GetEncoding(1252).GetBytes(in_str))
где in_str - это строка, полученная из базы.
В интернете встречается большое число различных советов. Большинство из них мне не помогли. Те, что я написал, возможно, для кого-то тоже не подойдут. Но возможно, кому-то я все-таки смог помочь.
Комментарии к статье:
Добавить комментарий: