O provedor Microsoft.Jet.OLEDB.4.0 'não está registrado na máquina local

191

Criei um aplicativo Windows desenvolvido no .NET 3.5 em um servidor Windows 2008 de 32 bits. Quando implantado o aplicativo em um servidor de 64 bits, ele mostra o erro "O provedor Microsoft.Jet.OLEDB.4.0 'não está registrado na máquina local".

Portanto, como solução para esse problema, alterei a propriedade build do projeto para X86, para que ele seja compilado no modo de 32 bits e reconstrua o projeto na máquina de 32 bits. Mas, o mesmo projeto usa outros drivers de banco de dados (DB2, SQL etc.) para conectar-se a outros bancos de dados. Portanto, quando implantei meu aplicativo novamente no SO de 64 bits, ele lança a exceção "Tentativa de carregar um assembly de 64 bits em uma plataforma de 32 bits".

Estou usando o driver Microsoft.Jet.OLEDB.4.0 para ler e gravar no Excel (.xls)

neo
fonte

Respostas:

238

Encontrei uma solução para esse problema. O problema que descrevi na minha pergunta ocorreu basicamente devido à incompatibilidade do driver Microsoft.Jet.OLEDB.4.0 no sistema operacional de 64 bits.

Portanto, se estivermos usando o driver Microsoft.Jet.OLEDB.4.0 em um servidor de 64 bits, forçaremos nosso aplicativo a criar no modo de 32 bits (esta é a resposta que encontrei quando fiz uma pesquisa extensa sobre esse problema conhecido ) e isso faz com que outra parte do meu código quebre.

Felizmente, agora a Microsoft lançou um 2010 Office System Driver compatível com 64 bits, que pode ser usado como substituto do driver tradicional Microsoft.Jet.OLEDB.4.0. Ele funciona tanto em servidores de 32 bits quanto de 64 bits. Eu o usei para manipulação de arquivos do Excel e funcionou bem para mim nos dois ambientes.Mas este driver está em beta .

Você pode baixar este driver no Microsoft Access Database Engine 2010 Redistributable

neo
fonte
6
Também preste especial atenção às instruções no link :)
Mark
4
Eu tive o mesmo problema. Mudei a configuração do aplicativo para x86 e funcionou!
Skpaul
9
Também tive que alterar a seqüência de conexão usando Microsoft.Jet.OLEDB.4.0 para Microsoft.ACE.OLEDB.12.0
#
16
Sim, embora um Mecanismo de Banco de Dados do Access compatível com 64 bits esteja disponível, ele exige que nenhuma versão de 32 bits dos produtos MS Office esteja instalada no sistema (por exemplo, MS Word de 32 bits), o que é um grande problema. A solução alternativa é usar a versão de 32 bits do Access Database Engine 2010 e forçar o aplicativo .NET a ser executado no modo de 32 bits (por exemplo, selecionando a plataforma x86 no Configuration Manager). E a solução adequada é substituir o MS Access por uma alternativa melhor.
Massood Khaari
2
noob pergunta: posso distribuir este driver como "dentro do meu aplicativo" ou todo usuário que deseja usar meu aplicativo precisa instalá-lo manualmente?
21416 philip_x
117

Se o problema persistir no ASP.NET, basta alterar a configuração "Ativar aplicativos de 32 bits" para True, nas configurações avançadas do pool de aplicativos.

Jason Wicker
fonte
Eu estava usando ODBC de 64 bits e essa alteração começou a me dar erro no banco de dados. Eu o corrigi embora. Caso alguém encontre isso também, será necessário instalar drivers ODBC de 32 bits e criar seu DSN.
Farhan Hafeez
2
É bem possível fazer isso inteiramente no código de 64 bits agora. Instale o redistribuível vinculado na resposta do neo e use a string do provedor sugerida na resposta do Iqbal . Em seguida, vote duas dessas respostas. É isso aí!
Roman Starkov 29/10
Isso corrigiu o problema para mim no Windows Server 2008 R2 depois de instalar o Redist do mecanismo de banco de dados do Access de 32 bits .
precisa
2
A desvantagem é que o pool será executado no modo de 32 bits. Em vez disso, mudaremos para o ACE para evitar isso.
Wtjones
trabalhou para mim com o Windows Forms também. nenhum código ASP.NET
philx_x 11/02/16
52

