Le fournisseur Microsoft.Jet.OLEDB.4.0 'n'est pas enregistré sur l'ordinateur local

191

J'ai créé une application Windows développée en .NET 3.5 sur un serveur Windows 2008 32 bits. Lorsqu'elle est déployée sur un serveur 64 bits, elle affiche l'erreur «Le fournisseur Microsoft.Jet.OLEDB.4.0 'n'est pas enregistré sur la machine locale».

Donc, pour résoudre ce problème, j'ai changé la propriété de construction du projet en X86, de sorte qu'il se construise en mode 32 bits et reconstruise le projet dans la machine 32 bits. Mais, le même projet utilise d'autres pilotes de base de données (DB2, SQL, etc.) pour se connecter à d'autres bases de données. Ainsi, lorsque j'ai déployé à nouveau mon application dans le système d'exploitation 64 bits, il lève l'exception «Tentative de chargement d'un assemblage 64 bits sur une plate-forme 32 bits».

J'utilise le pilote Microsoft.Jet.OLEDB.4.0 pour lire et écrire dans Excel (.xls)

néo
la source

Réponses:

239

J'ai trouvé une solution à ce problème. Le problème que j'ai décrit dans ma question est essentiellement dû à l'incompatibilité du pilote Microsoft.Jet.OLEDB.4.0 dans le système d'exploitation 64 bits.

Donc, si nous utilisons le pilote Microsoft.Jet.OLEDB.4.0 dans un serveur 64 bits, nous devons forcer notre application à intégrer en mode 32 bits (c'est la réponse que j'ai trouvée lorsque j'ai fait une recherche approfondie pour cela problème connu ) et cela provoque la rupture d'une autre partie de mon code.

Heureusement, Microsoft a maintenant publié un compatible 64 bits pilote système Office 2010qui peut être utilisé en remplacement du pilote Microsoft.Jet.OLEDB.4.0 traditionnel. Il fonctionne à la fois sur des serveurs 32 bits et 64 bits. Je l'ai utilisé pour la manipulation de fichiers Excel et cela a bien fonctionné pour moi dans les deux environnements.Mais ce pilote est en BETA .

Vous pouvez télécharger ce pilote à partir de Microsoft Access Database Engine 2010 Redistributable

néo
la source
6
Faites également attention aux instructions sur ce lien :)
Mark
4
J'ai eu le même problème. J'ai changé la configuration de l'application en x86, puis cela a fonctionné!
skpaul
9
J'ai également dû changer la chaîne de connexion de Microsoft.Jet.OLEDB.4.0 à Microsoft.ACE.OLEDB.12.0
Spikolynn
16
Oui, bien qu'un moteur de base de données Access compatible 64 bits soit disponible, il nécessite qu'aucune version 32 bits des produits MS Office ne soit déjà installée sur le système (par exemple, MS Word 32 bits), ce qui est un gros problème. La solution de contournement est que vous utilisez la version 32 bits d'Access Database Engine 2010 et que vous forcez votre application .NET à s'exécuter en mode 32 bits (par exemple en sélectionnant la plateforme x86 dans Configuration Manager). Et la bonne solution est de remplacer MS Access par une meilleure alternative.
Massood Khaari
3
noob question: puis-je distribuer ce pilote comme "dans mon application" ou est-ce que chaque utilisateur souhaitant utiliser mon application doit l'installer manuellement?
philx_x
117

Si le problème persiste dans ASP.NET, tout ce que j'avais à faire était de changer le paramètre «Activer les applications 32 bits» sur Vrai, dans les paramètres avancés du pool d'applications.

Jason Wicker
la source
J'utilisais ODBC 64 bits et ce changement a commencé à me donner une erreur de base de données. Je l'ai corrigé cependant. Au cas où quelqu'un rencontrerait cela aussi, vous devrez installer des pilotes ODBC 32 bits, puis créer votre DSN dans celui-ci.
Farhan Hafeez
2
Il est tout à fait possible de le faire entièrement en code 64 bits maintenant. Installez le lien redistribuable dans la réponse de neo , puis utilisez la chaîne Provider suggérée dans la réponse d'Iqbal . Ensuite, votez pour ces deux réponses. C'est tout!
Roman Starkov
Cela a résolu le problème pour moi sur Windows Server 2008 R2 après avoir installé la redistribution du moteur de base de données Access 32 bits .
Chris Pickford
2
L'inconvénient est que le pool fonctionnera en mode 32 bits. Nous allons plutôt passer à ACE pour éviter cela.
wtjones
a également travaillé pour moi avec Windows Forms. pas de code ASP.NET du tout
philx_x
53

