2011-01-11 31 views
4

現在のタスクを自動化するために、Powershell 2.0を使用して一連のカスタム.Net 2.0アセンブリとやりとりしています。必要なDLLをすべて読み込み、dllメソッドを呼び出して、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:

$リーダーが表示されますが、読み取り、およびPowerShellでまたはアセンブリで、それが関数に渡され、いつでもをクローズします。これを防ぐ方法はありますか?

編集2:

Powershellの自動展開ストライキ再び

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

関連する問題