背景资料:
我有一个应用程序,它与多个数据库建立多个 SQL 连接,目前需要很长时间才能执行。
Powershell (.NET) 将等待每个正在进行的“ SQL-GET ”函数完成,然后才能触发下一个。我的印象是,我可以通过在他们自己的后台作业中同时触发每个“ SQL-GET ”函数来显着加快这个应用程序的速度!然后我会在他们完成时从每个作业中检索数据。理想情况下作为 DataSet 系统对象。
问题:
从后台作业中检索数据时,我只能设法取回一个System.Array对象。我实际上追求的是一个System.DataSet对象。这是必要的,因为应用程序中的所有逻辑都依赖于 DataSet 对象。
代码:
这是一段 v.simple 代码,它将创建一个 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
任何帮助将不胜感激!!!
迄今为止的研究:
我已经完成了旧的谷歌,但我偶然发现的所有帖子、博客和文章似乎都深入到了关于管理工作和所有关于这方面的花里胡哨的深度。仅通过接收作业 cmdlet 返回一个数组是 powershell 的基本性质吗?
我已阅读有关返回表达式的堆栈帖子。以为我在做某事。尝试:
return $results.Tables[0]
return ,$results.Tables[0]
return ,$results
所有仍然返回一个数组。
我见过人们相当麻烦地手动将数组转换回数据集对象-尽管这看起来很“肮脏”-我很迂腐并且希望必须有一种方法让这个神奇的数据集对象遍历后台作业和进入我当前的会话!:)
重申:
基本上,我只想让从 Receive-Job cmdlet 中检索到的 $ret_results 对象成为一个 DataSet……甚至是一个 DataTable。我会采取任何一个......只是不是一个阵列:)