четверг, 15 декабря 2011 г.

ODBC (DBF) на Windows 7 x64

Предыстория такова. Было приложение (на C#), работающее под Windows XP x86, которое производило чтение DBF файлов посредством ODBC провайдера следующим образом:

using System.Data.Odbc;
...
OdbcConnection conn_ = new OdbcConnection();
conn_.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=NA;Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
conn_.Open();
OdbcCommand cmd_ = conn_.CreateCommand();
cmd_.CommandText = @"SELECT * FROM " + FullDbfFileName;
...

В последующем появилась потребность запускать это приложение под Windows 7 x64. И в этом случае код генерил следующую ошибку:

ERROR [IM002] [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию

В общем, код потерял драйвер ODBC. После некоторых поисков в интернетах, вышел на статью Faruk Celik'a. Дело в том, что драйвер ODBC заточен под 32-х разрядные системы. Код по умолчанию запускался в семёрке как 64-х разрядный и окружение осуществляло поиск драйвера в 64-х разрядной среде ODBC. Просмотреть его можно, если зайти "Панель управления" - "Администрирование" - "Источник данных (ODBC)". Во вкладке "Драйверы" хотелось бы видеть строку  Microsoft dBase Driver (*.dbf), но её там нет. И не будет... Она в другом месте, в  источнике данных (ODBC) для 32-х разрядных систем, найти который можно здесь:

C:\Windows\SysWOW64\odbcad32.exe

Запускаем его и во вкладке "Драйверы" находим наш  Microsoft dBase Driver (*.dbf).
Далее, во вкладке "Пользовательский DSN" создаём источник данных с именем "odbc32dbf" и драйвером  Microsoft dBase Driver (*.dbf). В коде меняем строку подключения:

using System.Data.Odbc;
...
OdbcConnection conn_ = new OdbcConnection();
conn_.ConnectionString = "Dsn=odbc32dbf";
conn_.Open();
...

Также необходимо перекомпилировать проект как x86, чтобы при запуске он вертелся в необходимой нам 32-х разрядной среде. И тогда всё будет норм.

P.S. В написании статьи использовался SyntaxHighlighter 2.0 (подсветка синтаксиса программного кода в блоге)