Domanda

Sto scrivendo un codice PowerShell per connettersi a un database, leggere più righe di dati e restituirli indietro tramite un SqlDataReader.

Ho fatto questo "il c # way" scrivendolo come vorrei scrivere questo in c #:

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;
}
.

(il chiamante di questa funzione deve chiudere la connessione in modo responsabile.)

Mi aspettavo, anche senza il typecast, che avrei ricevuto un'istanza di System.Data.SqlClient.SqlDataReader.Questo è importante, perché voglio usare Read per iterare attraverso la fila per riga, per non parlare del fatto che voglio utilizzare staffe quadrate per accedere ai dati per nome della colonna (accesso tramite ID è troppo fragile).

Sfortunatamente, restituisco un'istanza di System.Data.Common.DataRecordInternal, che fa non contiene un metodo Read, né mi consente di accedere ai record per indice array.

La mia domanda è: come posso leggere e iterare attraverso più righe di dati a PowerShell?

È stato utile?

Soluzione

Ci sono un paio di modi per ivigna attraverso i membri di un array ("file di dati" nel tuo caso).Il primo che viene in mente è:

ForEach($Record in (ExecuteQuery $CommandString){
    Do Stuff to $Record
}
.

Oppure potresti conducarlo a un loop foreach (puoi tubatura in questo modo, ad esempio per il file out-file se lo si desidera):

ExecuteQuery $CommandString | ForEach{Do stuff to $_}
.

O se vuoi davvero un controllo più granulare, suppongo che tu possa usare A per loop e fare qualcosa come:

$Results = ExecuteQuery $CommandString 
For($i=0;$i -le $Results.count;$i++){
    Do stuff to $Results[$i]
}
.

Altri suggerimenti

Il problema è che PowerShell sta cercando di enumerare il lettore per te quando la funzione lo restituisce.Puoi dire a PowerShell di lasciarlo da solo mettendolo in un array:

return ,$reader
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top