为了重构我的一些代码,我添加了一个设置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是不正确的类型。以某种方式铸造,或其他东西。
答案 0 :(得分:3)
您可能看到的是PowerShell的行为,它自动“解包”实现IEnumerable的对象。 OleDbDataReader实现IEnumerable。换句话说,当你返回$ Reader时,你真的在做:
foreach ($record in $reader) {
write-output $record
}
要解决此问题,您可以尝试执行以下操作。 (失去演员,因为没有必要,我确定你只是把它作为一个完整性检查。)
Return ,$Reader
这将有效地创建一个单元素数组,当解包时将返回原始的OleDbDataReader。这有时会很棘手,在我看来这肯定不直观。但是一旦你意识到发生了什么,你就会开始更明确地思考你是回归一件物品还是一件物品。
但是话说回来,这样的函数似乎更有意义让它通过管道返回实际记录而不是读者,然后调用者将负责枚举和关闭。重新思考函数的设计并在函数内部执行while(reader.read())并让它每行写出一个PSObject可能是值得的。