【发布时间】:2014-03-02 02:35:57
【问题描述】:
背景信息:
我有一个应用程序,它与多个数据库建立多个 SQL 连接,目前需要很长时间才能执行。
Powershell (.NET) 将等待每个正在进行的“SQL-GET”函数完成,然后才能触发下一个。我的印象是我可以通过同时在他们自己的后台作业中触发每个“SQL-GET”函数来显着加快这个应用程序的速度!然后,我会在他们完成时从每个作业中检索数据。理想情况下作为 DataSet 系统对象。
问题:
从后台作业中检索数据时,我只能设法取回一个 System.Array 对象。我真正追求的是一个 System.DataSet 对象。这是必要的,因为应用程序中的所有逻辑都依赖于 DataSet 对象。
守则:
这是一段非常简单的代码,它将创建一个 sql 连接并用返回的结果填充一个新创建的数据集对象。工作一种享受。 $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 cmdlet返回一个数组是powershell的底层特性吗?
我已经阅读了关于返回表达式的stack post。以为我在做某事。尝试:
return $results.Tables[0]return ,$results.Tables[0]return ,$results
仍然返回一个数组。
我见过人们,相当麻烦,手动将数组转换回数据集对象 - 虽然这看起来很“肮脏” - 我很迂腐,希望这个神奇的数据集对象必须有一种方法可以遍历后台工作并进入我当前的会话! :)
重申:
基本上,我只想让从 Receive-Job cmdlet 中检索到的 $ret_results 对象成为一个 DataSet……甚至是一个 DataTable。我会采取任何一个......只是不是一个阵列:)
【问题讨论】:
标签: .net powershell powershell-3.0 powergui powershell-jobs