J'ai le même problème

Le fournisseur Microsoft.Jet.OLEDB.4.0 'n'est pas enregistré sur l'ordinateur local

J'ai appliqué la réponse de neo mais cela n'a pas fonctionné tant que je n'ai pas changé le fournisseur en "Provider = Microsoft.ACE.OLEDB.12.0;"dans la chaîne de connexion.

J'espère que cela aidera si quelqu'un est confronté au même problème.

Iqbal
la source
4
Ça y est ...! Pour un serveur 64 bits, installez le redistribuable lié par neo (la variante 64 bits, évidemment), puis changez le fournisseur comme spécifié dans cette réponse, puis cela fonctionnera.
Roman Starkov
Vous avez raison romkyns. J'ai déjà dit que j'ai appliqué la solution neo, puis change le fournisseur. Mais merci votre commentaire le rend plus clair. Merci beaucoup romkyns
Iqbal
remplacé Microsoft.Jet.OLEDB.4.0 par Microsoft.ACE.OLEDB.12.0; dans app.config et tout a fonctionné.
AVEbrahimi
1
J'ai trouvé que cela fonctionnait, alors que restreindre l'application à 32 bits ne faisait aucune différence.
Ryan Lundy le
Dans mon cas: "Microsoft.ACE.OLEDB.12.0 non enregistré", :(
César León
29

Je sais que ce sont des questions assez anciennes et de nombreuses personnes y ont répondu. mais je résume les choses pour comprendre:

Si l'extension de fichier est xls et que le système d'exploitation est 32 bits, vous seul pouvez utiliser "Microsoft.Jet.OLEDB.4.0 ". Microsoft n'a pas publié la version 64 bits de ce pilote.

Si l'extension de fichier est xlsx ou que le système d'exploitation est 64 bits, vous devez utiliser "Microsoft.ACE.OLEDB.12.0 ". L'application compilée en mode 32/64 bits n'impacte pas la sélection du pilote.

Installez toujours le pilote 64 bits Microsoft.ACE.OLEDB.12.0sur OS 64 bits. Si vous avez déjà installé Office 32 bits, vous devez exécuter le pilote à partir de cmd avec l'argument / passive. Ce hack fonctionne jusqu'à Office 2013 uniquement, Microsoft a arrêté cette solution de contournement à partir d'Office 2016 pour les pilotes Microsoft.ACE.OLEDB.16.0.

AccessDatabaseEngine_x64.exe /passive

Télécharger les pilotes 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\"";
}

Si l'application est compilée avec l'indicateur AnyCPU, elle recherchera les pilotes d'accès 64 bits sur OS 64 bits et les pilotes d'accès 32 bits sur OS 32 bits.

Romil Kumar Jain
la source
1
Merci pour votre réponse, cependant, j'utilise VS2015 sur Windows 10 et j'utilise X64. Lorsque j'ai changé la configuration du projet de AnyCPU à X86, le problème a disparu. Je n'ai pas eu à installer de pilotes supplémentaires.
NoChance
@NoChance Je pense que vous avez déjà installé Office 64 bits sur votre machine et qu'il contient déjà des pilotes Microsoft.ACE.OLEDB.12.0.
Romil Kumar Jain le
Merci pour votre réponse, je n'ai que le bureau 2007.
NoChance
19

J'ai le même message, j'ai une page Web avec faire sur visual studio 2010, j'ai lu un fichier.xls sur cette page, dans mon projet visuel n'a aucun problème, quand je le mets sur mon IIS local, lancez-moi un 'Microsoft .Jet.OLEDB.4.0 'Le fournisseur n'est pas enregistré sur la machine locale' , j'ai résolu ce problème en suivant ces étapes,

1.-Ouvrez IIS
2.-Modifiez l'appPool dans les paramètres avancés
3.-true pour activer l'application 32 bits.

et c'est tout

ps J'ai changé Configuration Manager en X86 sur Active Solution Platform

Leo
la source
Cela force votre application à s'exécuter en mode 32 bits. Vous avez besoin de ce paramètre si vous voulez pouvoir éviter la barrière de 4 Go.
Brain2000
18

Si votre application s'exécute sur localIIS, vous pouvez résoudre ce problème en activant les applications 32 bits dans les paramètres avancés d'AppPool.

entrez la description de l'image ici

Mumin Ka
la source
8

J'ai eu le même problème. J'ai changé la configuration de l'application en x86, puis cela a fonctionné!

Kakopappa
la source
comment changer cette configuration? J'ai créé un projet de type site Web
SHEKHAR SHETE
7

