Постачальник Microsoft.Jet.OLEDB.4.0 'не зареєстрований на локальній машині


191

Я створив програму Windows, розроблену в .NET 3.5 на 32-бітному сервері Windows 2008. При розгортанні програми на 64-бітному сервері відображається помилка "Провайдер Microsoft.Jet.OLEDB.4.0 'не зареєстрований на локальній машині".

Отже, як вирішення цього питання я змінив властивість збірки проекту на X86, щоб він побудував у 32-бітному режимі та відновив проект у 32-бітній машині. Але той самий проект використовує інші драйвери БД (DB2, SQL тощо) для підключення до інших баз даних. Тож коли я знову розгорнув свою програму в 64-бітній ОС, вона кидає виняток "Спроба завантажити 64-бітну збірку на 32-бітну платформу".

Я використовую драйвер Microsoft.Jet.OLEDB.4.0 для читання та запису в Excel (.xls)

Відповіді:


239

Я знайшов рішення для цієї проблеми. Проблема, яку я описав у своєму запитанні, виникала в основному через несумісність драйвера Microsoft.Jet.OLEDB.4.0 в 64-бітній ОС.

Отже, якщо ми використовуємо драйвер Microsoft.Jet.OLEDB.4.0 на 64-бітному сервері, ми повинні змусити нашу програму вбудовуватися в 32-бітному режимі (це відповідь, яку я знайшов, коли я широко розшукував цю відому проблему ) і це призводить до порушення іншої частини мого коду.

На щастя, зараз Microsoft випустила 64-бітний сумісний драйвер Office 2010, який можна використовувати як заміну для традиційного драйвера Microsoft.Jet.OLEDB.4.0. Він працює як в 32-бітових, так і в 64-бітних серверах. Я використовував його для обробки файлів Excel, і він працював чудово для мене в обох середовищах.Але цей драйвер є в BETA .

Ви можете завантажити цей драйвер з перерозподілюваної версії Microsoft Access Database Engine 2010


6
Також зверніть особливу увагу на вказівки за цим посиланням :)
Марк

4
У мене було те саме питання. Я змінив конфігурацію програми на x86, тоді вона працювала!
skpaul

9
також мені довелося змінити рядок з'єднання з використання Microsoft.Jet.OLEDB.4.0 на Microsoft.ACE.OLEDB.12.0
Spikolynn

16
Так, хоча 64-бітний сумісний двигун бази даних Access доступний, він вимагає, щоб в системі вже не була встановлена ​​32-бітна версія продуктів MS Office (наприклад, 32-бітна MS Word), що є великою проблемою. Вирішення проблеми полягає в тому, що ви використовуєте 32-бітну версію Access Database Engine 2010 і змушуєте ваш додаток .NET працювати в 32-бітному режимі (наприклад, вибравши платформу x86 в Configuration Manager). І правильне рішення - замінити MS Access на кращу альтернативу.
Massood Khaari

3
noob питання: чи можу я розповсюджувати цей драйвер на зразок "у межах моєї програми" чи кожен користувач, який хоче використовувати мій додаток, повинен встановити його вручну?
philx_x

117

Якщо проблема зберігається в ASP.NET, все, що мені потрібно було зробити, було змінити налаштування "Увімкнути 32-бітні програми" на "Істинне" в Додаткові параметри пулу програм.


Я використовував 64-розрядний ODBC, і ця зміна почала давати мені помилку в базі даних. Я все-таки виправив. Якщо хтось із цим теж стикається, вам доведеться встановити 32-бітні драйвери ODBC, а потім створити свій DSN.
Farhan Hafeez

2
Зараз це цілком можливо зробити в 64-бітному коді. Встановіть посилання, що поширюється у відповідь нео , а потім використовуйте рядок Provider, запропонований у відповіді Iqbal . Потім підтвердіть обидва ці відповіді. Це воно!
Роман Старков

Це вирішило проблему для мене на Windows Server 2008 R2 після встановлення 32- бітного доступу DB Engine Redist .
Кріс Пікфорд

2
Мінусом є те, що пул працюватиме в 32-бітному режимі. Замість цього ми перейдемо на ACE, щоб цього не було.
wtjones

також працював для мене з Windows Forms. взагалі немає коду ASP.NET
philx_x

52

У мене така ж проблема

Постачальник Microsoft.Jet.OLEDB.4.0 'не зареєстрований на локальній машині

Я застосував відповідь від neo, але це не спрацювало, поки я не змінив постачальника на "Provider = Microsoft.ACE.OLEDB.12.0;" в рядку з'єднання.

Сподіваюсь, це допоможе, якщо хтось стикається з тим самим питанням.


4
Це воно! Для 64-розрядного сервера встановіть перерозподілений канал, пов'язаний нео (64-розрядний варіант, очевидно), а потім змініть постачальника, як зазначено в цій відповіді, тоді він працюватиме.
Роман Старков

Ви праві ромкіни. Я вже казав, що застосував нео-рішення, а потім змінює провайдера. Але завдяки вашому коментарю це робить більш зрозумілим. Дякую багато romkyns
Ікбал

замінив Microsoft.Jet.OLEDB.4.0 на Microsoft.ACE.OLEDB.12.0; в app.config і все, що працювало.
AVEbrahimi

1
Я виявив, що це спрацьовує, але обмеження програми на 32-розрядні не мало жодної різниці.
Райан Лунді

У моєму випадку: "Microsoft.ACE.OLEDB.12.0 не зареєстровано", :(
César León

29

Я знаю, що це досить старі питання, і багато людей відповіли. але я резюмую речі для розуміння:

Якщо розширення файлу дорівнює xls, а ОС 32-бітне, тоді ви можете використовувати лише " Microsoft.Jet.OLEDB.4.0". Microsoft не випустила 64-бітну версію цього драйвера.

Якщо розширення файлу xlsx або ОС 64-бітне, вам доведеться використовувати " Microsoft.ACE.OLEDB.12.0". Додаток, складений у 32/64 бітовому режимі, не впливає на вибір драйвера.

Завжди встановлюйте 64-бітний драйвер Microsoft.ACE.OLEDB.12.0ОС 64 біт. Якщо ви вже встановили Office 32 біт, то вам потрібно запустити драйвер з cmd з / пасивним аргументом. Цей злом працює лише до Office 2013, Microsoft зупинила цю проблему з Office 2016 для драйверів Microsoft.ACE.OLEDB.16.0.

AccessDatabaseEngine_x64.exe /passive

Завантажити драйвери Microsoft.ACE.OLEDB.12.0

private void ProcessFile(string path)
{
    string connString = string.Empty;

    if (Path.GetExtension(path).ToLower().Trim() == ".xls" && Environment.Is64BitOperatingSystem == false)
        connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
    else
        connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
}

Якщо програму компілюється із прапором AnyCPU, вона шукатиме 64-бітні драйвери доступу на 64-бітній ОС та 32-бітні драйвери доступу на 32-бітній ОС.


1
Дякую за вашу відповідь, однак я використовую VS2015 у Windows 10 та X64. Коли я змінив конфігурацію проекту з AnyCPU на X86, проблема усунулася. Мені не довелося встановлювати жодних додаткових драйверів.
NoChance

@NoChance Я думаю, що ви вже встановили Office 64 біт на свою машину, і він вже містить драйвери Microsoft.ACE.OLEDB.12.0.
Роміль Кумар Джайн

Для вашої відповіді, у мене офіс 2007 року.
NoChance

19

У мене те саме повідомлення, у мене є веб-сторінка з do у візуальній студії 2010, я читаю file.xls на цій сторінці, в моєму проекті візуального не виникає жодних проблем, коли я ставлю його на мій IIS-локальний, кинь мені «Microsoft .Jet.OLEDB.4.0 "Постачальник не зареєстрований на локальній машині" , я вирішив цю проблему наступними кроками,

1.-Відкрийте IIS
2. -Змініть appPool на Advanced Settings
3.-true, щоб увімкнути 32-бітну програму.

і це все

ps.Я змінив Configuration Manager на X86 на платформі Active Solution


Це змушує ваш додаток працювати в 32-бітовому режимі. Це налаштування потрібно, якщо ви хочете уникнути бар'єру 4 Гб.
Brain2000

18

Якщо ваша програма працює на localIIS, ви можете вирішити цю проблему, включивши 32-розрядні програми в додаткові параметри AppPool

введіть тут опис зображення


8

У мене було те саме питання. Я змінив конфігурацію програми x86, потім вона працювала!


як змінити цю конфігурацію? Я створив проект типу веб-сайту
SHEKHAR SHETE

7

Я просто змінив свою власність проекту на формат x64

Проект ---> Властивості ---> Створення ---> Цільова рамка ---> X64


5

Ми зіткнулися з цією проблемою у настільному додатку.

Середовище розробників: Windows 7 Ultimate - 64-бітний .Net Framework 4.5 Provider = Microsoft.Jet.OLEDB.4.0

Це було вирішено шляхом зміни цілі платформи на X86 від будь-якого процесора. Властивості проекту >> Створення >> Ціль платформи.

введіть тут опис зображення


2

Я зіткнувся з цією проблемою зі своїм додатком для настільних ПК (постачальник "Microsoft.Jet.OLEDB.4.0" не зареєстрований на локальній машині). У мене не було можливості будувати як 32-бітну програму. Сподіваючись, що це допоможе іншим у тій же ситуації.

Я зробив наступне, і проблема пішла:

  1. Встановлено 64-бітну версію Microsoft Access Database Engine 2010, що перерозподіляється , як це запропонував neo

  2. Змінено мого провайдера на Microsoft.ACE.OLEDB.12.0


2

Хоча більш оптимальним рішенням є просто перекомпілювати, як було запропоновано вище, що вимагає доступу до вихідного коду. У моєму випадку я мав лише готовий файл .exe і мені довелося використовувати це рішення. Він використовує CorFlags.exeвід .Net SDK для зміни характеристик завантаження програми.

  1. Завантажте SDK .Net Framework SDK (я особисто використовував 3.5 , але версія, яка використовується, повинна бути на або вище необхідної .Net для вашої програми.
  2. Під час встановлення все, що вам потрібно CorLibs.exe, просто перевірте Засоби розробки Windows .
  3. Після установки знайдіть своє CorFlags.exe. Для моєї установки .Net Framework 3.5 SDK він був на C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin.
  4. Відкрийте командний рядок і введіть path/to/CorFlags.exe path/to/your/exeFile.exe /32Bit+ .

Ви закінчили! Це встановлює початкові прапори для вашої програми так, що вона запускається в 32-бітному режимі WOW64, і тому може отримати доступ до microsoft.jet.oledb.4.0.


1

Змінення в розширених налаштуваннях пулу програм IIS Settings. Увімкніть 32-бітну програму


1

Просто змініть властивість на основі вашої машини, і все зробили :-)

Проект ---> Властивості ---> Створення ---> Цільова рамка ---> X64

або

Проект ---> Властивості ---> Створення ---> Цільова рамка ---> X86


1

Я змінив свій рядок з'єднання з

var myConnectionString = string.Format ("Провайдер = Microsoft.Jet.OLEDB.4.0; Джерело даних = {0}; Персист Інформація про безпеку = Істинно; Jet OLEDB: Пароль бази даних =;", gisdbPath);

до цього:

var myConnectionString = string.Format ("Постачальник = Microsoft.Jet.OLEDB.4.0; Режим = Надіслати відмову немає; Джерело даних = {0}; ідентифікатор користувача = Адміністратор; пароль =;", gisdbPath);

Це працює мені ніколи не просив Microsoft.Jet.OLEDB.4.0 зареєструватися.


0

Дійсно не існує 64-розрядної версії Jet - і жодних планів (очевидно) не виробляти.

Можливо, ви зможете використовувати 64-бітний драйвер ACE: http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=23734

  • але я не маю уявлення, як це буде працювати, якщо вам потрібно повернутися до Jet для своїх 32-бітних додатків.

Однак ви, можливо, зможете переключити проект на 32-бітний у версії Express (я вже не пробував і не маю 2008-го встановленого в будь-якому ароматі)

Можливо, настав час взагалі зламати бази даних Access, кусати кулю і замість цього піти на SQL-сервер?



0

У старих версіях IIS ви не знайдете Advance Settingsцього, щоб увімкнути Enable 32-bit Applicationsвиконання таких команд:

cscript% SYSTEMDRIVE% \ inetpub \ adminscripts \ adsutil.vbs SET W3SVC / AppPools / Enable32bitAppOnWin64 1

і

% SYSTEMROOT% \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_regiis.exe -i

Довідка: Тут


0

Я отримав той самий виняток під час запуску "Імпорту та експорту даних (SQL Server 2014) (64-розрядні)" на моїй Windows 8.1.

Щоб вирішити цю проблему, я зробив наступне

запустив імпорт та експорт даних SQL Server 2014 (32-бітний) замість 64-бітного, і він працює для мене. Я не змінив жодної настройки IIS і не встановив додаткового програмного забезпечення.


0

Я знаю, що ця проблема виникає знову і знову, коли я розгортаю свою програму на новому сервері, тому що я використовую цей драйвер для підключення до файлу Excel. Так ось це я роблю останнім часом.

Там є Windows Server 2008 R2, я встановлюю драйвери Access для x64-бітної машини, і я позбавляюся цього повідомлення, завдяки чому я дуже радий просто натрапити на інший.

Цей тут нижче працює чудово на моїй машині розробки, але на сервері дає мені помилку навіть після встановлення останніх драйверів ODBC, що, на мою думку, це проблема, але це я вирішив це.

private const string OledbProviderString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\OlsonWindows.xls;Extended Properties=\"Excel 8.0;HDR=YES\"";

Я замінюю нового постачальника, як описано нижче:

private const string OledbProviderString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\OlsonWindows.xlsx;Extended Properties='Excel 12.0;HDR=YES;';";

Але коли я це роблю, ви маєте помітити одне. Використання розширення файлу .xlsx та версії Excel становить 12.0.

Після того як я потрапив у це повідомлення про помилку Помилка: "Не вдалося знайти встановлений ISAM" , я вирішу трохи змінити речі, як нижче:

private const string OledbProviderString =      @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\OlsonWindows.xls;Extended Properties='Excel 8.0;HDR=YES;';"; 

і так, я закінчував цю жахливу річ, але тут я отримав ще одне повідомлення . Двигун бази даних Microsoft Access не може відкрити або записати у файл 'time_zone'. Він вже відкритий виключно іншим користувачем, або вам потрібен дозвіл для перегляду та запису його даних.що говорить мені, що я недалеко від її вирішення.

Можливо, є ще один процес, який відкрив файл тим часом, і все, що мені потрібно зробити, це перезапуск, і все почнеться плавно, як очікувалося.


0

перейдіть до пункту Пуск-> Виконати та введіть cmd, щоб запустити командний рядок (також доступний у меню Пуск-> Програми-> Аксесуари-> Командний рядок)

введіть cd .. і натисніть клавішу return type cd .. і знову натисніть клавішу return (продовжуйте робити це, поки не з’явиться підказка:>)

тепер вам потрібно перейти до спеціальної папки, яка може бути c: \ windows \ system32 або це може бути c: \ winnt \ system32 або це може бути c: \ windows \ sysWOW64, спробуйте ввести кожне із них, наприклад, cd c: \ windows \ sysWOW64 (якщо сказано, що система не може знайти вказаний шлях, спробуйте наступний) cd c: \ windows \ system32 cd c: \ winnt \ system32, коли один із них не викликає помилок, зупиніться, ви знайшли виправити папку.

тепер вам потрібно зареєструвати DLL-файли OLE DB 4.0, ввівши ці команди та натиснувши кнопку return після кожної

regsvr32 Msjetoledb40.dll regsvr32 Msjet40.dll regsvr32 Mswstr10.dll regsvr32 Msjter40.dll regsvr32 Msjint40.dll


-2

Не існує 64-бітного провайдера для Jet. Якщо ви хочете підтримувати кілька джерел БД, включаючи Jet to Excel, вам знадобиться принаймні та частина вашої програми для запуску в 32-бітовому процесі.

Помилка, яку ви отримуєте під час компіляції для x86, трохи дивна. Я не бачу, як у цьому випадку ви посилаєтесь на 64-бітні збірки.


Ентоні, як я можу зробити лише частину проекту для запуску в 32-бітовому режимі? Усі ці підключення до БД, включаючи Excel, будуть підпадати під один проект. Також я отримав помилку в x86, коли я намагаюся запустити її в 64-бітній ОС. Я думаю, це тому, що драйвер DB2, встановлений в 64-бітній ОС, є 64-бітовою версією, і коли вона відходить від програми, яка налаштована для роботи в 32-бітовому режимі, викликає помилку.
нео

Якщо розділити проект на багатоканальні exes більше клопоту, ніж варто, то вам залишиться лише скласти 32-біт. Що стосується проблеми DB2, то ви можете шукати деяких експертів DB2 з цього, можливо, іншого питання, специфічного для DB2. Зазвичай такі речі, як SQL Server, встановлюють 32-бітні та 64-бітні провайдери на 64-бітній машині.
AnthonyWJones

Дякую Ентоні за ваші коментарі. З багатьох пошуків цього питання та з ваших коментарів, я зрозумів, що я повинен створити ту частину проекту, яка обробляє аркуш excel як окремий проект і змушує його складатись у 32-бітовій версії.
нео

3
Так, щоб люди знали, A2010 матиме 64-бітний Jet.
David-W-Fenton

Завдяки David 2010 дійсно є 64 бітний драйвер
нео
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.