2016-09-20 5 views
0

Ich bekomme verschiedene Fehler beim Abrufen von Daten aus Datentabelle. Hier ist mein Code Datentabelle zu füllen:wie Datatabelle in Powershell durchlaufen?

$dt = New-Object System.Data.DataTable 
$dt.Columns.Add("ServiceName") 
$dt.Columns.Add("HostName") 

$SQLConnection.Open() 
$Reader = $SqlCmd.ExecuteReader() 
while ($Reader.Read()) { 
    $dt.Rows.Add($Reader.GetValue(0), $Reader.GetValue(1)) 
} 
$SqlConnection.Close() 
return $dt 

Above Code in eine Funktion ist, die Datentabelle zurückgibt und wenn ich auf diese zurückDatenTabelle in Aufruf Skript, das ich die Daten nicht erhalten.

Script zu holen Daten in jeder Zeile:

foreach ($Row in $BackupData) { 
    Write-Host "$Row[0]" 
    Write-Host "$Row[1]" 
} 

ich eine Ausgabe wie immer bin:

ServiceName[0] 
HostName[0] 
System.Data.DataRow[0] 
System.Data.DataRow[0] 
System.Data.DataRow[0] 
System.Data.DataRow[0]

Und wenn ich "$($Row[0])" verwende ich einen Einen Fehler

nicht in der Lage zu indizieren ein Objekt vom Typ system.Data.DataColumn

Wie kann ich die Daten jeder Zeile und Spalte abrufen?

+0

Wie wäre es nur '$ BackupData' oder '$ BackupData | Format-Tabelle -AutoSize'? –

+0

foreach ($ row in $ dt) \t { \t \t write-host $ row [0] \t \t write-host $ row [1] \t} Dies funktioniert, wenn dies in der Funktion, wo die gespeicherten Daten ist, gefüllt, funktioniert aber nicht mit derselben Datentabelle, die von dieser Funktion zurückgegeben wird. – nectar

+0

Welche Version von SQL verwenden Sie? Es wird ein "PSNapin" oder "Modul" geben, das das viel einfacher machen kann. – gms0ulman

Antwort

1

Es ist viel einfacher, eine Datentabelle mit Hilfe eines SqlDataAdapter zu füllen, wie so:

$dt = New-Object System.Data.DataTable 
$da = New-Object System.Data.SqlClient.SqlDataAdapter -ArgumentList $ConnectionString, $SqlQuery 
$da.fill($dt) 

Sie kümmern sich um Öffnung Also nicht und eine Verbindung nehmen müssen schließen und ein SqlDataReader entweder verwenden.

Alle Zeilen sind nun Teil der Datentabelle dt Objekt $ und kann

$dt[0].FieldName 

wobei „Feldname“ entweder mit der Zeilenindex und einem bestimmten Feld Namen eines Feldes der Name dieser Tabelle zugegriffen werden . Oder, ohne den Namen eines bestimmten Feldes

$dt.Row[0}[0] 

Die resason für den Fehler zu wissen, ist, dass Sie einen Unter Ausdruck mit Write-Host zu verwenden, haben in etwa so:

Write-Host "value of first field: $($Row[0])" 
Verwandte Themen