Iterieren über mehrere Datenzeilen in PowerShell
-
26-12-2019 - |
Frage
Ich schreibe PowerShell-Code, um eine Verbindung zu einer Datenbank herzustellen, mehrere Datenzeilen zu lesen und sie über a zurückzugeben SqlDataReader
.
Ich habe dies „auf die C#-Art“ gemacht, indem ich es so geschrieben habe, wie ich es in C# schreiben würde:
function ExecuteQuery($sql) {
$connection = new-object system.data.SqlClient.SQLConnection($ConnectionString);
$connection.Open();
$cmd = $connection.CreateCommand();
$cmd.CommandText = $sql;
$cmd.Connection = $connection
$reader = [System.Data.SqlClient.SqlDataReader]$cmd.ExecuteReader()
return $reader;
}
(Der Aufrufer dieser Funktion muss die Verbindung selbst verantwortlich schließen.)
Ich hatte erwartet, dass ich auch ohne die Typumwandlung eine Instanz davon erhalten würde System.Data.SqlClient.SqlDataReader
.Das ist wichtig, weil ich es nutzen möchte Read
um Zeile für Zeile zu iterieren, ganz zu schweigen davon, dass ich eckige Klammern verwenden möchte, um auf Daten nach Spaltennamen zuzugreifen (der Zugriff nach ID ist zu fragil).
Leider bekomme ich eine Instanz von zurück System.Data.Common.DataRecordInternal
, was der Fall ist nicht enthalten a Read
Methode und erlaubt mir auch nicht, über den Array-Index auf Datensätze zuzugreifen.
Meine Frage ist:Wie kann ich in PowerShell mehrere Datenzeilen lesen und durchlaufen?
Lösung
Es gibt mehrere Möglichkeiten, die Mitglieder eines Arrays zu durchlaufen (in Ihrem Fall „Datenzeilen“).Das erste, was mir in den Sinn kommt, ist:
ForEach($Record in (ExecuteQuery $CommandString){
Do Stuff to $Record
}
Oder Sie könnten es an eine ForEach-Schleife weiterleiten (Sie können die Ausgabe auf diese Weise weiterleiten, beispielsweise an Out-File, falls gewünscht):
ExecuteQuery $CommandString | ForEach{Do stuff to $_}
Oder wenn Sie wirklich eine detailliertere Kontrolle wünschen, könnten Sie vermutlich eine For-Schleife verwenden und so etwas tun:
$Results = ExecuteQuery $CommandString
For($i=0;$i -le $Results.count;$i++){
Do stuff to $Results[$i]
}
Andere Tipps
Das Problem besteht darin, dass PowerShell versucht, den Reader für Sie aufzulisten, wenn die Funktion ihn zurückgibt.Sie können PowerShell anweisen, es in Ruhe zu lassen, indem Sie es in ein Array einfügen:
return ,$reader