使用函数键入转换

时间:2016-01-09 14:16:08

标签: powershell

我正在攻击许多语言,如C / C ++,Java,C#等。 Powershell只是一个新的列表。所以有时候我会因为简单的事情而失明......我得到了类型转换错误而无法理解为什么......我尝试强烈地输入ps脚本,但是我做错了什么。这里写了两个函数:

function Get-DBConnection
{
[CmdletBinding()]
[OutputType([Npgsql.NpgsqlConnection])]
param
(
    [Parameter(Mandatory = $true,
               Position = 1)]
    [String]$DBServer,
    [Parameter(Mandatory = $true,
               Position = 2)]
    [int]$DBPort,
    [Parameter(Mandatory = $true,
               Position = 3)]
    [string]$DatabaseName,
    [Parameter(Mandatory = $true,
               Position = 4)]
    [string]$UserName,
    [Parameter(Mandatory = $true,
               Position = 5)]
    [string]$Password
)

$DBConnectionString = "server=$MyDBServer;port=$MyDBPort;user id=$MyUid;password=$MyPwd;database=$MyDatabase;pooling=false"
$DBConn = New-Object -TypeName Npgsql.NpgsqlConnection;
$DBConn.ConnectionString = $DBConnectionString
$DBConn.Open

return $DBConn
}

function execute-Query
{
[CmdletBinding()]
[OutputType([System.Data.DataSet])]
param
(
    [Parameter(Mandatory = $true)]
    [Npgsql.NpgsqlConnection]$DBConnection,
    [Parameter(Mandatory = $true)]
    [string]$Query
)

$DBCmd = $DBConnection.CreateCommand()
$DBCmd.CommandText = $Query
$adapter = New-Object -TypeName Npgsql.NpgsqlDataAdapter $DBCmd
$dataset = New-Object -TypeName System.Data.DataSet
$adapter.Fill($dataset)

return $dataset
}

现在在我的脚本中,我尝试按如下方式调用它们:

$MyDBConnection = New-Object -TypeName Npgsql.NpgsqlConnection
$MyResultset = New-Object -TypeName System.Data.DataSet
$query = "SELECT * FROM test_table1;"

$MyDBConnection = Get-DBConnection "servername" 5432 "dbname" "username" "pass"

当使用调试器单步执行脚本时,在调用Get-DBConnection之后,变量 $ MyDBConnection 的类型将更改为 Object [] ! 我了解这里发生了什么。

作为(逻辑)结果,我在调用

时遇到类型转换错误
$MyResultset = execute-Query $MyDBConnection $query

说参数DBConnection(函数中的名称......)无法从 System.Object [] 转换为 Npgsql.NpgsqlConnection

非常感谢任何帮助和解释,这里出了什么问题。

1 个答案:

答案 0 :(得分:0)

使用PowerShell,您不必返回"什么明确的。任何发送到管道的东西都是"返回"。很可能你有两个不同的调用,每个调用都发送到管道,PowerShell会自动转换为一个对象数组。我的猜测是$ DBConn.Open发出一个管道对象,然后你也会回复" $ DBConn。

旁注,在最后一行,不要使用return语句。只需在一行上输入一个变量,它就会被发送到管道。

您的困惑的关键还在于PowerShell使用管道,而不是在其他语言(如C,C ++或C#)中返回。研究管道导致这是为PowerShell编写函数的正确方法