Je viens de changer ma propriété de projet au format x64

Projet ---> Propriétés ---> Construire ---> Framework cible ---> X64

Muhamed Shafeeq
la source
5

Nous avons rencontré ce problème dans l'application de bureau.

Environnement de développement: Windows 7 Ultimate - 64 bits .Net Framework 4.5 Provider = Microsoft.Jet.OLEDB.4.0

Il a été résolu en changeant la cible de la plate-forme en X86 à partir de n'importe quel processeur. Propriétés du projet >> Build >> Platform Target.

entrez la description de l'image ici

Techvalens
la source
2

J'ai rencontré ce problème avec mon application de bureau (le fournisseur «Microsoft.Jet.OLEDB.4.0» n'est pas enregistré sur la machine locale). Je n'avais pas la possibilité de créer une application 32 bits. En espérant que cela aiderait les autres dans la même situation.

J'ai fait ce qui suit et le problème a disparu:

  1. Installation de la version 64 bits de Microsoft Access Database Engine 2010 Redistributable , comme suggéré par neo

  2. J'ai changé mon fournisseur en Microsoft.ACE.OLEDB.12.0

robinhood9
la source
2

Bien qu'une solution plus optimale consiste simplement à recompiler comme suggéré ci-dessus, cela nécessite un accès au code source. Dans mon cas, je n'avais que le .exe fini et je devais utiliser cette solution. Il utilise à CorFlags.exepartir du SDK .Net pour modifier les caractéristiques de chargement de l'application.

  1. Téléchargez le SDK .Net Framework (j'ai personnellement utilisé 3.5 , mais la version utilisée doit être égale ou supérieure au .Net requis pour votre application.
  2. Lors de l'installation, il vous CorLibs.exesuffit de vérifier les outils de développement Windows .
  3. Après l'installation, trouvez votre fichier CorFlags.exe. Pour mon installation du SDK .Net Framework 3.5, c'était à C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin.
  4. Ouvrez une invite de commande et tapez path/to/CorFlags.exe path/to/your/exeFile.exe /32Bit+.

Vous avez terminé! Cela définit les indicateurs de démarrage de votre programme afin qu'il démarre en mode WOW64 32 bits et puisse donc accéder à microsoft.jet.oledb.4.0.

Cullub
la source
1

Modification des paramètres avancés du pool d'applications Paramètres IIS Activer l'application 32 bits

dpsrikanth
la source
1

Changez simplement la propriété en fonction de votre machine et tout est fait :-)

Projet ---> Propriétés ---> Construire ---> Framework cible ---> X64

ou

Projet ---> Propriétés ---> Construire ---> Framework cible ---> X86

Ajmal
la source
1

J'ai changé ma chaîne de connexion de

var myConnectionString = string.Format ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = {0}; Persist Security Info = True; Jet OLEDB: Database Password =;", gisdbPath);

pour ça:

var myConnectionString = string.Format ("Provider = Microsoft.Jet.OLEDB.4.0; Mode = Share Deny None; Data Source = {0}; user id = Admin; password =;", gisdbPath);

Cela fonctionne parce que je n'ai jamais demandé Microsoft.Jet.OLEDB.4.0'enregistré.

Dilhan RK
la source
0

Il n'y a en effet pas de version 64 bits de Jet - et aucun projet (apparemment) d'en produire une.

Vous pourrez peut-être utiliser le pilote ACE 64 bits: http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=23734

  • mais je n'ai aucune idée de comment cela fonctionnerait si vous devez revenir à Jet pour vos applications 32 bits.

Cependant, vous pourrez peut-être passer le projet en 32 bits dans la version Express (je n'ai pas essayé et je n'ai plus installé 2008 dans aucune saveur)

Il est peut-être temps de supprimer complètement les bases de données Access, de mordre la balle et d'opter pour le serveur SQL à la place?

Anant Dabhi
la source
0

Dans les anciennes versions d'IIS, vous ne trouverez Advance Settingspas pour l'activer, Enable 32-bit Applicationsvous devez exécuter les commandes suivantes:

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

et

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

Référence: ici

Usman Khalid
la source
0

J'obtenais la même exception lors de l'exécution de "SQL Server 2014 Importer et exporter des données (64 bits)" sur mon Windows 8.1.

Pour résoudre ce problème, j'ai effectué les opérations suivantes

a démarré SQL Server 2014 Importer et exporter des données (32 bits) au lieu de 64 bits et cela fonctionne pour moi. Je n'ai modifié aucun paramètre IIS et n'ai installé aucun logiciel supplémentaire.

Banketeshvar Narayan
la source
0

