2010-09-08 6 views
2

Dans une tentative de refactoriser une partie de mon code, j'ai ajouté une fonction pour configurer un OleDbDataReader.DbDataRecord retourné d'une fonction au lieu d'un DataReader/OleDbDataReader

La valeur de retour que j'obtiens est pour une raison inconnue un System.Data.Common.DbDataRecord.

Juste avant la fonction retournant l'objet, j'ai vérifié pour voir qu'il s'agit bien d'un DataReader.

est ici le code de la fonction:

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 
} 

et être appelé avec les éléments suivants

$reader = Execute-Reader $conObj $query 

Il n'y a pas d'exceptions. Le seul problème est que le lecteur $ est le type incorrect. En quelque sorte casté, ou quelque chose.

Répondre

3

Ce que vous voyez probablement est un comportement de PowerShell qui "déballe" automatiquement un objet qui implémente IEnumerable. OleDbDataReader implémente IEnumerable. En d'autres termes, lorsque vous revenez lecteur $, vous faites vraiment:

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

Pour contourner ce problème, vous pouvez essayer de faire ce qui suit. (Perdre le casting comme il est pas nécessaire, je suis sûr que vous venez de mettre dans un contrôle de santé mentale de toute façon.)

Return ,$Reader 

Cela va créer efficacement un tableau à un seul élément lorsque le déballa retournera votre OleDbDataReader d'origine. Cela peut parfois être difficile et, à mon avis, ce n'est certainement pas intuitif. Mais une fois que vous vous rendez compte de ce qui se passe, vous commencez à penser plus explicitement si vous renvoyez un seul objet ou une collection d'objets. Mais cela dit, une telle fonction semble plus logique de lui faire renvoyer des enregistrements réels via le pipeline au lieu du lecteur que l'appelant serait alors chargé d'énumérer et de fermer. Il pourrait être utile de repenser la conception de la fonction et de faire le while (reader.read()) à l'intérieur de la fonction et de lui écrire un objet PSObject par ligne.

Questions connexes