为什么Powershell认为我试图返回一个对象[]而不是一个DataTable?

Jas*_*ans 9 powershell function return-value

我有以下PS功能:

function GetBuildData {
    [System.Data.SqlClient.SqlConnection] $conn = New-Object System.Data.SqlClient.SqlConnection
    [System.Data.SqlClient.SqlCommand] $cmd = New-Object System.Data.SqlClient.SqlCommand
    [System.Data.SqlClient.SqlDataAdapter] $adapter = New-Object System.Data.SqlClient.SqlDataAdapter
    [System.Data.DataTable] $dt = New-Object System.Data.DataTable

    try {
        [string] $connStr = "myConnectionString"

        $conn.ConnectionString = $connStr
        $cmd.Connection = $conn
        $cmd.CommandText = "SELECT * FROM TestTable"

        $conn.Open

        $adapter.SelectCommand = $cmd

        $adapter.Fill($dt)

        $conn.Close
    }
    catch [system.exception]
    {
        Write-Host $_
    }
    finally {
        $adapter.Dispose
        $cmd.Dispose
        $conn.Dispose
    }

    return $dt
}
Run Code Online (Sandbox Code Playgroud)

为简洁起见,大部分功能已被删除.我遇到的问题是当我像这样调用函数时:

[System.Data.DataTable] $buildData = GetBuildData

我收到以下错误:

无法将"System.Object []"类型的"System.Object []"值转换为"System.Data.DataTable"类型.

为什么Powershell认为我很想在$ dt变量是DataTable时返回一个object []数组?

编辑:

我已经仔细检查,$dt确实包含数据.例如,Rows.Count的数量是1,这是预期的.

jpm*_*c26 16

我不知道人们提出的其他问题,但我可以想到两个可能的原因,你为什么要回来Object[].

  1. 可能是您在函数中的其他位置有未捕获的输出.在你的情况下,Fill返回一个int.尝试将此添加到函数调用的末尾:

    | Out-Null
    
    Run Code Online (Sandbox Code Playgroud)

    例如,

    $adapter.Fill($dt) | Out-Null
    
    Run Code Online (Sandbox Code Playgroud)

    如果任何语句返回一个值并且您没有捕获它,则输出将包含在您的返回值中,并且由于此时您将有多个返回值,PowerShell会将它们全部填充到数组中.

  2. 另一种可能性是PowerShell将所有类型的返回集合转换为Object[]s.使用,运算符返回未拼写的值:

    return , $dt
    
    Run Code Online (Sandbox Code Playgroud)

    ,创建仅包含下面的值的数组.就像我猜的那样,这会导致PowerShell自动展开最外面的数组并保留值,因为实际的返回值现在是一个只包含单个值的数组.

    return实际上是可选的,因为未捕获的值都包含在返回值.

    我昨天自己碰到了这个.我不能为我的生活弄清楚为什么有人会认为默默地转换Object[]为有用.

  • 这就是答案!现在我可以修复我的头部造成的损坏.同上"我不能为我的生活弄清楚为什么有人会认为默默地转换为'对象[]`是有用的." 也许微软与墙壁维修承包商有回扣协议? (2认同)