这真让我抓狂.我有一个来自多个脚本的库,它包含以下功能:
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
}
Run Code Online (Sandbox Code Playgroud)
这几乎被称为无处不在,它工作得很好,除了我通常必须这样做:
$ds = lib_open_dataset($some_sql)
$table = $ds.Tables[0]
foreach ($row in $table.Rows) {
# etc
}
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个新的简单包装函数,以避免解除引用第一个表的额外步骤:
function lib_open_table([string] $sql) {
$ds = lib_open_dataset $sql
return $ds.Tables[0]
}
Run Code Online (Sandbox Code Playgroud)
问题是,从这里返回的是由于某种原因而不是表本身的表的Rows集合.这会导致上面写的行循环失败并显示"无法索引到空数组".例外.经过多次试验和错误,我发现这是有效的:foreach
foreach ($row in $table) {
# etc
}
Run Code Online (Sandbox Code Playgroud)
需要注意的区别$table.Rows,只是$table在foreach声明.这有效.因为$table实际上指向Rows集合.如果声明
return $ds.Tables[0]
Run Code Online (Sandbox Code Playgroud)
假设是正确的,为什么函数返回表对象的子集合而不是表本身?
我猜测Powershell功能的工作原理显然会引起这种情况,但我无法弄清楚是什么.