From 8e5a02b968b5fe997343c5d7fe26be37409da9a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Doma=C5=84ski?= Date: Wed, 3 Jun 2026 13:39:39 +0000 Subject: [PATCH] Jun 3, 2026, 3:39 PM --- toolbox/Modules/SQLManager.psm1 | 76 +++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/toolbox/Modules/SQLManager.psm1 b/toolbox/Modules/SQLManager.psm1 index b2d8d0d..7574bfa 100644 --- a/toolbox/Modules/SQLManager.psm1 +++ b/toolbox/Modules/SQLManager.psm1 @@ -15,74 +15,86 @@ function Import-DBAToolBoxDependencies { function Test-SQLConnection { <# .SYNOPSIS - Tests connection to a SQL Server instance and returns basic info. + Tests connection to a SQL Server instance and returns basic info using native ADO.NET. #> param( [Parameter(Mandatory=$true)] [string]$ServerInstance ) - $connWarnings = $null + $connString = "Server=$ServerInstance;Database=master;Integrated Security=True;Connection Timeout=5;TrustServerCertificate=True;" + $connection = New-Object System.Data.SqlClient.SqlConnection($connString) try { - # Using Test-DbaConnection from dbatools and suppressing console warnings while capturing them - $testResult = Test-DbaConnection -SqlInstance $ServerInstance -ErrorAction Stop -WarningAction SilentlyContinue -WarningVariable connWarnings + $connection.Open() - if ($testResult -and $testResult.Connect -eq $true) { - # If connection is successful, get some basic instance info - $instanceInfo = Get-DbaInstance -SqlInstance $ServerInstance -ErrorAction Stop -WarningAction SilentlyContinue + # Query basic server properties + $cmd = $connection.CreateCommand() + $cmd.CommandText = "SELECT @@VERSION as Version, SERVERPROPERTY('Edition') as Edition, SERVERPROPERTY('MachineName') as Instance, SERVERPROPERTY('ProductVersion') as VerString" + $reader = $cmd.ExecuteReader() + + if ($reader.Read()) { + $ver = $reader["VerString"].ToString() + $edition = $reader["Edition"].ToString() + $instance = $reader["Instance"].ToString() + return @{ Success = $true - Instance = $instanceInfo.Name - Version = $instanceInfo.VersionString - Edition = $instanceInfo.Edition + Instance = if ([string]::IsNullOrEmpty($instance)) { $ServerInstance } else { $instance } + Version = $ver + Edition = $edition Status = "Online" } } else { - $errDetail = "Connection failed." - if ($connWarnings) { - $errDetail = "$errDetail ($($connWarnings -join '; '))" - } - return @{ Success = $false; Error = $errDetail } + return @{ Success = $false; Error = "Failed to read server properties." } } } catch { - $errMsg = $_.Exception.Message - if ($connWarnings) { - $errMsg = "$errMsg ($($connWarnings -join '; '))" + return @{ Success = $false; Error = $_.Exception.Message } + } finally { + if ($null -ne $connection -and $connection.State -eq [System.Data.ConnectionState]::Open) { + $connection.Close() } - return @{ Success = $false; Error = $errMsg } } } function Get-SQLDatabases { <# .SYNOPSIS - Gets database information for a SQL Server instance. + Gets database information for a SQL Server instance using native ADO.NET. #> param( [Parameter(Mandatory=$true)] [string]$ServerInstance ) - $dbWarnings = $null + $connString = "Server=$ServerInstance;Database=master;Integrated Security=True;Connection Timeout=5;TrustServerCertificate=True;" + $connection = New-Object System.Data.SqlClient.SqlConnection($connString) try { - # Using Get-DbaDatabase from dbatools and suppressing console warnings while capturing them - $databases = Get-DbaDatabase -SqlInstance $ServerInstance -ErrorAction Stop -WarningAction SilentlyContinue -WarningVariable dbWarnings + $connection.Open() + + # Query databases from sys.databases + $cmd = $connection.CreateCommand() + $cmd.CommandText = "SELECT name, state_desc, (size * 8.0 / 1024.0) as size_mb, recovery_model_desc FROM sys.databases" + + $adapter = New-Object System.Data.SqlClient.SqlDataAdapter($cmd) + $table = New-Object System.Data.DataTable + $null = $adapter.Fill($table) + $dbList = @() - foreach ($db in $databases) { + foreach ($row in $table.Rows) { $dbList += [pscustomobject]@{ - Name = $db.Name - Status = $db.Status - Size = $db.Size - RecoveryModel = $db.RecoveryModel + Name = $row.name + Status = $row.state_desc + Size = "$([Math]::Round([double]$row.size_mb, 2)) MB" + RecoveryModel = $row.recovery_model_desc } } return $dbList } catch { - $errMsg = $_.Exception.Message - if ($dbWarnings) { - $errMsg = "$errMsg ($($dbWarnings -join '; '))" + throw "Failed to get databases: $($_.Exception.Message)" + } finally { + if ($null -ne $connection -and $connection.State -eq [System.Data.ConnectionState]::Open) { + $connection.Close() } - throw "Failed to get databases: $errMsg" } }