Datenbankzugriffe mit der Powershell

Leider bringt Powershell keine einfachen Cmdlets für den Zugriff auf Datenbanken mit. Die einzige Möglichkeit ist über ADO.NET zuzugreifen.

Vorbereitung

Je nach installierten Datenbankprovider gibt es verschiedene Möglichkeiten die unterschiedlichen Datenbanken (Access,MS-SQL,MY-SQL,Oracle,ODBC, etc…) zuzugreifen. Welche Provider überhaupt auf dem Computer registriert (z.B. Access installiert) sind können Sie mit:

[System.Data.Common.DBProviderFactories]::GetFactoryClasses() | select InvariantName

heraus finden. Falls Sie auf einen Microsoft SQL Server zugreifen möchten können Sie diese mittels:

[System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources()

auflisten lassen.

Access Datenbank anlegen bzw. erstellen

Eine neue Datenbankdatei in Access legt man wie folgt an:

$application = New-Object -ComObject Access.Application
$application.NewCurrentDataBase("C:\Pfad\Datei.mdb",10)
$application.CloseCurrentDataBase()
$application.Quit()

Tabelle in Access Datenbank anlegen bzw. erstellen

$connection = New-Object -ComObject ADODB.Connection
$connection.Open("Provider= Microsoft.Jet.OLEDB.4.0;Data Source=C:\Pfad\Datei.mdb" )
$Fields = "NamederSpalte1 Counter, NamederSpalte2 Date, NamederSpalte3 Integer, NamederSpalte4 Text"
$command = "Create Table GewünschterNamederTabelle `($Fields`)"
$connection.Execute($command)
$connection.Close()

Die fett gedruckten Passagen geben wieder Ihre persönlichen Anpassungen an.

1. Den Pfad zur Access Datenbankdatei

2. Die Spalten bzw. Felder die angelegt werden sollen. Erst den Namen der jeweiligen Spalte und danach gefolgt der Datentyp (Counter=Zähler, Date=Datum, Integer=Zahl, Text=Text) für die Spalte.

3. Name der Tabelle

Verbindungsaufbau und Tabelle auswählen

So stellen Sie eine Verbindung mit einer Datenbank her und öffnen eine Tabelle:

# Angaben zur Verbindung mit der Datenbank
$Verbindung="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Pfad zu Ihrer Datenbank\Datei.mdb;"
$SQL="Select * from tabelle order by Vorname"
# Tabelle aus der Datenbank in Variable ablegen
$DB=New-Object System.Data.OleDB.OleDbConnection($Verbindung)
# Öffnen der Tabelle
$DB.open()
"Tabelle: "+$DB.State
# Schließen der Tabelle
$DB.close()
"Tabelle: "+$DB.State
Dies ist ein Beispiel für den Zugriff auf eine Access-Datenbank. Die unterstrichenen Abschnitte müssen Sie entsprechend anpassen. Das order by Vorname können Sie auch komplett weg lassen. Dies dient lediglich zur Sortierung nach der Spalte Vorname. Möchten Sie eine statische Verbindung zu einer MS-SQL Datenbank herstellen, müssen die Fett dargestellten Bereiche wie folgt abgeändert werden:

$Verbindung=“Data Source=.\RelativePositionderDatenbankbzwderenName;Initialcatalog=Users;Integrated Security=True;“

$DB=New-Object System.Data.SqlClient.SqlConnection($Verbindung)

Möchten Sie eine dynamische Verbindung zu einer MS-SQL Datenbank herstellen, müssen die Fett dargestellten Bereiche wie folgt abgeändert werden:

$Verbindung="Data Source=.\RelativePositionderDatenbankbzwderenName;AttachDbFileName=C:\Pfad\Datenbank.mdf;Integrated Security=True;"
$DB=New-Object System.Data.SqlClient.SqlConnection($Verbindung)     # wie bei der statischen Verbindung
Daten aus einer Tabelle auslesen

Das folgende Script zeigt die Möglichkeit Daten aus der Datenbank auszulesen. Die fett markierten Stellen sind die dokumentierten Änderungen zum vorangegangenen Script.

# Angaben zur Verbindung mit der Datenbank
$Verbindung="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db\test.mdb;"
$SQL="Select * from Services order by Zeit"
# Tabelle aus Datenbank in Variable ablegen
$DB=New-Object System.Data.OleDb.OleDbConnection($Verbindung)
# Öffnen der Tabelle aus der Datenbank
$DB.open()
"Tabelle: "+$DB.State
$Kommando=New-Object System.Data.OleDb.OleDbCommand($SQL,$Verbindung) # Erstellt ein Object für das SQL-Kommando
$Datenadapter=New-Object System.Data.OleDb.OleDbDataAdapter($Kommando)    # Wendet das SQL-Kommando auf die Datenbank an
$Dataset=New-Object System.Data.Dataset            # Erstellt eine Object um die Daten aufzunehmen
[Void] $Datenadapter.Fill($Dataset,"Services")   # Holt sich die Daten ab
# Schließen der Datenbankverbindung
$DB.close()
"Tabelle: "+$DB.State
$Dataset.Tables[0] | ft          # Gibt die Daten als Tabelle formatiert auf dem Bildschirm aus
Daten in eine Tabelle schreiben
$strDB="C:\Pfad\Datei.mdb"
$strTable="Tabellenname"
$objCon=New-Object -comobject ADODB.Connection
$objRecordSet=New-Object -comobject ADODB.Recordset
$objCon.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = $strDB")
$objRecordSet.Open("SELECT * FROM Services",$objCon)
$objRecordSet.Addnew()
$objRecordSet.Fields.item("Spalte1")="Inhalt"
$objRecordSet.Fields.item("Spalte2")="Inhalt"
# usw. - je nachdem wie viele Spalten Ihre Tabelle enthält
$objRecordSet.Update()
$objRecordSet.close()
$objCon.close()
Auch hier sind die von Ihnen anzupassenden Stellen wieder fett markiert.

Datensatz aus einer Tabelle löschen

Mit dem SQL-Kommando werden die zu löschenden Datensätze ausgewählt und anschließend durch die delete Methode gelöscht.

# Datenbankverbindung herstellen
$strDB="C:\db\Services.mdb"
$strTable="Services"
$objCon=New-Object -comobject ADODB.Connection
$objRecordSet=New-Object -comobject ADODB.Recordset
$objCon.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = $strDB")
# Durch den SQL-Befehl werden die zu löschenden Datensätze ausgewählt
$objRecordSet.Open("SELECT * FROM Services WHERE Dienstname='Appinfo'",$objCon,3,3)
# und dann darauf die Delete-Methode angewendet
$objRecordSet.delete()
# Datenbankverbindung lösen
$objRecordSet.close()
$objCon.close()
write-host
write-host "Datensatz gelöscht!"

Kommentare

6 Antworten zu „Datenbankzugriffe mit der Powershell“

  1. Hallo Martin,

    Ich versuche die ‚Data Source‘ und den ‚Initial Catalog‘ einer multidimensionalen Datenbank mit der PoSH auszulesen, aber das scheint etwas schwierig zu sein. Hättest Du vielleicht einen Tip wie man das anfangen könnte? Vielleicht auch über AMO?

    Vielen Dank,

    Reiner

    1. Hallo Reiner,

      ich bin leider absolut kein Datenbankspezialist. Ich kann zwar einen SQL installieren, vielleicht auch mal eine DB oder eine Tabelle (ich kenne immerhin schon mal den Unterschied zwischen einer DB und einer Tabelle 😉 anlegen, aber das war es auch schon. Da man immer mal wieder mit Datenbanken in Berührung kommt und mich auch in Powershell genervt hat nicht darauf zugreifen zu können, habe ich hier mal 1-2 Scripte zusammen gezimmert. Wie das allerdings genau funzt, müsste Dir ein SQL-Spezialist sagen können. Vielleicht liest das hier mal so einer und schreibt eine Lösung dazu (dazu ist nicht einmal eine Benutzerregistrierung erforderlich!). Wenn Du selbst eine findest, wäre es auch prima, wenn Du Sie hier für andere mit demselben Problem postest.

      1. Danke. Die Skripte sind wirklich hilfreich. 🙂

      2. P.S. Nur zur Info.

        Anscheinend generiert WordPress die falschen Links zu Postings. Hier der Link der bei mir in der E-Mail war.

        http://www.martinlehmann.de/wp/datenbankzugriffe-mit-der-powershell/

        1. Vielen Dank für den Hinweis, doch leider kann ich (noch!) keine Einstellungen im WordPress finden mit denen ich das Problem behebe. Mal schauen ob es Update gibt, oder ich schneller ein Schräubchen finde, an dem ich drehen kann, um das Problem abzustellen.

  2. Bin eben durch Zufall auf den Blog gekommen. Gefaellt mir bis jetzt sehr.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert