Esto me está volviendo loco. Tengo una fuente de la biblioteca I a partir de varias secuencias de comandos, que contiene la siguiente función:Comportamiento extraño en la función PowerShell que devuelve 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
}
Esto se conoce prácticamente en todas partes y funciona muy bien, excepto que normalmente tienen que hacer esto:
$ds = lib_open_dataset($some_sql)
$table = $ds.Tables[0]
foreach ($row in $table.Rows) {
# etc
}
así que creé una nueva función simple envoltorio para evitar el paso adicional de eliminación de referencias a la primera tabla:
function lib_open_table([string] $sql) {
$ds = lib_open_dataset $sql
return $ds.Tables[0]
}
el problema es que lo que está siendo devuelto de aquí es el Recopilación de filas de la tabla por algún motivo, no tabla sí mismo. Esto hace que el bucle de fila foreach
escrito como arriba falle con un "No se puede indexar en una matriz nula". excepción. Después de mucho ensayo y error me di cuenta de que esto funciona:
foreach ($row in $table) {
# etc
}
Nota la diferencia entre $table.Rows
y justo $table
en la declaración foreach
. Este funciona. Porque $table
en realidad apunta a la colección Filas. Si la declaración
return $ds.Tables[0]
supuestamente es correcta, ¿por qué la función que devuelve una colección secundario del objeto de tabla en lugar de la propia tabla?
Supongo que hay algo en el funcionamiento de las funciones de Powershell que está causando esto obviamente, pero no puedo entender qué.
impresionante, que funcionó. Es extraño, pero funcionó :) Muchas gracias Keith. – kprobst
Lo que no entiendo es dónde se desenrolla la matriz. Y por qué solo la colección Rows, ¿por qué no otra propiedad? ¿Por qué no, por ejemplo? Propiedad Columnas? – stej
No soy un gurú de DataSet pero me pregunto si la tabla de datos devuelta es de tipo TypedTableBase que es enumerable sobre T si T es DataRow. –