在PowerShell中迭代多行数据

本文关键字:数据 迭代 PowerShell | 更新日期: 2023-09-27 18:15:57

我正在编写一些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?

在PowerShell中迭代多行数据

有几种方法可以遍历数组的成员(在您的例子中是'数据行')。首先想到的是:

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]
}

问题是PowerShell在函数返回阅读器时试图为您枚举它。你可以通过把它放入一个数组来告诉PowerShell不要去管它:

return ,$reader