Eu tenho o mesmo problema

O provedor Microsoft.Jet.OLEDB.4.0 'não está registrado na máquina local

Apliquei a resposta por neo, mas ela não funcionou até alterar o provedor para "Provider = Microsoft.ACE.OLEDB.12.0;" na cadeia de conexão.

Espero que isso ajude se alguém enfrentar o mesmo problema.

Iqbal
fonte
4
É isso! Para um servidor de 64 bits, instale o redistribuível vinculado por neo (a variante de 64 bits, obviamente) e altere o provedor conforme especificado nesta resposta, para que funcione.
Roman Starkov
Você está certo romkyns. Eu já disse que apliquei a solução neo e depois mude de provedor. Mas, graças ao seu comentário, fica mais claro. Muito obrigado romkyns
Iqbal
substituiu Microsoft.Jet.OLEDB.4.0 por Microsoft.ACE.OLEDB.12.0; no app.config e tudo funcionou.
AVEbrahimi
1
Descobri que isso funcionava, ao restringir o aplicativo a 32 bits não fazia diferença alguma.
Ryan Lundy
No meu caso: "Microsoft.ACE.OLEDB.12.0 não registrado", :(
César León
29

Eu sei que são perguntas bastante antigas e muitas pessoas responderam. mas estou resumindo as coisas para entender:

Se a extensão do arquivo for xls e o SO for 32 bits, somente você poderá usar " Microsoft.Jet.OLEDB.4.0". A Microsoft não lançou a versão de 64 bits deste driver.

Se a extensão do arquivo for xlsx ou o SO for 64 bits, você deverá usar " Microsoft.ACE.OLEDB.12.0". O aplicativo compilado no modo 32/64 bits não afeta a seleção do driver.

Sempre instale o driver de Microsoft.ACE.OLEDB.12.064 bits no SO de 64 bits. Se você já instalou o Office 32 bits, precisará executar o driver do cmd com o argumento / passive. Esse hack funciona até o Office 2013, a Microsoft interrompeu essa solução alternativa do Office 2016 para drivers Microsoft.ACE.OLEDB.16.0.

AccessDatabaseEngine_x64.exe /passive

Download de drivers 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\"";
}

Se o Aplicativo for compilado com o sinalizador AnyCPU, ele procurará drivers de acesso de 64 bits no SO de 64 bits e drivers de acesso de 32 bits no SO de 32 bits.

Romil Kumar Jain
fonte
1
Obrigado pela sua resposta, no entanto, estou usando o VS2015 no Windows 10 e o X64. Quando alterei a configuração do projeto de AnyCPU para X86, o problema desapareceu. Não precisei instalar nenhum driver adicional.
precisa saber é o seguinte
@NoChance Acho que você já instalou o Office 64 bits na sua máquina e já contém os drivers Microsoft.ACE.OLEDB.12.0.
Romil Kumar Jain
Obrigado pela sua resposta, tenho apenas o Office 2007.
NoChance
19

Tenho a mesma mensagem, tenho uma página da Web no visual studio 2010, leio um arquivo.xls nessa página, no meu projeto visual não tem nenhum problema, quando o coloco no meu local do IIS, lança-me um 'Microsoft .Jet.OLEDB.4.0 'provedor não está registrado na máquina local' , corrigi esse problema na próxima etapa, seguindo estas etapas,

1.-Abra o IIS
2.-Altere o appPool em Configurações avançadas
3.-true para ativar o aplicativo de 32 bits.

e isso é tudo

ps.I alterei o Configuration Manager para X86 na Active Solution Platform

leo
fonte
Isso força seu aplicativo a ser executado no modo de 32 bits. Você precisa dessa configuração se quiser evitar a barreira de 4 GB.
Brain2000
18

Se seu aplicativo for executado no localIIS, você poderá resolver esse problema ativando aplicativos de 32 bits nas Configurações avançadas do AppPool

insira a descrição da imagem aqui

Mumin Ka
fonte
8

Eu tive o mesmo problema. Mudei a configuração do aplicativo para x86, então funcionou!

Kakopappa
fonte
como mudar esta configuração? Eu criei projeto tipo website
SHEKHAR Shete
7

Acabei de alterar minha propriedade do projeto para o formato x64

Projeto ---> Propriedades ---> Construção ---> Target Framework ---> X64

