这让我疯狂。我有多个脚本库我源,其中包含以下功能:返回DataSet/DataTable的PowerShell函数的奇怪行为
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]
}
的问题是,什么东西被从这里返回是由于某种原因,表的行集合,而不是表本身。这会导致上面写入的foreach
行循环失败,并显示“无法索引到空数组中”。例外。多试错后,我想通了,这个工程:
foreach ($row in $table) {
# etc
}
注意区别$table.Rows
,只是$table
之间的foreach
声明。这作品。因为$table
实际上指向了行集合。如果声明
return $ds.Tables[0]
被认为是正确的,为什么函数返回表对象的子集合而不是表本身?
我猜有什么东西在路上PowerShell函数的工作,这显然导致此,但我想不出什么。
真棒,那工作。这很奇怪,但它的工作:) 非常感谢基思。 – kprobst 2009-12-16 23:26:11
我不明白的是数组展开的地方。为什么只是Rows集合,为什么不是其他属性?为什么不列属性? – stej 2009-12-17 05:48:52
我不是数据集大师,但我不知道是否返回的数据表是TypedTableBase这是可枚举的T是T是DataRow。 –
2009-12-17 16:27:44