Je sais que j'ai ce problème encore et encore lorsque je déploie mon application sur un nouveau serveur car j'utilise ce pilote pour me connecter à un fichier Excel. Alors voici ce que je fais ces derniers temps.

Il y a un Windows Server 2008 R2, j'installe les pilotes Access pour une machine x64 bits et je me débarrasse de ce message, ce qui me rend très heureux de tomber sur un autre.

Celui-ci ci-dessous fonctionne à merveille sur ma machine de développement, mais sur le serveur me donne une erreur même après l'installation des derniers pilotes ODBC, ce qui, je pense, est le problème, mais c'est ainsi que je l'ai résolu.

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

Je remplace par le nouveau fournisseur comme celui-ci ci-dessous:

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

Mais en faisant cela, il y a une chose que vous devriez remarquer. L'utilisation de l'extension de fichier .xlsx et de la version Excel est 12.0.

Après avoir reçu ce message d' erreur Erreur: "Impossible de trouver l'ISAM installable" , je décide de modifier un peu les choses comme ci-dessous:

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

et oui, j'en ai fini avec cette chose désagréable, mais ici j'ai un autre message Le moteur de base de données Microsoft Access ne peut pas ouvrir ou écrire dans le fichier 'time_zone'. Il est déjà ouvert exclusivement par un autre utilisateur, ou vous avez besoin d'une autorisation pour afficher et écrire ses données. ce qui me dit que je ne suis pas loin de le résoudre.

Peut-être qu'il y a un autre processus qui a ouvert le fichier entre-temps et tout ce que j'ai à faire est un redémarrage et tout commencera en douceur comme prévu.

pseudo
la source
0

allez dans Démarrer-> Exécuter et tapez cmd cela démarre l'invite de commande (également disponible à partir de Démarrer-> Programmes-> Accessoires-> Invite de commandes)

tapez cd .. et appuyez sur retour tapez cd .. et appuyez à nouveau sur retour (continuez à faire cela jusqu'à ce que l'invite affiche:>)

maintenant, vous devez aller dans un dossier spécial qui pourrait être c: \ windows \ system32 ou c: \ winnt \ system32 ou c: \ windows \ sysWOW64 essayez de taper chacun de ceux-ci, par exemple cd c: \ windows \ sysWOW64 (s'il indique Le système ne trouve pas le chemin spécifié, essayez le suivant) cd c: \ windows \ system32 cd c: \ winnt \ system32 lorsque l'un de ceux-ci ne provoque pas d'erreur, arrêtez, vous avez trouvé le dossier correct.

vous devez maintenant enregistrer les DLL OLE DB 4.0 en tapant ces commandes et en appuyant sur retour après chaque

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

user1089766
la source
-2

Il n'y a pas de fournisseur 64 bits pour Jet. Si vous souhaitez prendre en charge plusieurs sources de base de données, y compris Jet vers Excel, vous aurez besoin d'au moins cette partie de votre application pour s'exécuter dans un processus 32 bits.

L'erreur que vous obtenez lorsque vous compilez pour x86 est un peu étrange. Je ne vois pas comment vous finiriez par référencer des assemblages 64 bits dans ce cas.

AnthonyWJones
la source
Anthony, Comment puis-je faire exécuter uniquement une partie d'un projet en mode 32 bits? Toutes ces connexions DB, y compris Excel, relèveront d'un seul projet. J'ai également eu l'erreur dans x86, lorsque j'essaie de l'exécuter dans le système d'exploitation 64 bits. Je pense que c'est parce que le pilote DB2 installé dans le système d'exploitation 64 bits est une version 64 bits et, lorsqu'il est référencé à partir de l'application, qui est configurée pour fonctionner en mode 32 bits, provoque l'erreur.
neo
Si diviser le projet en plusieurs fichiers exécutables est plus compliqué que cela en vaut la peine, il ne vous reste plus qu'à compiler en 32 bits. En ce qui concerne le problème DB2, vous devriez rechercher des experts DB2 sur ce peut-être une autre question spécifique à DB2. En règle générale, des éléments tels que SQL Server installent les fournisseurs 32 bits et 64 bits sur une machine 64 bits.
AnthonyWJones
Merci Anthony pour vos commentaires. Après avoir fait beaucoup de recherches sur cette question et à partir de vos commentaires, ce que j'ai compris, c'est que je dois créer la partie du projet qui traite la feuille Excel comme un projet séparé et la compile en version 32 bits.
neo
3
Juste pour que les gens sachent, A2010 aura Jet 64 bits.
David-W-Fenton
Merci David, 2010 a un pilote 64 bits
neo