Я взаимодействую с набором пользовательских сборок .Net 2.0 с Powershell 2.0 для автоматизации текущей задачи. Я загружаю все необходимые dll и вызываю метод DAL в dll для получения System.Data.SqlDataReader. Когда я передаю SqlDataReader в конструктор в той же пользовательской сборке, я получаю сообщение «Неверная попытка вызвать HasRows, когда программа чтения закрыта». исключение.
Пример кода:
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)
Читатель $reader открыт и имеет данные до того, как я вызову конструктор Thing.
Я должен что-то упустить, но я не уверен, что именно.
Редактировать 1:
$reader кажется прочитанным и закрытым каждый раз, когда он передается функции, в powershell или в сборке. Есть ли способ предотвратить это?
Редактировать 2:
Автоматическое развертывание Powershell снова наносит удар
Как запретить PowerShell распаковывать Enumerable объект?
Странное поведение функции PowerShell, возвращающей DataSet/DataTable
В следующем измененном примере кода результат упаковывается в массив из одного элемента, поэтому автоматическое развертывание не влияет на SqlDataReader. Обратите внимание на одну запятую после оператора "$reader=". Это не опечатка.
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)