ps/Modules/Cole.PowerShell.Developer/Public/Invoke-QueryByConnectionString.ps1

85 lines
2.6 KiB
PowerShell
Raw Normal View History

2023-05-30 22:51:22 -07:00
function Invoke-QueryByConnectionString {
param (
[Parameter(Mandatory = $true)]
[string]$ConnectionString,
[Parameter(Mandatory = $true)]
[string]$QueryString
)
$logLead = Get-LogLeadName
$conn = New-Object System.Data.SqlClient.SqlConnection
try {
$conStrBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder($ConnectionString)
} catch [System.Management.Automation.MethodException] {
Write-Warning "$logLead : Provided connection string [$ConnectionString] is invalid. Execution cannot continue."
return $null
}
$conn.ConnectionString = $conStrBuilder.ToString()
Write-Verbose ("$logLead : Connecting to database with connection string {0}" -f $conStrBuilder.ToString())
if (-not (Confirm-DatabaseAccess -ConnectionString $conStrBuilder.ToString())) {
Write-Error "$logLead : You can not connect to the database server, do you have access and is it online?"
return
}
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {
param($sender, $event)
Write-Host $event.Message
};
try {
$conn.add_InfoMessage($handler);
$conn.FireInfoMessageEventOnUserErrors = $true
$conn.Open()
$query = New-Object System.Data.SqlClient.SqlCommand($QueryString, $conn)
$reader = $query.ExecuteReader()
$allResults = New-Object -TypeName "System.Collections.ArrayList"
do {
$currentResults = @()
$columns = @()
for ($i = 0; $i -lt $reader.FieldCount; $i++) {
$columns += $reader.GetName($i)
}
while ($reader.Read()) {
$rowResult = @{}
for ($i = 0; $i -lt $reader.FieldCount; $i++) {
if ($reader.IsDBNull($i)) {
$rowResult[$columns[$i]] = $null
} else {
$rowResult[$columns[$i]] = $reader[$i]
}
}
$currentResults += $rowResult
}
$allResults.Add($currentResults) | Out-Null
} while ($reader.NextResult())
return $allResults
} catch {
Write-Warning "$logLead : An exception occurred while trying to execute the specified query against the database"
Write-Warning "$logLead : $($_.ToString())"
Write-Warning "$logLead : $($_.ScriptStackTrace)"
return $null
} finally {
if (($null -ne $conn) -and ($conn.State -ne [System.Data.ConnectionState]::Closed)) {
$conn.Close()
}
$conn = $null
}
}