Muhamed Shafeeq
fonte
5

Nós encontramos esse problema no aplicativo de desktop.

Ambiente de desenvolvimento: Windows 7 Ultimate - Provedor de .NET Framework 4.5 de 64 bits = Microsoft.Jet.OLEDB.4.0

Foi resolvido alterando o destino da plataforma para X86 de qualquer CPU. Propriedades do projeto >> Compilar >> Destino da plataforma.

insira a descrição da imagem aqui

Techvalens
fonte
2

Eu deparei com esse problema com meu aplicativo da área de trabalho (o provedor 'Microsoft.Jet.OLEDB.4.0' não está registrado na máquina local). Não tive a opção de criar como um aplicativo de 32 bits. Esperando que isso ajude outros na mesma situação.

Fiz o seguinte e o problema foi resolvido:

  1. Instalou a versão de 64 bits do Microsoft Access Database Engine 2010 redistribuível , conforme sugerido por neo

  2. Alterei meu provedor para Microsoft.ACE.OLEDB.12.0

robinhood9
fonte
2

Embora uma solução mais ideal seja recompilar simplesmente como sugerido acima, isso requer acesso ao código-fonte. No meu caso, eu só tinha o .exe finalizado e tive que usar esta solução. Ele usa a CorFlags.exepartir do .Net SDK para alterar as características de carregamento do aplicativo.

  1. Faça o download do .Net Framework SDK (usei pessoalmente o 3.5 , mas a versão usada deve ser igual ou superior ao .Net necessário para o seu aplicativo.
  2. Ao instalar, tudo que você precisa é CorLibs.exe, então verifique as Ferramentas de Desenvolvimento do Windows .
  3. Após a instalação, encontre o seu CorFlags.exe. Para minha instalação do .Net Framework 3.5 SDK, estava em C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin.
  4. Abra um prompt de comando e digite path/to/CorFlags.exe path/to/your/exeFile.exe /32Bit+.

Você Terminou! Isso define os sinalizadores iniciais do seu programa para que ele inicie no modo WOW64 de 32 bits e, portanto, possa acessar o microsoft.jet.oledb.4.0.

Cullub
fonte
1

Altere as configurações avançadas do pool de aplicativos Configurações do IIS.

dpsrikanth
fonte
1

Basta alterar a propriedade com base na sua máquina e todos fizeram :-)

Projeto ---> Propriedades ---> Construção ---> Target Framework ---> X64

ou

Projeto ---> Propriedades ---> Compilação ---> Target Framework ---> X86

Ajmal
fonte
1

Mudei minha cadeia de conexão de

var myConnectionString = string.Format ("Provedor = Microsoft.Jet.OLEDB.4.0; Fonte de dados = {0}; Persistir informações de segurança = True; Jet OLEDB: Senha do banco de dados =;", gisdbPath);

para isso:

var myConnectionString = string.Format ("Provedor = Microsoft.Jet.OLEDB.4.0; Mode = compartilhamento negar nenhum; Fonte de dados = {0}; ID do usuário = Admin; senha =;", gisdbPath);

Funciona para mim nunca solicitou o registro do Microsoft.Jet.OLEDB.4.0 '.

Dilhan RK
fonte
0

De fato, não existe uma versão de 64 bits do Jet - e nenhum plano (aparentemente) para produzir uma.

Você pode usar o driver do ACE de 64 bits: http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=23734

  • mas não tenho ideia de como isso funcionaria se você precisar voltar ao Jet para seus aplicativos de 32 bits.

No entanto, você pode mudar o projeto para 32 bits na versão Express (não tentei e não tenho mais o 2008 instalado)

Talvez seja hora de descartar completamente os bancos de dados do Access, morder a bala e optar pelo SQL Server?

Anant Dabhi
fonte
0

Nas versões mais antigas do IIS, você não encontrará Advance Settingsisso para permitir que Enable 32-bit Applicationsvocê execute os seguintes comandos:

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

e

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

Referência: Aqui

Usman Khalid
fonte
0

Eu estava recebendo a mesma exceção ao executar o "SQL Server 2014 Import and Export Data (64 bits)" no meu Windows 8.1.

Para corrigir o problema, fiz o seguinte

iniciou o SQL Server 2014 Import and Export Data (32 bits) em vez de 64 bits e está funcionando para mim. Não alterei nenhuma configuração do IIS e não instalei nenhum software extra.

Banketeshvar Narayan
fonte
0

Sei que tenho esse problema repetidamente quando implanto meu aplicativo em um novo servidor porque estou usando esse driver para conectar-me a um arquivo do Excel. Então aqui está o que estou fazendo ultimamente.

Há um Windows Server 2008 R2, eu instalo os drivers do Access para uma máquina de x64 bits e me livrei dessa mensagem, o que me deixa muito feliz em encontrar outra.

Este aqui abaixo funciona esplendidamente na minha máquina de desenvolvimento, mas no servidor me dá um erro mesmo após a instalação dos drivers ODBC mais recentes, que eu acho que esse é o problema, mas foi assim que resolvi.

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

Eu substituo pelo novo provedor como este abaixo:

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

Mas enquanto faço isso, há uma coisa que você deve notar. O uso da extensão de arquivo .xlsx e a versão do Excel é 12.0.

Depois de entrar nessa mensagem de erro Erro: "Não foi possível encontrar o ISAM instalável" , decido alterar as coisas um pouco como abaixo:

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

e sim, eu terminei com essa coisa desagradável, mas aqui recebi outra mensagem O mecanismo de banco de dados do Microsoft Access não pode abrir ou gravar no arquivo 'time_zone'. Ele já foi aberto exclusivamente por outro usuário ou você precisa de permissão para visualizar e gravar seus dados. o que me diz que não estou longe de resolvê-lo.

Talvez exista outro processo que abriu o arquivo e tudo o que preciso fazer é reiniciar e tudo começará a funcionar normalmente, conforme o esperado.

usuario
fonte
0

vá para Iniciar-> Executar e digite cmd isto inicia o prompt de comando (também disponível em Iniciar-> Programas-> Acessórios-> Prompt de comando)

digite cd .. e pressione Enter digite cd .. e pressione Enter novamente (continue fazendo isso até que o prompt mostre:>)

agora você precisa ir para uma pasta especial que pode ser c: \ windows \ system32 ou pode ser c: \ winnt \ system32 ou pode ser c: \ windows \ sysWOW64 tente digitar cada uma delas, por exemplo, cd c: \ windows \ sysWOW64 (se o sistema não encontrar o caminho especificado, tente o próximo) cd c: \ windows \ system32 cd c: \ winnt \ system32 quando um deles não causar erro, pare, você encontrou o pasta correta.

agora você precisa registrar as DLLs do OLE DB 4.0 digitando esses comandos e pressionando return após cada

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

user1089766
fonte
-2

Não há um provedor de 64 bits para o Jet. Se você deseja oferecer suporte a várias fontes de banco de dados, incluindo o Jet to Excel, precisará de pelo menos essa parte do seu aplicativo para executar em um processo de 32 bits.

O erro que você está recebendo ao compilar para x86 é um pouco estranho. Não vejo como você acabaria referenciando assemblies de 64 bits nesse caso.

AnthonyWJones
fonte
Anthony, Como posso fazer apenas parte de um projeto para executar no modo 32 bits? Todas essas conexões com o banco de dados, incluindo o Excel, serão incluídas em um projeto. Também recebi o erro no x86, quando tento executá-lo no sistema operacional de 64 bits. Acho que isso ocorre porque o driver do DB2 instalado no sistema operacional de 64 bits é uma versão de 64 bits e, quando é referenciado pelo aplicativo, configurado para ser executado no modo de 32 bits, causa o erro.
neo
Se dividir o projeto em vários exes for mais complicado do que vale a pena, você terá apenas a compilação de 32 bits. Quanto ao problema do DB2, você deve procurar alguns especialistas em DB2 sobre essa questão, talvez outra questão específica do DB2. Normalmente, coisas como o SQL Server instalam provedores de 32 e 64 bits em uma máquina de 64 bits.
AnthonyWJones
Obrigado Anthony pelos seus comentários. Ao fazer muita pesquisa sobre esse assunto e a partir dos seus comentários, o que entendi é que tenho que criar a parte do projeto que processa a planilha do excel como um projeto separado e compila na versão de 32 bits.
neo
3
Para que as pessoas saibam, o A2010 terá o Jet de 64 bits.
David-W-Fenton
Graças David de 2010 tem um driver de 64 bits
neo