Benutzer mit den meisten Antworten
SQL Abfrage bzw. Resultset mit Powershell abarbeiten

Frage
-
Hallo an alle,
ich versuche mich gerade an PowerShell.
$Datenquelle = "SQL-test" $Datenbank = "TESTDB" $Verbindungsstring = "Server = $Datenquelle; Database=$Datenbank; Integrated Security=true;" $Verbindung = New-Object System.Data.SqlClient.SqlConnection $Verbindung.ConnectionString = $Verbindungsstring $Verbindung.Open() $Query = "SELECT Nr ,Name ,Vorname ,Titel ,Anrede FROM [TEST].[dbo].[Mitarbeiter] WHERE Name = 'Müller' or Name = 'Lehmann'" $Befehl = $Verbindung.CreateCommand() $Befehl.CommandText = $Query $Resultat = $Befehl.ExecuteReader() while ($Resultat.read()){ Write-Host $Tabelle.Name }
Soweit klappt auch alles. Jedoch möchte ich für die weiteren Schritte stets Zeile für Zeile der SQL-Abfrage durcharbeiten. Eigentlich mache ich dies mit Arrays, aber es gelingt mir nicht die Daten in ein Array zu laden.
Vielleicht kann jemand bei dem Array Problem helfen?
Wissenstechnisch hätte ich aber auch gern gewusst wie die das komplette Resultset der SQL Abfrage Zeilenweise durchlaufen kann.
Aktuell erhalte ich für 4 Zeilen im 4 Namen in 4 Zeilen.
Ergebnis:
Müller Müller Lehmann Lehmann
Müller Müller Lehmann Lehmann
Müller Müller Lehmann Lehmann
Müller Müller Lehmann Lehmann
Gewünscht wäre:
Müller
Müller
Lehmann
Lehmann
Antworten
-
Moin,
folgendes funktioniert hier ganz gut, mit der Maßgabe, dass die Tabelle in großen Teilen in den RAM geladen wird:
$conn = New-Object System.Data.SqlClient.SqlConnection($connectionString) $conn.Open() $cmd = $conn.CreateCommand() $cmd.CommandText = "SELECT A,B,C FROM T WHERE D=1" $res = $cmd.ExecuteReader() if ($res.HasRows) { $tbl = New-Object System.Data.DataTable $tbl.Load($res) foreach ($row in $tbl.Rows) { "$($row['A']) $($row['B']) $($row['C'])" } $tbl.Close() } $res.Close() $res.Dispose()
Evgenij Smirnov
- Bearbeitet Evgenij Smirnov Montag, 20. Mai 2019 10:23
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 27. Mai 2019 09:15
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 29. Mai 2019 19:31
-
Man kann sich die Tabelle sparen, da der Reader die Abfrage der Werte einer Zeile direkt zulässt.
Hier sind die Methode beschrieben:
https://docs.microsoft.com/de-de/dotnet/api/system.data.common.dbdatareader?view=netframework-4.8#methodenMittels GetValues(Array) kannst du alle Werte auf einmal laden, allerdings musst du vorher ein Array in der Anzahl Elemente erstellen.
$v = new-object object[] $Resultat.FieldCount
$count = $Resultat.GetValues($v)Beachte die Sonderbehandlung von NULL-Values (auch bei der obigen Tabelle):
Der Inhalt einer Spalte ist dann[System.DBNull]::Value
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 27. Mai 2019 09:13
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 29. Mai 2019 19:31
Alle Antworten
-
Moin,
folgendes funktioniert hier ganz gut, mit der Maßgabe, dass die Tabelle in großen Teilen in den RAM geladen wird:
$conn = New-Object System.Data.SqlClient.SqlConnection($connectionString) $conn.Open() $cmd = $conn.CreateCommand() $cmd.CommandText = "SELECT A,B,C FROM T WHERE D=1" $res = $cmd.ExecuteReader() if ($res.HasRows) { $tbl = New-Object System.Data.DataTable $tbl.Load($res) foreach ($row in $tbl.Rows) { "$($row['A']) $($row['B']) $($row['C'])" } $tbl.Close() } $res.Close() $res.Dispose()
Evgenij Smirnov
- Bearbeitet Evgenij Smirnov Montag, 20. Mai 2019 10:23
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 27. Mai 2019 09:15
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 29. Mai 2019 19:31
-
Man kann sich die Tabelle sparen, da der Reader die Abfrage der Werte einer Zeile direkt zulässt.
Hier sind die Methode beschrieben:
https://docs.microsoft.com/de-de/dotnet/api/system.data.common.dbdatareader?view=netframework-4.8#methodenMittels GetValues(Array) kannst du alle Werte auf einmal laden, allerdings musst du vorher ein Array in der Anzahl Elemente erstellen.
$v = new-object object[] $Resultat.FieldCount
$count = $Resultat.GetValues($v)Beachte die Sonderbehandlung von NULL-Values (auch bei der obigen Tabelle):
Der Inhalt einer Spalte ist dann[System.DBNull]::Value
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 27. Mai 2019 09:13
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 29. Mai 2019 19:31