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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top