Für alle, die immer noch davon betroffen sind.
Ich habe den Fehler bekommen...
OLEDB-Fehler "Der 'Microsoft.ACE.OLEDB.12.0'-Anbieter ist auf dem lokalen Rechner nicht registriert."
...wie vom OP, Shailesh Sahu, beschrieben.
Ich habe 64-Bit Windows 7.
Mein Problem liegt in PowerShell-Skripten, aber es wird eine Verbindungszeichenfolge verwendet, ähnlich wie im Beitrag des OP, daher sollten meine Ergebnisse auf C#, PowerShell und jeder anderen Sprache angewendet werden können, die auf dem "Microsoft.ACE.OLEDB"-Treiber basiert.
Ich habe die Anweisungen in diesem MS-Forumsthread befolgt: http://goo.gl/h73RmI
Zuerst habe ich versucht, die 64-Bit-Version zu installieren, dann die 32-Bit-Version der AccessDatabaseEngine.exe von dieser Seite http://www.microsoft.com/en-us/download/details.aspx?id=13255
Aber leider kein Erfolg.
Dann habe ich den folgenden Code in PowerShell ausgeführt (von SQL Panda's Webseite http://goo.gl/A3Hu96)
(New-Object system.data.oledb.oledbenumerator).GetElements() | select SOURCES_NAME, SOURCES_DESCRIPTION
...was zu diesem Ergebnis führte (andere Datenquellen wurden der Kürze halber entfernt)...
SOURCES_NAME SOURCES_DESCRIPTION
------------ -------------------
Microsoft.ACE.OLEDB.15.0 Microsoft Office 15.0 Access Database Engine OLE DB Provider
Wie du sehen kannst, habe ich Microsoft.ACE.OLEDB.15.0 (fünfzehn) und nicht Microsoft.ACE.OLEDB.12.0 (zwölf)
Also habe ich meine Verbindungszeichenfolge auf 15 geändert und es hat funktioniert.
Ein schneller PowerShell-Abschnitt, um zu zeigen, wie man die Version flexibel codieren kann...
$AceVersion = ((New-Object System.Data.OleDb.OleDbEnumerator).GetElements() | Where-Object { $_.SOURCES_NAME -like "Microsoft.ACE.OLEDB*" } | Sort-Object SOURCES_NAME -Descending | Select-Object -First 1 SOURCES_NAME).SOURCES_NAME
$connString = "Provider=$AceVersion;Data Source=`"$filepath`";Extended Properties=`"Excel 12.0 Xml;HDR=NO`";"
angepasst, um die neueste ACE-Version auszuwählen, falls mehr als eine vorhanden ist
Hoffentlich kann nun jeder, der dies findet, überprüfen, welche OLEDB-Version installiert ist, und die entsprechende Versionsnummer verwenden.
13 Stimmen
Nur ein nebenbei bemerkter Kommentar: die Verwendung von OLEDB zum Lesen einer Excel-Datei ist alte Technik, sehr langsam und erfordert, wie Sie entdeckt haben, die manuelle Installation von zusätzlichen Paketen auf Ihrer Zielmaschine. (Zugegeben, die Frage wurde 2011 gestellt.) Verwenden Sie stattdessen ClosedXml (verfügbar auf NuGet), das sofort einsatzbereit ist.
7 Stimmen
@ShaulBehr Es wäre schön gewesen, aber ClosedXml funktioniert nur für .xlsx-Dateien, nicht für .xls.
7 Stimmen
Wenn Sie in Sql Server importieren, können Sie diese Abfrage von SSMS ausführen:
execute master.dbo.xp_enum_oledb_providers
Es wird Ihnen mitteilen, welche Anbieter es glaubt, dass Sie haben. Es hat mir gesagt, dass ich sowohl Microsoft.ACE.OLEDB.16.0 als auch Microsoft.ACE.OLEDB.12.0 habe, aber als ich versuchte, Daten zu importieren, bekam ich die gleiche 'nicht auf Ihrem lokalen Rechner registriert'-Fehlermeldung wie der OP, für beide Excel 16 und Excel 2007 Dateiformate (OlEDB.16.0 und OlEDB.12.0 jeweils). Es macht Sinn, an diesem Punkt Ihre Verluste zu begrenzen und sich von der Microsoft-Software zu verabschieden.1 Stimmen
Siehe auch diese Antwort stackoverflow.com/a/14401857/21579 für den Unterschied zwischen Microsoft.Jet.OleDb und Microsoft.Ace.OleDb.
4 Stimmen
@user1040323,
execute master.dbo.xp_enum_oledb_providers
sagt Ihnen, was auf dem Server ist, nicht auf Ihrer lokalen Maschine.6 Stimmen
Hier der, der funktionieren sollte; - Es ist: Nicht wirklich dokumentiert, aber ich habe einen Weg gefunden, um sowohl die 32-Bit- als auch die 64-Bit-Versionen zu installieren. Fügen Sie einfach das Kommandozeilenargument "/passive" zum Befehl hinzu: "C:\Verzeichnispfad\AccessDatabaseEngine_x64.exe" /passive