24/04/2008
Recuperare un set di dati da SQL Server
Poichè Windows PowerShell è integrato in massima parte con il framework Microsoft .NET, è possibile sfruttare le potenzialità di quest'ultimo per effettuare operazioni di accesso ai dati all'interno della shell; alcune attività, come ad esempio il recupero dei dati da un database o l'esecuzione di una stored procedure, possono essere inglobate con estrema facilità all'interno dei nostri script.
In questo snippet viene illustrata una funzione di recupero di un set di dati da SQL Server, a partire da una stringa di connessione ed un comando SQL. La stessa funzione può essere estesa con estrema facilità per supportare altri database, tramite il supporto ODBC ed OLEDB.
Ecco il codice della funzione:
function Execute-SqlCommand()
{
# Definizione dei parametri accettati dalla funzione
param
(
[String]$ConnectionString = $(throw "Il parametro -ConnectionString è obbligatorio."),
[String]$CommandText = $(throw "Il parametro -CommandText è obbligatorio.")
)
# Crea la connessione verso SQL Server, con la stringa di connessione specificata
$con = New-Object System.Data.SqlClient.SqlConnection $ConnectionString
# Crea ed inizializza il comando di acquisizione dei dati
$cmd = $con.CreateCommand()
$cmd.CommandText = $CommandText
# In caso di problemi, provvede a chiudere comunque la connessione
trap
{
$con.Close()
throw $_
}
# Apre la connessione ed esegue il reader sul comando specificato
$con.Open()
$reader = $cmd.ExecuteReader()
# Fino a quando sono presenti dati nel reader esegue il blocco interno
while ($reader.Read()) {
# Output a video di tutte gli attributi della riga corrente
$row = New-Object PSObject
for ($column = 0; $column -lt $reader.FieldCount; $column++)
{
$row |
Add-Member NoteProperty ($reader.GetName($column)) ($reader.GetValue($column))
}
$row
}
# Chiude reader e connessione
$reader.Close()
$con.Close()
}
Richiamare la funzione è semplice come eseguire questa riga di codice:
$connectionString = 'Data Source=local;Integrated Security=True'
$commandText = 'SELECT * FROM INFORMATION_SCHEMA.Tables'
Execute-SqlCommand $connectionString $commandText