Compartir a través de


Tutorial: Uso de una base de datos de SQL Server en una aplicación de Windows

La aplicación puede conectarse directamente a una base de datos de SQL Server y, a continuación, almacenar y recuperar datos mediante clases del espacio de nombres System.Data.SqlClient.

Comenzando

En esta guía, le mostraremos una manera de hacerlo en las aplicaciones que usan el Windows App SDK. Si instala la base de datos de ejemplo Northwind en la instancia de SQL Server y, a continuación, usará estos fragmentos de código, terminará con una interfaz de usuario básica que muestra productos de la base de datos de ejemplo Northwind.

Productos Northwind

Sugerencia

También puede obtener scripts para crear las bases de datos de ejemplo Northwind y pubs desde el repositorio de GitHub de SQL Server Samples.

Los fragmentos de código que aparecen en esta guía se basan en esta aplicación de muestra de UWP.

En primer lugar, configura la solución

Para conectar la aplicación directamente a una base de datos de SQL Server, la aplicación puede tener como destino cualquier versión mínima de Windows compatible con Windows App SDK. Puede encontrar esa información en la página de propiedades del proyecto.

  1. Abra el archivo Package.appxmanifest del proyecto de Windows App SDK en el diseñador de manifiestos.
  2. En la pestaña Capabilities, active la casilla de verificación Autenticación Empresarial si utiliza la autenticación de Windows para autenticar su SQL Server.

Funcionalidad de autenticación empresarial

Importante

También deberá seleccionar Internet (cliente y Server), Internet (Client) y Private Networks (Client & Server), independientemente de si usa o no la autenticación de Windows.

Agregar y recuperar datos en una base de datos de SQL Server

En esta sección, haremos lo siguiente:

1️⃣ Agregar una cadena de conexión.

2️⃣ Creación de una clase que contenga los datos de productos.

3️⃣ Recuperar productos de la base de datos SQL Server.

4️⃣ Adición de una interfaz de usuario básica.

5️⃣ Llena la IU con productos.

Nota

En esta sección se muestra una manera de organizar el código de acceso a los datos. Solo está pensado para proporcionar un ejemplo de cómo puede usar System.Data.SqlClient para almacenar y recuperar datos de una base de datos de SQL Server. Puedes organizar el código de la manera que tenga más sentido para el diseño de la aplicación.

Agregar una cadena de conexión

En el archivo App.xaml.cs, agregue una propiedad a la clase App, que proporcione a otras clases de la solución acceso a la cadena de conexión.

Nuestra connection string apunta a la base de datos Northwind en una instancia de SQL Server Express. La cadena de conexión en este fragmento de código asume que mantuvo el nombre de instancia predeterminado SQLEXPRESS al instalar SQL Server Express. Puede realizar cambios en el connection string para que coincidan con la instancia de SQL Server, la base de datos y el método de autenticación.

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

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

    ...
}

Importante

En las aplicaciones de producción, la información de conexión debe almacenarse de forma segura en la configuración de la aplicación (consulte Agregar Azure App Configuration mediante Visual Studio Connected Services). Las cadenas de conexión y otros secretos nunca deben codificarse de forma rígida.

Creación de una clase que contenga los datos de productos

Vamos a crear una clase que implemente el evento INotifyPropertyChanged para que podamos enlazar atributos de la interfaz de usuario XAML a las propiedades de esta clase.

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));
    }
}

Recuperación de productos de la base de datos de SQL Server

En el archivo MainWindow.xaml.cs del proyecto de Windows App SDK, cree un método que obtenga productos de la base de datos de ejemplo Northwind y, a continuación, los devuelve como una ObservableCollection colección de instancias de Product.

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;
}

Adición de una interfaz de usuario básica

Agregue el código XAML siguiente al archivo MainWindow.xaml del proyecto de Windows App SDK.

Este código XAML crea un elemento ListView para mostrar cada producto que devuelvas en el fragmento de código anterior y enlaza los atributos de cada fila de ListView a las propiedades que hemos definido en la clase 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>

Presentación de productos en ListView

Abra el archivo MainWindow.xaml.cs y agregue código al constructor de la clase MainWindow que establece la propiedad ItemSource de ListView en ObservableCollection de las instancias de Product.

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

Inicia el proyecto y verás que los productos de la base de datos de ejemplo Northwind aparecen en la interfaz de usuario.

Productos Northwind

Explore el espacio de nombres System.Data.SqlClient para ver qué otras cosas puede hacer con los datos de la base de datos de SQL Server.

Sugerencia

Intente preguntar Microsoft Copilot para obtener ayuda con las consultas SQL. Copilot puede ayudarle a escribir consultas SQL y sugerir formas de mejorar el código.

¿Tienes problemas para conectarte a la base de datos?

En la mayoría de los casos, es necesario cambiar algún aspecto de la configuración de SQL Server. Si puede conectarse a la base de datos desde otro tipo de aplicación de escritorio, como una aplicación de Windows Forms o WPF, asegúrese de que ha habilitado TCP/IP para SQL Server. Puedes hacerlo en la consola de Administración de equipos. (Consulte Windows Tools/Administrative Tools para obtener más información).

Administrar equipos

A continuación, asegúrese de que el servicio SQL Server Browser se está ejecutando.

SQL Server Browser Service

Paso siguiente