DbDataRecord, возвращаемый из функции вместо DataReader / OleDbDataReader - PullRequest
2 голосов
/ 08 сентября 2010

Пытаясь изменить код моего кода, я добавил функцию для установки OleDbDataReader.

Возвращаемое значение по какой-то странной причине System.Data.Common.DbDataRecord.

Непосредственно перед функцией, возвращающей объект, я проверил, что это действительно DataReader.

Вот код функции:

function Execute-Reader
{
    param($conObj = $(throw "conObj parameter required"), 
    $sqlStr = $(throw "sqlStr parameter required"))

    $cmd = New-Object system.data.oledb.oledbcommand
    $cmd.connection = $conObj
    $cmd.commandtext = $sqlStr
    $reader = $cmd.executereader()

    return [System.Data.OleDb.OleDbDataReader]$reader 
}

и вызывается со следующим

$reader = Execute-Reader $conObj $query

Там нет исключений. Единственная проблема - неправильный тип $ reader. Каким-то образом кастуется или что-то в этом роде.

1 Ответ

3 голосов
/ 08 сентября 2010

То, что вы, вероятно, видите, - это поведение PowerShell, которое автоматически «разворачивает» объект, реализующий IEnumerable. OleDbDataReader реализует IEnumerable. Другими словами, когда вы возвращаете $ Reader, вы действительно делаете:

foreach ($record in $reader) { 
    write-output $record
}

Чтобы обойти это, вы можете попробовать сделать следующее. (Потеряйте актерский состав, так как он не нужен, я уверен, что вы все равно просто вставите его в качестве проверки здравомыслия.)

Return ,$Reader

Это эффективно создаст одноэлементный массив, который при распаковывании вернет ваш оригинальный OleDbDataReader. Иногда это может быть сложно, и, на мой взгляд, это не интуитивно понятно. Но как только вы понимаете, что происходит, вы начинаете более четко думать о том, возвращаете ли вы один элемент или коллекцию элементов.

Но, сказав, что такая функция, похоже, имеет больше смысла, чтобы она в любом случае возвращала фактические записи через конвейер, а не через считыватель, который вызывающий затем будет отвечать за перечисление и закрытие. Возможно, стоит переосмыслить дизайн функции и выполнить в ней функцию while (reader.read ()), чтобы она выписывала PSObject для каждой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...