none
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

    Montag, 20. Mai 2019 09:49

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

    http://evgenij.smirnov.de


    Montag, 20. Mai 2019 10:22
  • 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#methoden

    Mittels 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

    Montag, 20. Mai 2019 14:44

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

    http://evgenij.smirnov.de


    Montag, 20. Mai 2019 10:22
  • 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#methoden

    Mittels 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

    Montag, 20. Mai 2019 14:44