Iterando em várias linhas de dados no PowerShell
-
26-12-2019 - |
Pergunta
Estou escrevendo um código do PowerShell para conectar-se a um banco de dados, ler várias linhas de dados e retorná-los por meio de um SqlDataReader
.
Eu fiz isso "do jeito C#", escrevendo como escreveria em 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;
}
(O chamador desta função deve encerrar a conexão de forma responsável.)
Eu esperava, mesmo sem o typecast, obter uma instância de System.Data.SqlClient.SqlDataReader
.Isso é importante porque quero usar Read
para iterar linha por linha, sem mencionar que quero usar colchetes para acessar dados por nome de coluna (o acesso por ID é muito frágil).
Infelizmente, recebo de volta uma instância de System.Data.Common.DataRecordInternal
, o que faz não contém um Read
método, nem me permite acessar registros por índice de array.
Minha pergunta é:como posso ler e iterar várias linhas de dados no PowerShell?
Solução
Existem algumas maneiras de iterar pelos membros de uma matriz ('linhas de dados' no seu caso).O primeiro que vem à mente é:
ForEach($Record in (ExecuteQuery $CommandString){
Do Stuff to $Record
}
Ou você pode canalizá-lo para um loop ForEach (você pode canalizar a saída desta forma, como Out-File, se desejar):
ExecuteQuery $CommandString | ForEach{Do stuff to $_}
Ou se você realmente deseja um controle mais granular, suponho que você possa usar um loop For e fazer algo como:
$Results = ExecuteQuery $CommandString
For($i=0;$i -le $Results.count;$i++){
Do stuff to $Results[$i]
}
Outras dicas
O problema é que o PowerShell está tentando enumerar o leitor para você quando a função o retorna.Você pode dizer ao PowerShell para deixá-lo como está, colocando-o em uma matriz:
return ,$reader