我正在编写一些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中读取和遍历多行数据?
答案 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