Cela me rend fou. J'ai une source I de la bibliothèque à partir de plusieurs scripts qui contient la fonction suivante:Comportement étrange dans la fonction PowerShell renvoyant DataSet/DataTable
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
}
Ceci est appelé un peu partout et il fonctionne très bien, sauf que je dois normalement faire ceci:
$ds = lib_open_dataset($some_sql)
$table = $ds.Tables[0]
foreach ($row in $table.Rows) {
# etc
}
Je créé une nouvelle fonction d'emballage simple pour éviter l'étape supplémentaire de déréférencement la première table:
function lib_open_table([string] $sql) {
$ds = lib_open_dataset $sql
return $ds.Tables[0]
}
le problème est que ce qui est de retour d'ici est le Collection de lignes de la table pour une raison quelconque, pas la table elle-même. Cela provoque l'échec de la boucle de ligne foreach
écrite comme ci-dessus avec un «impossible d'indexer dans un tableau null». exception. Après beaucoup d'essais et d'erreurs que j'ai compris cela fonctionne:
foreach ($row in $table) {
# etc
}
Notez la différence entre $table.Rows
et juste $table
dans la déclaration foreach
. Cette fonctionne. Parce que $table
pointe vers la collection Rows. Si la déclaration
return $ds.Tables[0]
est censé être correct, pourquoi la fonction renvoie une collection enfant de l'objet de la table au lieu de la table elle-même?
Je suppose qu'il y a quelque chose dans la façon dont fonctionnent les fonctions de Powershell qui cause cela évidemment, mais je n'arrive pas à comprendre quoi.
impressionnant, qui a fonctionné. C'est bizarre, mais ça a marché :) Merci beaucoup Keith. – kprobst
Ce que je ne comprends pas, c'est où le tableau est déroulé. Et pourquoi seulement la collection Rows, pourquoi pas d'autres propriétés? Pourquoi pas, par exemple Propriété Columns – stej
Je ne suis pas un gourou DataSet mais je me demande si la table de données retournée est de type TypedTableBase qui est énumérable sur T où T est DataRow. –