1.2 fehlende Provider / Installation und Registrierung von Providern
Beispiel 1: "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DatabaseName;"
Beispiel 2: "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = $DatabaseName"
1.3 Einführungsbeispiele
Beispiel 1: Daten aus einer AccessDatebank auslesen (DataSet)
Beispiel2: Daten in eine AccessTabelle schreiben
2 Connectionstrings für x32 und x64 Architekturen
Beispiel 1: "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DatabaseName;"
Beispiel 2: "Provider = Microsoft.Jet.OLEDB.4.0;..."
3ADOX
4Hilfreiche Links
1 Einleitung
Microsoft Access finde ich ein ziemlich geniales Programm, um einfach strukturierte Daten übersichtlich aufbereiten zu können.
In der Systemadministration fallen häufig größere Mengen an Daten an, für deren Aufbereitung Excel schon überfordert, aber ein SQLServer noch nicht notwendig ist.
Beispiele sind die Analyse von Eventlogdateien, oder laufende Performancemessungen.
Sollen beispielsweise die Einträge der Securitylogs aus mehreren Domaincontrollern analysiert werden, so kommen schnell einige hundertausend Events in einer Tabelle zusammen.
1.1 Beispieldaten (Nordwinddatenbank)
Access bringt die recht umfangreiche Beispieldatenbank namens Nordwind mit, die man online installieren kann: Unter Access 2013 gebt ihr dafür bitte bei "Search for Online Templates" einfach "Northwind" bzw. je nach Sprachversion "Nordwind" ein und erstellt anschließend die Datenbank unter einem beliebigen Pfad.
Bei der Verwendung von ADO.NET Skripten kommt es immer wieder zu Fehlermeldungen, dass der "...Provider ist nicht auf dem lokalen Computer registriert" sei.
Ausnahme beim Aufrufen von "Open" mit 0 Argument(en): "Der 'Microsoft.ACE.OLEDB.12.0'-Provider ist nicht auf dem lokalen Computer registriert." Bei Zeile:19 Zeichen:19 + $XLConnection.Open <<<< () + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException ..... |
Dies hat entweder damit zu tun, dass man einen Provider verwenden möchte, der für das verwendete Betriebssystem bzw. für die Betriebssystemarchitektur (32-bit/ 64-bit) nicht verfügbar ist, oder der im Skript verwendete Provider tatsächlich noch nicht registriert ist.
Lösungsmöglichkeiten:
-
Installation des Providers “Microsoft.ACE.OLEDB.12.0”
Microsoft Access Database Engine 2010 Redistributable (empfehlenswert, wenn kein Office 2010 installiert ist!). Damit könnt ihr dann auch auf Access oder Excel zugreifen, selbst wenn kein Office auf dem Client installiert ist.
-
Angleichung der Architektur von Betriebssystem und Office (32-bit/32-bit oder 64-bit/64-bit)
-
Unter 64-bit Betriebssystem mit 64-bit Office bevorzugt den Connectionstring "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DatabaseName;"
- Habt ihr unter einem 64-bit Betriebssystem eine 32-bit Office installiert, verwendet bevorzugt den Connectionstring "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DatabaseName;", nachdem ihr den ACE-Provider installiert habt (Siehe Punkt 1.). Ohne den ACE-Provider könnt ihr nur den $ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = $DatabaseName". Ihr müsst in beiden Fällen aber die 32-bit Version der Powershell nutzen:
Hier noch zwei einfache Beispiele, an denen ihr Erkennen könnt, ob der passenden Provider vorhanden ist.
Beispiel 1: "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DatabaseName;"
$DatabaseName = "c:\temp\Nordwind.mdb" $Query = "SELECT Firma FROM Kunden" $ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DatabaseName;" # Connection Object erstellen $Connection = New-Object System.Data.OleDb.OleDbConnection $ConnectionString $Command = New-Object System.Data.OleDb.OleDbCommand $Query,$Connection $Connection.Open() #Daten zuerst in den Adapter laden, danach ins Dataset schreiben $Adapter = New-Object System.Data.OleDb.OleDbDataAdapter $Command $Dataset = New-Object System.Data.DataSet [void] $Adapter.Fill($DataSet) $Connection.Close() #Daten schreiben $DataSet.Tables | Select-Object -Expand Rows |
#mögliche Ausgabe, wenn der 12.0-Provider nicht installiert ist Ausnahme beim Aufrufen von "Open" mit 0 Argument(en): "Der 'Microsoft.ACE.OLEDB.12.0'-Provider ist nicht auf dem lokalen Computer registriert." Bei Zeile:6 Zeichen:17 + $Connection.Open <<<< () + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException |
Viele Beispiele im Internet benutzen als Connectionstring "Provider = Microsoft.Jet.OLEDB.4.0;..."
wie auch Hey, Scripting Guy! Can I Query a Microsoft Access Database with a Windows PowerShell Script?
Beispiel 2: "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = $DatabaseName"
$DatabaseName = "c:\temp\Nordwind.mdb" $Query = "SELECT Firma FROM Kunden" $ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = $DatabaseName" # Connection Object erstellen $Connection = New-Object System.Data.OleDb.OleDbConnection $ConnectionString $Command = New-Object System.Data.OleDb.OleDbCommand $Query,$Connection $Connection.Open() #Daten zuerst in den Adapter laden, danach ins Dataset schreiben $Adapter = New-Object System.Data.OleDb.OleDbDataAdapter $Command $Dataset = New-Object System.Data.DataSet [void] $Adapter.Fill($DataSet) $Connection.Close() #Daten schreiben $DataSet.Tables | Select-Object -Expand Rows |
#Ausgabe, wenn der 4.0-Provider nicht installiert ist Ausnahme beim Aufrufen von "Open" mit 0 Argument(en): "Der 'Microsoft.Jet.OLEDB.4.0'-Provider ist nicht auf dem lokalen Computer registriert." Bei Zeile:9 Zeichen:17 + $Connection.Open <<<< () + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException |
Beispiel 1: Daten aus einer AccessDatebank auslesen (DataSet)
$DatabaseName = "c:\temp\Northwind.mdb" $Query = "SELECT Top 4 Firma FROM Kunden" $ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\nordwind.mdb;" #Connection Object erstellen $Connection = New-Object System.Data.OleDb.OleDbConnection $ConnectionString $Command = New-Object System.Data.OleDb.OleDbCommand $Query,$Connection $Connection.Open() #Daten zuerst in den Adapter laden, danach ins Dataset schreiben $Adapter = New-Object System.Data.OleDb.OleDbDataAdapter $Command $Dataset = New-Object System.Data.DataSet [void] $Adapter.Fill($DataSet) $Connection.Close() #Daten schreiben $DataSet.Tables | Select-Object -Expand Rows |
#Ausgabe gekürzt Firma ----- Alfreds Futterkiste Ana Trujillo Emparedados y helados Antonio Moreno Taquería Around the Horn |
Dieses Beispiel funktioniert so nur mit einem Office unter 64-bit. Wenn ihr 32-Bit Office verwendet, muss die Zeile
$dsn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\nordwind.mdb;"
angepasst werden.
- http://www.connectionstrings.com/Articles/Show/using-jet-in-64-bit-environments
- http://www.microsoft.com/en-us/download/details.aspx?id=13255
Sollten Meldungen erscheinen, dass der Provider auf dem System nicht installiert ist, so kontrolliert eure OfficeVersion, ob diese tatsächlich unter 64-bit läuft
Beispiel 2: Daten in eine AccessTabelle schreiben
$adOpenStatic = 3 $adLockOptimistic = 3 $Connection = New-Object -com "ADODB.Connection" $RecordSet = New-Object -com "ADODB.Recordset" $Connection.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\Database1.accdb;") $RecordSet.Open("Select * From Table1", $Connection,$adOpenStatic,$adLockOptimistic) $RecordSet.AddNew() $RecordSet.Fields.Item("ComputerName").Value = "Dom1Cli01" $RecordSet.Fields.Item("IPAddress").Value = "192.168.178.10" $RecordSet.Update() $RecordSet.Close() $Connection.Close() |
Liefern die folgende Beispiele Fehlermeldungen zurück, so liegt dies an der unterschiedlichen Verfügbarkeit der von den verschieden 32 und 64-bit Officeversionen benötigten Provider auf 32 und 64-Bit Betriebssystemen
Beispiel 1: "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DatabaseName;"
$DatabaseName = "c:\temp\Nordwind.mdb" $Query = "SELECT Firma FROM Kunden" $ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DatabaseName;" #Connection Object erstellen $Connection = New-Object System.Data.OleDb.OleDbConnection $ConnectionString $Command = New-Object System.Data.OleDb.OleDbCommand $Query,$Connection $Connection.Open() #Daten zuerst in den Adapter laden, danach ins Dataset schreiben $Adapter = New-Object System.Data.OleDb.OleDbDataAdapter $Command $Dataset = New-Object System.Data.DataSet [void] $Adapter.Fill($DataSet) $Connection.Close() #Daten schreiben $DataSet.Tables | Select-Object -Expand Rows |
#mögliche Ausgabe Ausnahme beim Aufrufen von "Open" mit 0 Argument(en): "Der 'Microsoft.ACE.OLEDB.12.0'-Provider ist nicht auf dem lokalen Computer registriert." Bei Zeile:6 Zeichen:17 + $Connection.Open <<<< () + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException |
Viele Beispiele im Internet benutzen als Connectionstring "Provider = Microsoft.Jet.OLEDB.4.0;..."
wie auch Hey, Scripting Guy! Can I Query a Microsoft Access Database with a Windows PowerShell Script?
Beispiel 2: "Provider = Microsoft.Jet.OLEDB.4.0;..."
$DatabaseName = "c:\temp\Nordwind.mdb" $Query = "SELECT Firma FROM Kunden" $ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = $DatabaseName" #Connection Object erstellen $Connection = New-Object System.Data.OleDb.OleDbConnection $ConnectionString $Command = New-Object System.Data.OleDb.OleDbCommand $Query,$Connection $Connection.Open() #Daten zuerst in den Adapter laden, danach ins Dataset schreiben $Adapter = New-Object System.Data.OleDb.OleDbDataAdapter $Command $Dataset = New-Object System.Data.DataSet [void] $Adapter.Fill($DataSet) $Connection.Close() #Daten schreiben $DataSet.Tables | Select-Object -Expand Rows |
#Ausgabe Ausnahme beim Aufrufen von "Open" mit 0 Argument(en): "Der 'Microsoft.Jet.OLEDB.4.0'-Provider ist nicht auf dem lokalen Computer registriert." Bei Zeile:9 Zeichen:17 + $Connection.Open <<<< () + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException |
Diese Meldungen treten wiegesagt auf, wenn ihr auf einem 64-bit Betriebssystem eine 32-bit Version von Access installiert habt.
3 ADOX
Wollt ihr die Datenbank ansich per Skript administrieren, ist die ADOX-Schnittstelle geeignet. Ein paar Beispiele dazu gibt es im Kapitel: Access - ADOXWorking with Access Databases in Windows PowerShell
http://technet.microsoft.com/en-us/magazine/2009.05.scriptingguys.aspx
How Can I Create a Database with More Than One Table?
How Can I Use Windows PowerShell to Pull Records From a Microsoft Access Database?
Can I Query a Microsoft Access Database with a Windows PowerShell Script?
How Can I Add a Record to a Database Using Windows PowerShell?
2007 Office System Driver: Data Connectivity Components
Scripting Guys: Working with Access Databases in Windows PowerShell