在PowerShell中迭代多行数据

时间:2014-07-31 22:39:22

标签: c# powershell powershell-v3.0 sqlclient

我正在编写一些PowerShell代码来连接数据库,读取多行数据,然后通过SqlDataReader将其返回。

我做了这个" C#方式"通过编写它我将如何用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;
}

(此功能的调用者必须自己负责关闭连接。)

我预计,即使没有类型转换,我也会得到System.Data.SqlClient.SqlDataReader的实例。这很重要,因为我想使用Read逐行迭代,更不用说我想使用方括号来按列名访问数据(通过ID访问太脆弱了。)

不幸的是,我找回了System.Data.Common.DataRecordInternal的实例,包含Read方法,也不允许我按数组索引访问记录。

我的问题是:如何在PowerShell中读取和遍历多行数据?

2 个答案:

答案 0 :(得分:1)

有几种方法可以遍历数组成员(在您的情况下为“数据行”)。首先想到的是:

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

或者您可以将它传递给ForEach循环(您可以通过这种方式输出管道,例如,如果需要,可以输出到Out-File):

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

或者,如果你真的想要更细粒度的控制,我想你可以使用For循环并做类似的事情:

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

答案 1 :(得分:1)

问题是PowerShell在函数返回时试图为您枚举读者。您可以通过将PowerShell放入数组来告诉PowerShell将其保留下来:

return ,$reader