In diesem Beitrag erstellen wir ein PowerShell Universal Dashboard, das grundlegende CRUD-Operationen in SQL ausführen kann.
Wir nutzen eine einfache User-Tabelle, um Datensätze mit Schaltflächen, Formularen und einer UD-Tabelle hinzuzufügen, zu aktualisieren, zu lesen und zu löschen. Am Ende dieser Übung haben Sie ein Dashboard, das wie das unten gezeigte aussieht.

Voraussetzungen
Dieser Beitrag setzt voraus, dass Microsoft SQL Server installiert ist, mit einer Datenbank namens universal und einer Tabelle namens User. Die User-Tabelle hat die Spalten Id, Name, Role und CreatedDate.

Wir nutzen außerdem dbatools, um die Datenbank abzufragen:
Install-Module dbatools
Das Dashboard erstellen
Erstellen Sie zuerst ein Dashboard. Dieses Beispiel verwendet PowerShell 7.2 und das Standardframework. Klicken Sie in PowerShell Universal auf User Interfaces > Dashboards > Create New Dashboard. Aktivieren Sie Auto-Deploy, damit das Dashboard neu geladen wird, wenn Sie Änderungen speichern.
Sobald das Dashboard existiert, öffnen Sie es über Details und beginnen Sie mit der Bearbeitung des Codes. Erstellen Sie zwei Variablen für die SQL-Instanz und den Datenbanknamen. Dieses Beispiel verwendet integrierte Authentifizierung; Sie können auch Anmeldeinformationen für Ihre Datenbank übergeben.
New-UDDashboard -Title 'Users' -Content {
$SqlInstance = '(localdb)\MSSQLLocalDB'
$Database = 'universal'
}
Benutzer in einer Tabelle anzeigen
New-UDTable unterstützt serverseitige Verarbeitung, sodass Sortieren, Filtern und Paging in SQL erfolgen können, statt jede Zeile in den Browser zu laden.
Beginnen Sie mit einer Funktion, die eine SQL-Instanz und einen Datenbanknamen entgegennimmt:
function New-UserTable {
param($SqlInstance, $Database)
}
Definieren Sie als Nächstes die Spalten. Name und Role werden unverändert angezeigt und ermöglichen serverseitiges Filtern. CreatedDate wird mit New-UDDateTime für ein besser lesbares Datum gerendert.
$TableColumns = @(
New-UDTableColumn -Title 'Name' -Property 'Name' -Filter
New-UDTableColumn -Title 'Role' -Property 'Role' -Filter
New-UDTableColumn -Title 'Created' -Property 'CreatedDate' -Render {
New-UDDateTime $EventData.CreatedDate
}
)
Packen Sie New-UDTable in New-UDDynamic, damit Sie die Tabelle nach Änderungen neu laden können. Übergeben Sie die Spalten, aktivieren Sie Sortieren, Filtern und Paging, und nutzen Sie das Dense-Format, um Leerraum zu reduzieren. -LoadData ruft SQL auf, um Zeilen für den aktuellen Tabellenstatus zu laden.
Innerhalb von -LoadData verwenden Sie Invoke-DbaQuery, um Datensätze zu zählen, Sortierung und Filter anzuwenden, Ergebnisse zu paginieren und Daten mit Out-UDTableData zurückzugeben:
function New-UserTable {
param($SqlInstance, $Database)
$TableColumns = @(
New-UDTableColumn -Title 'Name' -Property 'Name' -Filter
New-UDTableColumn -Title 'Role' -Property 'Role' -Filter
New-UDTableColumn -Title 'Created' -Property 'CreatedDate' -Render {
New-UDDateTime $EventData.CreatedDate
}
)
New-UDDynamic -Id 'UserTable' -Content {
New-UDTable -LoadData {
$TableData = ConvertFrom-Json $Body
$OrderBy = $TableData.orderBy.field
if ($OrderBy -eq $null) {
$OrderBy = 'Name'
}
$OrderDirection = $TableData.OrderDirection
if ($OrderDirection -eq $null) {
$OrderDirection = 'asc'
}
$Where = ' '
$SqlParameters = $null
$CountSqlParameters = $null
if ($TableData.Filters) {
$SqlParameters = @()
$CountSqlParameters = @()
$Where = 'WHERE '
foreach ($filter in $TableData.Filters) {
$SqlParameters += New-DbaSqlParameter -Name $filter.Id -Value "%$($filter.Value)%"
$CountSqlParameters += New-DbaSqlParameter -Name $filter.Id -Value "%$($filter.Value)%"
$Where += $filter.id + " LIKE @$($filter.Id) AND "
}
$Where += ' 1 = 1'
}
$PageSize = $TableData.PageSize
$Offset = $TableData.Page * $PageSize
$Parameters = @{
SqlInstance = $SqlInstance
Database = $Database
Query = "SELECT COUNT(*) AS count FROM [User] $Where"
SqlParameter = $CountSqlParameters
}
$Count = Invoke-DbaQuery @Parameters
$Parameters = @{
SqlInstance = $SqlInstance
Database = $Database
Query = "SELECT * FROM [User] $Where ORDER BY $OrderBy $OrderDirection OFFSET $Offset ROWS FETCH NEXT $PageSize ROWS ONLY"
SqlParameter = $SqlParameters
}
$Data = Invoke-DbaQuery @Parameters
$Data | Out-UDTableData -Page $TableData.page -TotalCount $Count.Count -Properties $TableData.properties
} -Columns $TableColumns -Sort -Filter -Paging -Dense
}
}
Fügen Sie die Tabellenfunktion dem Dashboard hinzu:
New-UDDashboard -Title 'Users' -Content {
$SqlInstance = '(localdb)\MSSQLLocalDB'
$Database = 'universal'
New-UserTable -SqlInstance $SqlInstance -Database $Database
}

