gpt4 book ai didi

.net - Powershell Receive-Job 可以返回数据集吗?

转载 作者:行者123 更新时间:2023-12-03 21:33:14 26 4
gpt4 key购买 nike

背景信息 :

我有一个应用程序,它与多个数据库建立多个 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 的基本性质吗?

我已经阅读了关于返回表达式的 stack post 。以为我在做某事。尝试:
  • return $results.Tables[0]
  • return ,$results.Tables[0]
  • return ,$results

  • 所有仍然返回一个数组。

    我已经看到人们相当麻烦地将数组手动转换回数据集对象 - 尽管这看起来很“脏” - 我很迂腐并且生活在希望必须有一种方法让这个神奇的数据集对象遍历后台工作和进入我当前的 session ! :)

    重申 :

    基本上,我想要的只是让从 Receive-Job cmdlet 中检索到的 $ret_results 对象成为一个 DataSet...甚至一个 DataTable。我会选择...只是不是数组 :)

    最佳答案

    在 powershell 中,在集合中返回一组多个任意类型的对象是很常见的。考虑这个修改过的示例,我在其中构建了自己的表:

    PS C:\> $job = Start-Job -ScriptBlock {
    >>
    >> $table = New-Object system.Data.DataTable “MyTable”
    >>
    >> $col1 = New-Object system.Data.DataColumn MyFirstCol,([string])
    >> $col2 = New-Object system.Data.DataColumn MyIntCol,([int])
    >>
    >> $table.columns.add($col1)
    >> $table.columns.add($col2)
    >>
    >> $row1 = $table.NewRow()
    >> $row1.MyFirstCol = "FirstRow"
    >> $row1.MyIntCol = 1
    >> $row2 = $table.NewRow()
    >> $row2.MyFirstCol = "SecondRow"
    >> $row2.MyIntCol = 2
    >>
    >> $table.Rows.Add($row1)
    >> $table.Rows.Add($row2)
    >>
    >> $dataSet = New-Object system.Data.DataSet
    >> $dataSet.Tables.Add($table)
    >>
    >> $dataSet.Tables[0]
    >>
    >> }
    >>
    PS C:\> $output = Receive-Job -Job $job

    收到输出。那么我们得到了什么?
    PS C:\> $output.GetType()

    IsPublic IsSerial Name BaseType
    -------- -------- ---- --------
    True True Object[] System.Array

    一个数组,正如你所描述的。但这就是整个对象。如果我们单独分析它的成员,通过管道将它们发送到 Get-Member 会怎样? ?
    PS C:\> $output | gm

    TypeName: Deserialized.System.Data.DataRow

    Name MemberType Definition
    ---- ---------- ----------
    ToString Method string ToString(), string ToString(string format, System.IFormatProvider formatProvi...
    PSComputerName NoteProperty System.String PSComputerName=localhost
    PSShowComputerName NoteProperty System.Boolean PSShowComputerName=False
    RunspaceId NoteProperty System.Guid RunspaceId=186c51c3-d3a5-404c-9a4a-8ff3d3a7f024
    MyFirstCol Property System.String {get;set;}
    MyIntCol Property System.Int32 {get;set;}

    PS C:\> $output


    RunspaceId : 186c51c3-d3a5-404c-9a4a-8ff3d3a7f024
    MyFirstCol : FirstRow
    MyIntCol : 1

    RunspaceId : 186c51c3-d3a5-404c-9a4a-8ff3d3a7f024
    MyFirstCol : SecondRow
    MyIntCol : 2

    考虑以下:
  • 在您的工作中,您已指定 $results.Tables[0]应该被退回。通过指定特定的 Tables 迭代,您将返回描述该表的对象……可能是 DataTable,或者在本例中是 DataRows……而不是您似乎期望的 DataSet?
  • 数据表有行。如果 DataTable 有多个行,powershell 将在 DataRows 集合中返回它,正如我在上面演示的那样。您可能会惊讶地发现,这不是单行返回的情况——它只会返回单个 DataRow 对象而不是 DataRow 对象的集合。
  • 如果这确实是您期望的输出,您可能希望通过将输出指定为 @($results.Tables[0]) 来强制它始终在集合中返回。 .这样,您总是知道期待一个集合,并且可以适本地处理结果内容(通过遍历集合来管理单个对象)。
  • 关于.net - Powershell Receive-Job 可以返回数据集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22123173/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com