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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top