Benutzer zur Datenbank hinzufügen
Wenn Benutzer in der Tabelle sichtbar sind, fügen Sie eine Schaltfläche hinzu, um neue anzulegen.
Erstellen Sie eine Funktion, die $SqlInstance und $Database entgegennimmt:
function New-AddUserButton {
param($SqlInstance, $Database)
}
Erstellen Sie dann einen New-UDButton mit Symbol, Text und einem OnClick-Handler, der ein Modal öffnet:
New-UDButton -Icon (New-UDIcon -Icon 'UserPlus') -Text 'Add' -OnClick {
Show-UDModal -Content {
}
}
Definieren Sie im Modal ein New-UDForm mit einem Name-Textfeld und einer Role-Auswahl:
New-UDForm -Content {
New-UDTextbox -Id 'Name'
New-UDSelect -Id 'Role' -Option {
New-UDSelectOption -Name 'Administrator' -Value 'Admin'
New-UDSelectOption -Name 'Human Resources' -Value 'HR'
New-UDSelectOption -Name 'Development' -Value 'Dev'
}
} -OnSubmit {
}
Im OnSubmit-Handler rufen Sie Invoke-DbaQuery mit Parametern aus $EventData auf, blenden Sie das Modal aus und aktualisieren Sie die Tabelle mit Sync-UDElement:
function New-AddUserButton {
param($SqlInstance, $Database)
New-UDButton -Icon (New-UDIcon -Icon 'UserPlus') -Text 'Add' -OnClick {
Show-UDModal -Content {
New-UDForm -Content {
New-UDTextbox -Id 'Name'
New-UDSelect -Id 'Role' -Option {
New-UDSelectOption -Name 'Administrator' -Value 'Admin'
New-UDSelectOption -Name 'Human Resources' -Value 'HR'
New-UDSelectOption -Name 'Development' -Value 'Dev'
}
} -OnSubmit {
$Name = New-DbaSqlParameter -Name 'name' -Value $EventData.Name
$Role = New-DbaSqlParameter -Name 'role' -Value $EventData.Role
$Parameters = @{
SqlInstance = $SqlInstance
Database = $Database
Query = 'INSERT INTO [User] (Name, Role, CreatedDate) VALUES (@name, @role, GetDate())'
SqlParameter = @($Name, $Role)
}
Invoke-DbaQuery @Parameters | Out-Null
Hide-UDModal
Sync-UDElement -Id 'UserTable'
}
}
}
}
Verbinden Sie die Schaltfläche im Dashboard oberhalb der Tabelle:
New-UDDashboard -Title 'Users' -Content {
$SqlInstance = '(localdb)\MSSQLLocalDB'
$Database = 'universal'
New-AddUserButton -SqlInstance $SqlInstance -Database $Database
New-UserTable -SqlInstance $SqlInstance -Database $Database
}
Benutzer in der Datenbank bearbeiten
Das Bearbeiten folgt demselben Modal-Muster. Übergeben Sie die ausgewählte Zeile an die Edit-Schaltfläche, füllen Sie das Formular mit -Value und -DefaultValue vor und führen Sie beim Absenden ein UPDATE aus.
function New-UserEditButton {
param($EventData, $SqlInstance, $Database)
New-UDButton -Icon (New-UDIcon -Icon 'UserEdit') -Text 'Edit' -OnClick {
$RecordId = $EventData.Id
Show-UDModal -Content {
New-UDForm -Content {
New-UDTextbox -Value $EventData.Name -Id 'Name'
New-UDSelect -DefaultValue $EventData.Role -Id 'Role' -Option {
New-UDSelectOption -Name 'Administrator' -Value 'Admin'
New-UDSelectOption -Name 'Human Resources' -Value 'HR'
New-UDSelectOption -Name 'Development' -Value 'Dev'
}
} -OnSubmit {
$Name = New-DbaSqlParameter -Name 'name' -Value $EventData.Name
$Role = New-DbaSqlParameter -Name 'role' -Value $EventData.Role
$Parameters = @{
SqlInstance = $SqlInstance
Database = $Database
Query = "UPDATE [User] SET name = @name, role = @role WHERE Id = $RecordId"
SqlParameter = @($Name, $Role)
}
Invoke-DbaQuery @Parameters | Out-Null
Hide-UDModal
Sync-UDElement -Id 'UserTable'
}
}
}
}
Fügen Sie eine Edit-Spalte hinzu, die die aktuelle Zeile an die Schaltfläche übergibt:
$TableColumns = @(
New-UDTableColumn -Title 'Name' -Property 'Name' -Filter
New-UDTableColumn -Title 'Role' -Property 'Role' -Filter
New-UDTableColumn -Title 'Created' -Property 'CreatedDate' -Render {
New-UDDateTime $EventData.CreatedDate
}
New-UDTableColumn -Title 'Edit' -Property 'Edit' -Render {
New-UserEditButton -EventData $EventData -SqlInstance $SqlInstance -Database $Database
}
)
Benutzer aus SQL löschen
Die Delete-Schaltfläche überspringt das Modal. Sie führt ein DELETE aus und aktualisiert danach die Tabelle:
function New-UserDeleteButton {
param($EventData, $SqlInstance, $Database)
New-UDButton -Icon (New-UDIcon -Icon 'UserTimes') -Text 'Delete' -OnClick {
$RecordId = $EventData.Id
$Parameters = @{
SqlInstance = $SqlInstance
Database = $Database
Query = "DELETE FROM [User] WHERE Id = $RecordId"
}
Invoke-DbaQuery @Parameters | Out-Null
Sync-UDElement -Id 'UserTable'
}
}
Platzieren Sie Edit und Delete in derselben Spalte:
$TableColumns = @(
New-UDTableColumn -Title 'Name' -Property 'Name' -Filter
New-UDTableColumn -Title 'Role' -Property 'Role' -Filter
New-UDTableColumn -Title 'Created' -Property 'CreatedDate' -Render {
New-UDDateTime $EventData.CreatedDate
}
New-UDTableColumn -Title 'Edit' -Property 'Edit' -Render {
New-UserEditButton -EventData $EventData -SqlInstance $SqlInstance -Database $Database
New-UserDeleteButton -EventData $EventData -SqlInstance $SqlInstance -Database $Database
}
)
Fazit
Sie haben jetzt ein Dashboard, das direkt mit SQL für Create, Read, Update und Delete spricht. Von hier aus könnten Sie Eingaben validieren, Steppers für komplexere Formulare nutzen oder vor dem Löschen eines Benutzers warnen. Der vollständige Quellcode des Dashboards steht unten. Dieser Beitrag wurde mit PowerShell Universal 2.5.5 geschrieben.
function New-AddUserButton {
param($SqlInstance, $Database)
New-UDButton -Icon (New-UDIcon -Icon 'UserPlus') -Text 'Add' -OnClick {
Show-UDModal -Content {
New-UDForm -Content {
New-UDTextbox -Id 'Name'
New-UDSelect -Id 'Role' -Option {
New-UDSelectOption -Name 'Administrator' -Value 'Admin'
New-UDSelectOption -Name 'Human Resources' -Value 'HR'
New-UDSelectOption -Name 'Development' -Value 'Dev'
}
} -OnSubmit {
$Name = New-DbaSqlParameter -Name 'name' -Value $EventData.Name
$Role = New-DbaSqlParameter -Name 'role' -Value $EventData.Role
$Parameters = @{
SqlInstance = $SqlInstance
Database = $Database
Query = 'INSERT INTO [User] (Name, Role, CreatedDate) VALUES (@name, @role, GetDate())'
SqlParameter = @($Name, $Role)
}
Invoke-DbaQuery @Parameters | Out-Null
Hide-UDModal
Sync-UDElement -Id 'UserTable'
}
}
}
}
function New-UserEditButton {
param($EventData, $SqlInstance, $Database)
New-UDButton -Icon (New-UDIcon -Icon 'UserEdit') -Text 'Edit' -OnClick {
$RecordId = $EventData.Id
Show-UDModal -Content {
New-UDForm -Content {
New-UDTextbox -Value $EventData.Name -Id 'Name'
New-UDSelect -DefaultValue $EventData.Role -Id 'Role' -Option {
New-UDSelectOption -Name 'Administrator' -Value 'Admin'
New-UDSelectOption -Name 'Human Resources' -Value 'HR'
New-UDSelectOption -Name 'Development' -Value 'Dev'
}
} -OnSubmit {
$Name = New-DbaSqlParameter -Name 'name' -Value $EventData.Name
$Role = New-DbaSqlParameter -Name 'role' -Value $EventData.Role
$Parameters = @{
SqlInstance = $SqlInstance
Database = $Database
Query = "UPDATE [User] SET name = @name, role = @role WHERE Id = $RecordId"
SqlParameter = @($Name, $Role)
}
Invoke-DbaQuery @Parameters | Out-Null
Hide-UDModal
Sync-UDElement -Id 'UserTable'
}
}
}
}
function New-UserDeleteButton {
param($EventData, $SqlInstance, $Database)
New-UDButton -Icon (New-UDIcon -Icon 'UserTimes') -Text 'Delete' -OnClick {
$RecordId = $EventData.Id
$Parameters = @{
SqlInstance = $SqlInstance
Database = $Database
Query = "DELETE FROM [User] WHERE Id = $RecordId"
}
Invoke-DbaQuery @Parameters | Out-Null
Sync-UDElement -Id 'UserTable'
}
}
function New-UserTable {
param($SqlInstance, $Database)
$TableColumns = @(
New-UDTableColumn -Title 'Name' -Property 'Name' -Filter
New-UDTableColumn -Title 'Role' -Property 'Role' -Filter
New-UDTableColumn -Title 'Created' -Property 'CreatedDate' -Render {
New-UDDateTime $EventData.CreatedDate
}
New-UDTableColumn -Title 'Edit' -Property 'Edit' -Render {
New-UserEditButton -EventData $EventData -SqlInstance $SqlInstance -Database $Database
New-UserDeleteButton -EventData $EventData -SqlInstance $SqlInstance -Database $Database
}
)
New-UDDynamic -Id 'UserTable' -Content {
New-UDTable -LoadData {
$TableData = ConvertFrom-Json $Body
$OrderBy = $TableData.orderBy.field
if ($OrderBy -eq $null) {
$OrderBy = 'Name'
}
$OrderDirection = $TableData.OrderDirection
if ($OrderDirection -eq $null) {
$OrderDirection = 'asc'
}
$Where = ' '
$SqlParameters = $null
$CountSqlParameters = $null
if ($TableData.Filters) {
$SqlParameters = @()
$CountSqlParameters = @()
$Where = 'WHERE '
foreach ($filter in $TableData.Filters) {
$SqlParameters += New-DbaSqlParameter -Name $filter.Id -Value "%$($filter.Value)%"
$CountSqlParameters += New-DbaSqlParameter -Name $filter.Id -Value "%$($filter.Value)%"
$Where += $filter.id + " LIKE @$($filter.Id) AND "
}
$Where += ' 1 = 1'
}
$PageSize = $TableData.PageSize
$Offset = $TableData.Page * $PageSize
$Parameters = @{
SqlInstance = $SqlInstance
Database = $Database
Query = "SELECT COUNT(*) AS count FROM [User] $Where"
SqlParameter = $CountSqlParameters
}
$Count = Invoke-DbaQuery @Parameters
$Parameters = @{
SqlInstance = $SqlInstance
Database = $Database
Query = "SELECT * FROM [User] $Where ORDER BY $OrderBy $OrderDirection OFFSET $Offset ROWS FETCH NEXT $PageSize ROWS ONLY"
SqlParameter = $SqlParameters
}
$Data = Invoke-DbaQuery @Parameters
$Data | Out-UDTableData -Page $TableData.page -TotalCount $Count.Count -Properties $TableData.properties
} -Columns $TableColumns -Sort -Filter -Paging -Dense
}
}
New-UDDashboard -Title 'Users' -Content {
$SqlInstance = '(localdb)\MSSQLLocalDB'
$Database = 'universal'
New-AddUserButton -SqlInstance $SqlInstance -Database $Database
New-UserTable -SqlInstance $SqlInstance -Database $Database
}
Möchten Sie es selbst ausprobieren? Holen Sie sich PowerShell Universal im Download Center.

Adam Driscoll