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[]
.
可能是您在函数中的其他位置有未捕获的输出.在你的情况下,Fill
返回一个int
.尝试将此添加到函数调用的末尾:
| Out-Null
Run Code Online (Sandbox Code Playgroud)
例如,
$adapter.Fill($dt) | Out-Null
Run Code Online (Sandbox Code Playgroud)
如果任何语句返回一个值并且您没有捕获它,则输出将包含在您的返回值中,并且由于此时您将有多个返回值,PowerShell会将它们全部填充到数组中.
另一种可能性是PowerShell将所有类型的返回集合转换为Object[]
s.使用,
运算符返回未拼写的值:
return , $dt
Run Code Online (Sandbox Code Playgroud)
的,
创建仅包含下面的值的数组.就像我猜的那样,这会导致PowerShell自动展开最外面的数组并保留值,因为实际的返回值现在是一个只包含单个值的数组.
该return
实际上是可选的,因为未捕获的值都包含在返回值.
我昨天自己碰到了这个.我不能为我的生活弄清楚为什么有人会认为默默地转换Object[]
为有用.
归档时间: |
|
查看次数: |
7499 次 |
最近记录: |