2011-01-11 3 views
4

Powershell 2.0을 사용하여 사용자 지정 .Net 2.0 어셈블리 집합과 상호 작용하여 현재 작업을 자동화합니다. dll에 필요한 모든 dll을로드하고 dal 메서드를 호출하여 System.Data.SqlDataReader를 검색합니다. 동일한 사용자 지정 어셈블리의 생성자에 SqlDataReader를 전달하면 "판독기가 닫힐 때 HasRows를 호출하는 잘못된 시도"가 발생합니다. 예외.Powershell 2.0 - 함수에 전달할 때 SqlDataReader가 닫힙니다.

코드 샘플 :

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) 

은 $ 독자가 열려, 그리고 나는 것 생성자를 호출하기 전에, 데이터가 있습니다.

나는 뭔가를 놓치고 있어야하지만 나는 그것이 무엇인지 잘 모릅니다.

편집 1

$ 판독기 표시 읽고, 파워 쉘 또는 어셈블리에서,이 함수에 전달 언제 폐쇄한다. 이것을 막을 수있는 방법이 있습니까?

편집 2 : 다시

파워 쉘 자동 풀림 타격

How to stop PowerShell from unpacking an Enumerable object?

Strange behavior in PowerShell function returning 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) 

답변

5

얼마 전에 비슷한 문제가 발생했습니다. 이 코드를보십시오 :

나는 그것이 불리는 시간에 대한 몇 가지 정보를 출력하는 자체 열거자를 생성합니다. 그것은 SqlDataReader과 동일합니다 (나는 생각합니다)는 IEnumerator도 구현합니다.

PS> Add-Type -TypeDefinition @" 
    using System; 
    using System.Collections; 
    public class MyEnumerator2 : IEnumerator 
    { 
     private int _count = 10; 
     private Random r = new Random(); 

     public MyEnumerator2(int count) 
     { 
      _count = count; 
     } 

     public bool MoveNext() 
     { 
      Console.WriteLine("Moving!"); 
      _count--; 
      return _count >= 0; 
     } 

     public void Reset() 
     { 
      throw new NotImplementedException(); 
     } 

     public object Current 
     { 
      get 
      { 
       Console.WriteLine("Current!"); 
       return r.Next(); 
      } 
     } 
    } 
"@ 

는 다음의이 형식의 개체를 만들 수 및 출력에 그것을 시도 예상대로

PS> $mye = New-Object MyEnumerator2 5 
PS> $mye | % -begin { write-host 'starting' } -Process { write-host 'next is ' $_ } 
starting 
Moving! 
Current! 
next is 2081278528 
Moving! 
Current! 
next is 2000135673 
Moving! 
Current! 
next is 692162542 
Moving! 
Current! 
next is 1531746038 
Moving! 
Current! 
next is 1550381634 
Moving! 

모든입니다. 이 몸에 도달하기 전에 그러나 .. 지금

PS> function iteratemye($o) { 
    $o | % -begin { write-host 'starting' } -Process { write-host 'next is ' $_ } 
} 
PS> $mye = New-Object MyEnumerator2 5 
PS> iteratemye $mye 
Moving! 
Current! 
Moving! 
Current! 
Moving! 
Current! 
Moving! 
Current! 
Moving! 
Current! 
Moving! 
starting 
Moving! 

당신이 기능이 열거를 전달하는 경우, 그것은 을 읽습니다. 그건 아주 안좋아.

코드를 살펴보십시오. 내 iteratemye과 같은 일부 기능을 사용하면 문제가 발생합니다.

업데이트 : IEnumerator을 구현하지 않지만 IEnumerable을 구현합니다. 개체를 일부 생성자에 전달한 것은 똑같은 문제는 아니지만 PowerShell이 ​​여전히 열거자를 얻고 마법을 구하려고한다고 믿습니다.

+0

SqlDataReader의 경우 인 것 같습니다. 그걸 막을 수있는 방법이 있습니까? – Jared314

+0

그것을 막을 방법이 없기 때문에 다른 배열로 포장해야합니다. – Jared314

관련 문제