32-разрядная проблема командной строки MDAC OLEDB - PullRequest
0 голосов
/ 02 декабря 2010

Пару лет назад я написал программу на C # .NET, которая использовала Microsoft ACE и JET OLEDB для преобразования электронных таблиц Excel в файлы CSV.Недавно мы обновились до сервера Windows Server 2008 x64.Поскольку JET устарел, этот метод больше не работает.Первоначально файлы .xls из Excel 2003 обрабатывались с помощью JET, а файлы .xlsx Excel 2007 - с помощью ACE.Я изменил строки подключения, чтобы использовать ACE для обоих.

Теперь мы можем успешно запустить программу через командную строку.Однако, когда мы используем наше программное обеспечение для автоматизации (которое, очевидно, запускает программу, аналогичную методу «Пуск» -> «Выполнить»), мы получаем сообщение о том, что компоненты Microsoft Data Access не установлены.После их изучения выяснилось, что они работают только на 32-разрядных системах и не поддерживают ничего, кроме Windows Server 2000.

Есть идеи?У нас установлены новейшие бета-версии драйверов x64 ACE OLEDB.Программа работает нормально вручную.Я также попытался скомпилировать программу с целевой платформой x86.Мы также вручную успешно запустили программу, используя учетную запись Windows, которую использует программное обеспечение для автоматизации.

1 Ответ

1 голос
/ 03 декабря 2010

В 64-битной Windows процесс определяет битность: 32 или 64.

Если вы запускаете программу в 64-битном режиме, и эта программа выполняет COM (OLEDB на основе COM),она будет искать только COM 64-битную DLL-библиотеку (на самом деле она использует только 64-битную сторону реестра, когда зарегистрированы 64-битные компоненты COM).

Если вы запускаете программу в 32-битном режимеи эта программа делает COM, она будет искать только 32-битную DLL библиотеки COM.

Теперь это может зависеть от версии компилятора C #, но сегодня большинство программ на C # настроены для компиляции как «Any Cpu».Это означает, что они будут работать как 32 в 32-битной ОС и 64 в 64-битной ОС, что делает вещи довольно сложными, если они используют COM прямо или косвенно (иногда вы даже не знаете, что используете COM!).

Итак ... чтобы подвести итог:

1) определяет битность вашего процесса (легко с помощью диспетчера задач, 32-битные процессы на 64-битной машине имеют суффикс "*32 ").

2) установите соответствующие драйверы COM OLEDB.

Если драйверы OLEDB не существуют в 64-разрядном режиме, вам придется перекомпилировать C # .EXE илизалатать его, чтобы форсировать 32-битный режим.Для этого вы можете использовать инструмент CORFLAGS .

...