Esercitazione: Usare un database SQL Server in un'app Windows

L'app può connettersi direttamente a un database SQL Server e quindi archiviare e recuperare i dati utilizzando le classi dello spazio dei nomi Microsoft.Data.SqlClient.

Iniziare

In questa guida verrà illustrato un modo per eseguire questa operazione nelle app che usano il SDK per app di Windows. Se si installa il database di esempio Northwind nell'istanza di SQL Server e quindi si usano questi frammenti di codice, si otterrà un'interfaccia utente di base che mostra i prodotti del database di esempio Northwind.

Prodotti Northwind

Suggerimento

È anche possibile ottenere script per creare i database di esempio Northwind e pubs dal repository SQL Server Samples GitHub.

I frammenti di codice visualizzati in questa guida si basano su questa app di esempio.

Innanzitutto configura la soluzione

Per connettere l'app direttamente a un database SQL Server, l'app può avere come destinazione qualsiasi versione minima di Windows supportata da SDK per app di Windows. Puoi trovare queste informazioni nella pagina delle proprietà del progetto.

  1. Aprire il file Package.appxmanifest del progetto SDK per app di Windows nella finestra di progettazione del manifesto.
  2. Installare il pacchetto client SQL per i modelli di progetto di .NET correnti. Nella console di Gestione pacchetti eseguire Install-Package Microsoft.Data.SqlClient.
  3. Nella scheda Capabilities selezionare la casella di controllo Enterprise Authentication se si usa l'autenticazione Windows per autenticare il SQL Server.

Funzionalità di autenticazione Enterprise

Importante

È anche necessario selezionare Internet (Client & Server), Internet (Client) e Private Networks (Client & Server), indipendentemente dal fatto che si stia usando o meno Windows Autenticazione.

Aggiungere e recuperare dati in un database SQL Server

In questa sezione eseguiremo queste operazioni:

1️⃣ Aggiungere un stringa di connessione.

2️⃣ Creare una classe per contenere i dati del prodotto.

3️⃣ Recuperare i prodotti dal database SQL Server.

4️⃣ Aggiungere un'interfaccia utente di base.

5️⃣ Popolare l'interfaccia utente con i prodotti.

Nota

Questa sezione mostra un modo per organizzare il codice di accesso ai dati. È destinato solo a fornire un esempio di come è possibile usare Microsoft. Data.SqlClient per archiviare e recuperare dati da un database SQL Server. Puoi organizzare il codice nel modo più appropriato per la progettazione dell'applicazione.

Aggiungere un stringa di connessione

Nel file App.xaml.cs aggiungere una proprietà alla classe App, che fornisce ad altre classi nella soluzione l'accesso al stringa di connessione.

La stringa di connessione si riferisce al database Northwind in un'istanza di SQL Server Express. La stringa di connessione in questo frammento presuppone che il nome dell'istanza predefinita sia SQLEXPRESS quando si installa SQL Server Express. È possibile apportare modifiche al stringa di connessione in modo che corrispondano all'istanza, al database e al metodo di autenticazione SQL Server.

sealed partial class App : Application
{
    // Connection string for using Windows Authentication.
    private string connectionString =
        @"Data Source=.\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI;Encrypt=True;TrustServerCertificate=True";

    public string ConnectionString { get => connectionString; set => connectionString = value; }

    ...
}

Importante

Nelle applicazioni di produzione, le informazioni di connessione devono essere archiviate in modo sicuro nella configurazione dell'app (vedere Aggiungi Configurazione app di Azure usando Visual Studio Servizi connessi). Le stringhe di connessione e altri segreti non devono essere mai hard-coded.

La stringa di connessione di esempio considera attendibile il certificato locale di SQL Server Express per lo sviluppo. Nell'ambiente di produzione installare un certificato server verificabile e impostare TrustServerCertificate=False.

Creare una classe per contenere i dati dei prodotti

Creeremo una classe che implementa l'evento INotifyPropertyChanged in modo da poter associare gli attributi nell'interfaccia utente XAML alle proprietà di questa classe.

