在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?
有几种方法可以遍历数组的成员(在您的例子中是'数据行')。首先想到的是:
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