Ich arbeite mit einer Reihe benutzerdefinierter .NET 2.0-Assemblys mit Powershell 2.0 zusammen, um eine aktuelle Aufgabe zu automatisieren. Ich lade alle erforderlichen DLLs und rufe eine DAL-Methode in der DLL auf, um einen System.Data.SqlDataReader abzurufen. Wenn ich den SqlDataReader in einem Konstruktor in derselben benutzerdefinierten Assembly übergebe, erhalte ich einen "ungültigen Versuch, HasRows aufzurufen, wenn der Reader geschlossen ist". Ausnahme.Powershell 2.0 - SqlDataReader schließt bei Übergabe an eine Funktion
Codebeispiel:
dir D:\stuff\*.dll | foreach { [Reflection.Assembly]::LoadFrom($_.FullName) } | out-null
[CustomAssembly.DataConfig]::ConnectionString = "Valid Connection String"
$reader=[CustomAssembly.DAL.Thing]::Get(123)
new-object CustomAssembly.BusinessObjects.Thing($reader)
Die $ Leser ist offen und hat Daten, bevor ich die Sache Konstruktor aufrufen.
Ich muss etwas vermissen, aber ich bin mir nicht sicher, was es ist.
Edit 1:
$ Leser scheint zu lesen, und geschlossen wird, jederzeit an eine Funktion übergeben wird, in Powershell oder in einer Baugruppe. Gibt es einen Weg dies zu verhindern?
Edit 2:
Powershell automatisches Abrollen schlägt wieder
How to stop PowerShell from unpacking an Enumerable object?
Strange behavior in PowerShell function returning DataSet/DataTable
Das folgende modifizierten Codebeispiel funktioniert, indem das Ergebnis in einem einzigen Elementanordnung Einwickeln, so die Das automatische Ausrollen wirkt sich nicht auf den SqlDataReader aus. Beachten Sie das einfache Komma nach der Anweisung "$ reader =". Das ist kein Tippfehler.
dir D:\stuff\*.dll | foreach { [Reflection.Assembly]::LoadFrom($_.FullName) } | out-null
[CustomAssembly.DataConfig]::ConnectionString = "Valid Connection String"
$reader=,[CustomAssembly.DAL.Thing]::Get(123)
new-object CustomAssembly.BusinessObjects.Thing($reader)
Das scheint mit dem SqlDataReader der Fall zu sein. Gibt es eine Möglichkeit, das zu verhindern? – Jared314
Sieht so aus, als müsste ich es in ein anderes Array einpacken, weil es keine Möglichkeit gibt, das zu verhindern. – Jared314