我正在编写一些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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top