在PowerShell中迭代多行数据
-
26-12-2019 - |
题
我正在编写一些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;
}
(此函数的调用者必须自己负责地关闭连接。)
我预计,即使没有typecast,我会得到一个实例 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
不隶属于 StackOverflow