Datenzugriffe über ADO.Net - Access Spezial

Einleitung

1.1 Beispieldaten (Nordwind)

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

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.

 

 

1.2 fehlende Provider / Installation und Registrierung von Providern

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:

  1. 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. 
     
  2. Angleichung der Architektur von Betriebssystem und Office (32-bit/32-bit oder 64-bit/64-bit)
     
  3. Unter 64-bit Betriebssystem mit 64-bit Office bevorzugt den Connectionstring "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DatabaseName;"
     
  4. 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

 
1.3 Einführungsbeispiele

 

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. 

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(
)

 
2 Connectionstrings für x32 und x64 Architekturen

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 - ADOX