2010-09-08 56 views
2

爲了重構我的一些代碼,我添加了一個函數來設置OleDbDataReader從函數返回DbDataRecord而不是DataReader/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 

有沒有例外。唯一的問題是$閱讀器是不正確的類型。以某種方式鑄造,或什麼。

回答

3

你可能看到的是PowerShell的一個行爲,它自動「解開」實現IEnumerable的對象。 OleDbDataReader實現IEnumerable。換句話說,當您返回$ Reader時,您確實在做:

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

要解決此問題,您可以嘗試執行以下操作。 (失去投,因爲它是沒有必要的,我相信你只是把它作爲一個全面的檢查呢。)

Return ,$Reader 

這將有效地創建這拆開將返回原來的OleDbDataReader當一個單元素數組。這有時候會很棘手,在我看來這絕對不直觀。但是一旦你意識到發生了什麼事情,就會讓你開始更加明確地思考你是否要返回一件物品或一批物品。

但話雖如此,這樣的函數似乎讓它通過管道而不是讀者返回實際記錄更有意義,而調用者隨後將負責枚舉和關閉。重新考慮函數的設計並在函數內部執行while(reader.read())函數並使其每行寫出一個PSObject可能是值得的。

相關問題