gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:32:09 36 4
gpt4 key购买 nike

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

没有异常(exception)。唯一的问题是 $reader 的类型不正确。不知何故类型转换,或什么。

最佳答案

您可能看到的是 PowerShell 的一种行为,它自动“解开”一个实现 IEnumerable 的对象。 OleDbDataReader 实现 IEnumerable。换句话说,当您返回 $Reader 时,您实际上是在执行以下操作:

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

要解决此问题,您可以尝试执行以下操作。 (因为它没有必要,所以不要使用类型转换,我相信你只是把它作为一个健全的检查。)
Return ,$Reader

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

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

关于powershell - 从函数而不是 DataReader/OleDbDataReader 返回的 DbDataRecord,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3664088/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com