从函数而不是DataReader / OleDbDataReader返回DbDataRecord

时间:2010-09-08 01:50:26

标签: powershell

为了重构我的一些代码,我添加了一个设置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 个答案:

答案 0 :(得分:3)

您可能看到的是PowerShell的行为,它自动“解包”实现IEnumerable的对象。 OleDbDataReader实现IEnumerable。换句话说,当你返回$ Reader时,你真的在​​做:

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

要解决此问题,您可以尝试执行以下操作。 (失去演员,因为没有必要,我确定你只是把它作为一个完整性检查。)

Return ,$Reader

这将有效地创建一个单元素数组,当解包时将返回原始的OleDbDataReader。这有时会很棘手,在我看来这肯定不直观。但是一旦你意识到发生了什么,你就会开始更明确地思考你是回归一件物品还是一件物品。

但是话说回来,这样的函数似乎更有意义让它通过管道返回实际记录而不是读者,然后调用者将负责枚举和关闭。重新思考函数的设计并在函数内部执行while(reader.read())并让它每行写出一个PSObject可能是值得的。