背景情報:
現在、実行に非常に長い時間がかかる複数のデータベースに対して複数の SQL 接続を行うアプリケーションがあります。
Powershell (.NET) は、進行中の各 " SQL-GET " 関数が終了するのを待ってから、次の関数を起動できます。それぞれの「 SQL-GET」関数を独自のバックグラウンド ジョブで同時に起動することにより、このアプリを劇的に高速化できるという印象を受けました。その後、各ジョブが終了したら、各ジョブからデータを取得します。理想的には DataSet システム オブジェクトとして。
問題:
バックグラウンド ジョブからデータを取得するとき、 System.Arrayオブジェクトを取得することしかできません。私が実際に求めているのは、System.DataSetオブジェクトです。これは、アプリ内のすべてのロジックが DataSet オブジェクトに依存しているため必要です。
コード:
これは、SQL 接続を作成し、新しく作成されたデータセット オブジェクトに返された結果を入力するコードの v.simple スライスです。御馳走を働きます。$resultsは DataSet オブジェクトであり、これをうまく操作できます。
$query = "SELECT * FROM [database]..[table] WHERE column = '123456'"
$Connection = New-Object System.Data.SqlClient.SQLConnection
$ConnectionString = "Server='SERVER';Database='DATABASE';User ID='SQL_USER';Password='SQL_PASSWORD'"
$Connection.ConnectionString = $ConnectionString
$Connection.Open()
$Command = New-Object system.Data.SqlClient.SqlCommand($Query,$Connection)
$Adapter = New-Object system.Data.SqlClient.SqlDataAdapter
$Adapter.SelectCommand = $Command
$Connection.Close()
[System.Data.SqlClient.SqlConnection]::ClearAllPools()
$results = New-Object system.Data.DataSet
[void]$Adapter.fill($results)
$results.Tables[0]
そして、これは非常に同じコードが新しいバックグラウンド ジョブの scriptblock パラメータにラップされています。Receive-Job を呼び出したときにのみ、データセットではなく配列が返されます。
$test_job = Start-Job -ScriptBlock {
$query = "SELECT * FROM [database]..[table] WHERE column = '123456'"
$Connection = New-Object System.Data.SqlClient.SQLConnection
$ConnectionString = "Server='SERVER';Database='DATABASE';User ID='SQL_USER';Password='SQL_PASSWORD'"
$Connection.ConnectionString = $ConnectionString
$Connection.Open()
$Command = New-Object system.Data.SqlClient.SqlCommand($Query,$Connection)
$Adapter = New-Object system.Data.SqlClient.SqlDataAdapter
$Adapter.SelectCommand = $Command
$Connection.Close()
[System.Data.SqlClient.SqlConnection]::ClearAllPools()
$results = New-Object system.Data.DataSet
[void]$Adapter.fill($results)
return $results.Tables[0]
}
Wait-Job $test_job
$ret_results = Receive-Job $test_job
どんな助けでも大歓迎です!!!
これまでの研究:
私は古いGoogleをやったことがありますが、私が遭遇したすべての投稿、ブログ、および記事は、仕事の管理とこれに関するすべての機能について非常に深く掘り下げているようです. receive-jobコマンドレットを介してのみ配列を返すのは、powershellの根本的な性質ですか?
return 式に関するスタックの投稿を読みました。私は何かに乗っていると思った。試みた:
return $results.Tables[0]
return ,$results.Tables[0]
return ,$results
すべてが配列を返します。
私はかなり面倒なことに、手動で配列をデータセット オブジェクトに変換し直す人々を見てきました。私の現在のセッションに!:)
繰り返します:
基本的には、$ret_results オブジェクトを Receive-Job コマンドレットから取得して、DataSet にすること、または DataTable にすることだけが必要です。私はどちらかを取ります...配列ではありません:)