Это сводит меня с ума. У меня есть библиотека из нескольких сценариев, которая содержит следующую функцию:
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]
}
Проблема заключается в том, что из того, что возвращается отсюда, является коллекция Rows таблицы по какой-то причине, а не сама таблица. Это приводит к тому, что цикл строки foreach
, записанный, как указано выше, завершился неудачей с помощью "Невозможно индексировать нулевой массив". исключение. После долгих проб и ошибок я понял, что это работает:
foreach ($row in $table) {
# etc
}
Обратите внимание на разницу между $table.Rows
и просто $table
в инструкции foreach
. Этот работает. Потому что $table
фактически указывает на коллекцию строк. Если утверждение
return $ds.Tables[0]
предположительно правильно, почему функция возвращает дочернюю коллекцию объекта таблицы вместо самой таблицы?
Я предполагаю что-то в том, как работают функции Powershell, что явно вызывает это, но я не могу понять, что.