Question

J'écris du code PowerShell pour me connecter à une base de données, lire plusieurs lignes de données et les renvoyer via un SqlDataReader.

J'ai fait cela "à la manière C#" en l'écrivant comme j'écrirais ceci en 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;
}

(L'appelant de cette fonction doit fermer lui-même la connexion de manière responsable.)

Je m'attendais, même sans le transtypage, à obtenir une instance de System.Data.SqlClient.SqlDataReader.C'est important, car je veux utiliser Read pour parcourir ligne par ligne, sans oublier que je souhaite utiliser des crochets pour accéder aux données par nom de colonne (l'accès par ID est trop fragile).

Malheureusement, je reçois une instance de System.Data.Common.DataRecordInternal, qui fait pas contenir un Read méthode, et cela ne me permet pas non plus d'accéder aux enregistrements par index de tableau.

Ma question est:comment puis-je lire et parcourir plusieurs lignes de données dans PowerShell ?

Était-ce utile?

La solution

Il existe plusieurs façons de parcourir les membres d'un tableau (« lignes de données » dans votre cas).Le premier qui me vient à l’esprit est :

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

Ou vous pouvez le diriger vers une boucle ForEach (vous pouvez diriger la sortie de cette façon, par exemple vers Out-File si vous le souhaitez) :

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

Ou si vous voulez vraiment un contrôle plus granulaire, je suppose que vous pouvez utiliser une boucle For et faire quelque chose comme :

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

Autres conseils

Le problème est que PowerShell essaie d'énumérer le lecteur pour vous lorsque la fonction le renvoie.Vous pouvez dire à PowerShell de le laisser tranquille en le plaçant dans un tableau :

return ,$reader
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top