这快把我逼疯了.我有一个来自多个脚本的库,其中包含以下函数:
function lib_open_dataset([string] $sql) {
$ds = new-object "System.Data.DataSet"
$da = new-object "System.Data.SqlClient.SqlDataAdapter" ($sql, $_conn_string)
$record_count = $da.Fill($ds)
return $ds
}
这几乎在任何地方都被称为,它工作得很好,除了我通常必须这样做:
$ds = lib_open_dataset($some_sql)
$table = $ds.Tables[0]
foreach ($row in $table.Rows) {
# etc
}
因此,我创建了一个新的简单包装器函数,以避免取消引用第一个表的额外步骤:
function lib_open_table([string] $sql) {
$ds = lib_open_dataset $sql
return $ds.Tables[0]
}
问题是,出于某种原因,从这里返回的是Rows collection of the table,而不是table本身.这会导致如上编写的foreach
行循环失败,并显示"无法索引到空数组".例外情况.经过多次试错后,我发现这是可行的:
foreach ($row in $table) {
# etc
}
注意foreach
语句中$table.Rows
和$table
之间的区别.这是works.因为$table
实际上指向Rows集合.如果声明
return $ds.Tables[0]
假设是正确的,为什么函数返回表对象的子集合而不是表本身?
我猜显然是Powershell函数的工作方式导致了这种情况,但我不知道是什么原因.