Compartir a través de


Uso de una base de datos de SQL Server en una aplicación para UWP

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

En esta guía te mostraremos un modo de hacerlo. Si instalas la base de datos de ejemplo Northwind en la instancia de SQL Server y luego usas estos fragmentos de código, terminarás con una interfaz de usuario básica que muestre los productos de esta base de datos.

Northwind products

Los fragmentos de código que aparecen en esta guía se basan en este ejemplo más completo.

En primer lugar, configura la solución

Para conectar la aplicación directamente a una base de datos SQL Server, asegúrese de que la versión mínima del proyecto está destinada a Windows 10 Fall Creators Update (compilación 16299) o posterior. Puedes encontrar esa información en la página de propiedades del proyecto para UWP.

Minimum version of the Windows SDK

Abre el archivo Package.appxmanifest de tu proyecto para UWP en el diseñador de manifiestos.

En la pestaña Funcionalidades, activa la casilla Enterprise Authentication (Autenticación empresarial) si usas la autenticación de Windows para la autenticación de SQL Server.

Enterprise Authentication Capability

Importante

También debe seleccionar Internet (cliente y servidor), Internet (cliente)y Redes privadas (cliente y servidor), independientemente de si usa o no la autenticación de Windows.

Adición y recuperación de datos en una base de datos de SQL Server

En esta sección, haremos lo siguiente:

1️⃣ Adición de una cadena de conexión.

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

3️⃣ Recuperación de los productos de la base de datos de SQL Server.

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

5️⃣ Llenado de la interfaz de usuario con productos.

Nota

En esta sección se muestra una manera de organizar el código de acceso a los datos. Está concebida únicamente 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.

Adición de una cadena de conexión

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

Nuestra cadena de conexión apunta a la base de datos Northwind en una instancia de SQL Server Express.

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

    // This is an example connection string for using SQL Server Authentication.
    // private string connectionString =
    //     @"Data Source=YourServerName\YourInstanceName;Initial Catalog=DatabaseName; User Id=XXXXX; Password=XXXXX";

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

    ...
}

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 MainPage.xaml.cs del proyecto UWP, cree un método que obtenga productos de la base de datos de ejemplo Northwind y luego los devuelva como una colección ObservableCollection 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

Agrega el siguiente código XAML al archivo MainPage.xaml del proyecto para UWP.

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

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

public MainPage()
{
    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.

Northwind products

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

¿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 puedes conectarte a la base de datos desde otro tipo de aplicación de escritorio, como una aplicación WPF o Windows Forms, asegúrate de que has habilitado TCP/IP para SQL Server. Puedes hacerlo en la consola de Administración de equipos. (Consulte Herramientas de Windows o herramientas administrativas para obtener más información).

Computer Management

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

SQL Server Browser Service

Pasos siguientes

Usar una base de datos ligera para almacenar datos en el dispositivo del usuario

Consulta Usar una base de datos de SQLite en una aplicación para UWP.

Compartir código entre diferentes aplicaciones de varias plataformas

Consulta Compartir código entre una aplicación de escritorio y una aplicación para UWP.

Agregar páginas de detalles maestras con servidores back-end de Azure SQL

Consulta Ejemplo de base de datos de pedidos de clientes.