I canβt believe it, but everything indicates that my PowerShell code returns the result of a SELECT query that finds 1 record as an object, but if there are two or more records, the same code returns an array of objects. What am I doing wrong?
Below is the code:
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)" }
When $result is only 1 record, $result.Count nothing, and I can access the columns as $result.id and not $result[0].id . If there are 2 or more entries, the opposite is returned.
Please tell me that I am doing something wrong and that this is not how PowerShell works.
source share