public class Product : INotifyPropertyChanged
{
    public int ProductID { get; set; }
    public string ProductCode { get { return ProductID.ToString(); } }
    public string ProductName { get; set; }
    public string QuantityPerUnit { get; set; }
    public decimal UnitPrice { get; set; }
    public string UnitPriceString { get { return UnitPrice.ToString("######.00"); } }
    public int UnitsInStock { get; set; }
    public string UnitsInStockString { get { return UnitsInStock.ToString("#####0"); } }
    public int CategoryId { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Recuperare i prodotti dal database SQL Server

Nel file MainWindow.xaml.cs del progetto SDK per app di Windows creare un metodo che ottiene i prodotti dal database di esempio Northwind e quindi li restituisce come ObservableCollection raccolta di istanze di Product.

using Microsoft.Data.SqlClient;

public ObservableCollection<Product> GetProducts(string connectionString)
{
    const string GetProductsQuery = "select ProductID, ProductName, QuantityPerUnit," +
       " UnitPrice, UnitsInStock, Products.CategoryID " +
       " from Products inner join Categories on Products.CategoryID = Categories.CategoryID " +
       " where Discontinued = 0";

    var products = new ObservableCollection<Product>();
    try
    {
        using (var conn = new SqlConnection(connectionString))
        {
            conn.Open();
            if (conn.State == System.Data.ConnectionState.Open)
            {
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = GetProductsQuery;
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var product = new Product();
                            product.ProductID = reader.GetInt32(0);
                            product.ProductName = reader.GetString(1);
                            product.QuantityPerUnit = reader.GetString(2);
                            product.UnitPrice = reader.GetDecimal(3);
                            product.UnitsInStock = reader.GetInt16(4);
                            product.CategoryId = reader.GetInt32(5);
                            products.Add(product);
                        }
                    }
                }
            }
        }
        return products;
    }
    catch (Exception eSql)
    {
        Debug.WriteLine($"Exception: {eSql.Message}");
    }
    return null;
}

Aggiungere un'interfaccia utente di base

Aggiungere il codice XAML seguente al file MainWindow.xaml del progetto SDK per app di Windows.

Questo codice XAML crea una ListView per mostrare ogni prodotto restituito nel frammento precedente e associa gli attributi di ogni riga nel ListView alle proprietà definite nella classe Product.

<Grid Background="{ThemeResource SystemControlAcrylicWindowBrush}">
    <RelativePanel>
        <ListView Name="InventoryList"
                  SelectionMode="Single"
                  ScrollViewer.VerticalScrollBarVisibility="Auto"
                  ScrollViewer.IsVerticalRailEnabled="True"
                  ScrollViewer.VerticalScrollMode="Enabled"
                  ScrollViewer.HorizontalScrollMode="Enabled"
                  ScrollViewer.HorizontalScrollBarVisibility="Auto"
                  ScrollViewer.IsHorizontalRailEnabled="True"
                  Margin="20">
            <ListView.HeaderTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal"  >
                        <TextBlock Text="ID" Margin="8,0" Width="50" Foreground="DarkRed" />
                        <TextBlock Text="Product description" Width="300" Foreground="DarkRed" />
                        <TextBlock Text="Packaging" Width="200" Foreground="DarkRed" />
                        <TextBlock Text="Price" Width="80" Foreground="DarkRed" />
                        <TextBlock Text="In stock" Width="80" Foreground="DarkRed" />
                    </StackPanel>
                </DataTemplate>
            </ListView.HeaderTemplate>
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:Product">
                    <StackPanel Orientation="Horizontal" >
                        <TextBlock Name="ItemId"
                                    Text="{x:Bind ProductCode}"
                                    Width="50" />
                        <TextBlock Name="ItemName"
                                    Text="{x:Bind ProductName}"
                                    Width="300" />
                        <TextBlock Text="{x:Bind QuantityPerUnit}"
                                   Width="200" />
                        <TextBlock Text="{x:Bind UnitPriceString}"
                                   Width="80" />
                        <TextBlock Text="{x:Bind UnitsInStockString}"
                                   Width="80" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </RelativePanel>
</Grid>

Mostrare i prodotti in ListView

Aprire il file MainWindow.xaml.cs e aggiungere codice al costruttore della MainWindow classe che imposta la proprietà ItemsSource di ListView su ObservableCollection delle Product istanze.

public MainWindow()
{
    this.InitializeComponent();
    InventoryList.ItemsSource = GetProducts((App.Current as App).ConnectionString);
}

Avvia il progetto: i prodotti del database di esempio Northwind vengono visualizzati nell'interfaccia utente.

Prodotti Northwind

Esplora lo spazio dei nomi Microsoft.Data.SqlClient per scoprire quali altre operazioni puoi eseguire con i dati nel database di SQL Server.

Suggerimento

Provare a chiedere Microsoft Copilot per informazioni sulle query SQL. Copilot consente di scrivere query SQL e suggerire modi per migliorare il codice.

Problemi di connessione al database?

Nella maggior parte dei casi, è necessario modificare alcuni aspetti della configurazione SQL Server. Se è possibile connettersi al database da un altro tipo di applicazione desktop, ad esempio un'applicazione Windows Forms o macchine virtuali Windows, assicurarsi di aver abilitato TCP/IP per SQL Server. Puoi effettuare questo controllo nella console Gestione computer. Per altre informazioni, vedere Windows Tools/Strumenti di amministrazione.

Gestione del computer

Assicurarsi quindi che il servizio browser SQL Server sia in esecuzione.

Servizio SQL Server Browser

Passaggio successivo