结果集是 1 条记录的对象,多条记录是数组?

use*_*963 5 mysql powershell dataset dataadapter

我不敢相信,但所有迹象都表明我的 PowerShell 代码正在返回SELECT查找 1 条记录作为对象的查询结果,但如果有两条或更多条记录,则相同的代码返回一个对象数组。我究竟做错了什么?

下面是代码:

function Connect-MySQL([string]$MySQLHost, [string]$user, [string]$pass, [string]$database) { 
    Write-Verbose "Connect-MySQL"
    # Load MySQL .NET Connector Objects 
    [void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data") 

    # Open Connection 
    $connStr = "server=$MySQLHost;port=3306;uid=$user;pwd=$pass;database=$database;Pooling=FALSE" 
    try {
        $con = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr) 
        $con.Open()
    } catch [System.Management.Automation.PSArgumentException] {
        Write-Verbose "Unable to connect to MySQL server, do you have the MySQL connector installed..?"
        Write-Verbose $_
        Exit
    } catch {
        Write-Verbose "Unable to connect to MySQL server..."
        Write-Verbose $_.Exception.GetType().FullName
        Write-Verbose $_.Exception.Message
        exit
    }
    Write-Verbose "Connected to MySQL database $MySQLHost\$database"

    return $con 
}

function Disconnect-MySQL($con) {
    Write-Verbose "Disconnect-MySQL"
    $con.Close()
}

function Execute-MySQLNonQuery($con, [string]$sql) { 
    $cmd = New-Object MySql.Data.MySqlClient.MySqlCommand($sql, $con)            # Create SQL command
    $Rows = $cmd.ExecuteNonQuery()                                               # Execute command
    $cmd.Dispose()                                                               # Dispose of command object
#   if ($Rows) { 
        return $Rows
#   } else { 
#       return $false 
#   } 
} 

function Execute-MySQLQuery($con, [string]$sql) { 
    $cmd = New-Object MySql.Data.MySqlClient.MySqlCommand($sql, $con)            # Create SQL command
    $dataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($cmd)      # Create data adapter from query command
    $dataSet = New-Object System.Data.DataSet                                    # Create dataset
    $dataAdapter.Fill($dataSet, "data") | Out-Null                               # Fill dataset from data adapter, with name "data"              
    $cmd.Dispose()                                                               # Dispose of command object
    return $dataSet.Tables["data"]                                               # Returns an array of results
}


# Connection Variables 
$MySQLHost = '10.10.10.111' 
$user = 'user' 
$pass = 'test' 
$database = 'test_db' 

# Connect to MySQL Database 
$con = Connect-MySQL $MySQLHost $user $pass $database

# Get requests
$sql = "
SELECT *
FROM o365_statuses as x
WHERE x.action = 'Z'
AND x.status = 0"
$result = Execute-MySQLQuery $con $sql

Write-Host $result.Count
Foreach ($r in $result) {
    write-host "$($r.id) $($r.email)"
}
Run Code Online (Sandbox Code Playgroud)

$result只有 1 条记录时,不$result.Count返回任何内容,我可以访问列 as$result.id和 not $result[0].id。如果有 2 个或更多记录返回,则相反。

请告诉我我做错了什么,这不是 PowerShell 的工作方式。

Mic*_*ens 5

PowerShell 根据这个简单的算法返回结果:

  • 多个项目 --> 返回这些项目的数组
  • 只有一件商品 --> 退回商品

通常,使用以下任一方法强制 PowerShell 始终返回数组是一种很好的做法:

,(code)
@(code)
Run Code Online (Sandbox Code Playgroud)

但是,这些运算符并不相同!您可以安全地将@()分组运算符应用于任何事物以强制数组输出——数组始终具有一个Count属性,例如:

$a = @(Get-Process | select -First 2); $a.Count   # returns 2
$a = @(Get-Process | select -First 1); $a.Count   # returns 1
Run Code Online (Sandbox Code Playgroud)

另一方面,逗号数组构造运算符的工作方式如下:

$a = ,(Get-Process | select -First 2); $a.Count   # returns 1
$a = ,(Get-Process | select -First 1); $a.Count   # returns 1
Run Code Online (Sandbox Code Playgroud)

...因为它使用给定的任何内容构建一个嵌套数组。


Rom*_*min 1

函数“展开”返回的集合,即实际上它返回 null (0 个项目)或单个对象(它可能有也可能没有属性Count,在您的情况下它没有)或 2+ 对象的数组(但不是原始集合实例)。

为了解决展开问题,请使用,运算符:

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

逗号运算符创建单个对象(操作数)的数组,即一个新集合。这个新集合也会在返回时展开,但不是递归的。即返回单个对象,它是$Rows同一个实例。