這讓我瘋狂。我有多個腳本庫我源,其中包含以下功能:返回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