SQL Server CE en Windows Phone Mango

Hola a todos!

Con Windows Phone 7.1 Microsoft ha introducido la posibilidad de usar bases de datos locales en nuestras aplicaciones mediante SQL Server CE (Compact Edition).

SQL Server CE usa archivos sdf para almacenar nuestra base de datos, en Windows Phone 7.1, estos archivos se guardan en nuestro almacenamiento aislado. Como vimos anteriormente una aplicación puede acceder solo al almacenamiento aislado que le corresponde por lo que no podremos compartir una misma base de datos para varias aplicaciones.

El modelo preferido para crear nuestra base de datos y trabajar con ella en esta versión de Windows Phone es el code first, código primero, por el cual deberemos crear nuestras clases e indicar el mapeo a tablas y columnas de cada clase y propiedad y a partir de estas clases crearemos la base de datos en tiempo de ejecución en el terminal, aunque existen herramientas, que veremos más adelante que nos permitirán crear nuestras clases a partir de una base de datos sdf que tengamos en tiempo de desarrollo.

Otra particularidad es que no usaremos Entity Framework para acceder a nuestros datos, en esta versión se ha decidido implementar LINQ TO SQL como ORM.

Por ahora, Windows Phone 7.1, soporta la mayoría de LINQ TO SQL, pero tenemos que prestar atención a ciertas limitaciones:

  • No podremos usar ExecuteCommand, ejecución de T-SQL no está soportada.
  • Objetos de ADO.NET, como DataReaders, no están soportados, todos los resultados se obtendrán como colecciones de objetos especificados por el contexto de datos.
  • Skip() y Take() requieren una lista ordenada para devolver los resultados.

Para empezar a trabajar con SQL Server CE lo primero que necesitamos será añadir una referencia al ensamblado System.Data.Linq en nuestra aplicación y un using del namespace System.Data.Linq.Mapping en nuestra clase. Vamos a crear una clase Customer, en la que podamos almacenar la información de un cliente y decorarla con los atributos necesarios para poder mapearla a una tabla Customers de nuestra futura base de datos

[Table(Name="Customers")]
public class Customer
{
    [Column(IsPrimaryKey=true, IsDbGenerated=true)]
    public int CustomerId { get; set; }
    [Column(CanBeNull=false)]
    public String FirstName { get; set; }
    [Column(CanBeNull=true)]
    public String LastName { get; set; }
}

Como podemos ver, es una clase normal y corriente la cual hemos decorado con atributos de System.Data.Linq.Mapping, Table para la clase, identificándola como una tabla, con el parámetro Name que nos permite especificar el nombre de la tabla relacionada en la base de datos (Customers) y Column para las propiedades, indicando si se trata de una clave primaria, si es autogenerada por la base de datos, si puede contener valores nulos y más parámetros que tenemos a nuestra disposición.

Una vez que tenemos creada nuestra clase de datos Customer, vamos a crear el contexto de datos de nuestra aplicación. Este contexto heredará de la clase DataContext del ensamblado System.Data.Linq, y expondrá toda la funcionalidad necesaria para poder trabajar con nuestra base de datos. Por ahora necesitamos la funcionalidad standard y que además nos permita trabajar con nuestra clase Customer:

public class AppDbContext : DataContext
{
    public AppDbContext(string connectionString) 
                            :base(connectionString)
    {

    }

    public Table<Customer> Customers
    {
        get
        {
            return this.GetTable<Customer>();
        }
    }
}

Es una clase muy sencilla, al heredar de DataContext ya tenemos toda la funcionalidad requerida implementada en nuestra clase base, simplemente añadimos una propiedad de tipo Table de Customer para exponer nuestra tabla Customers.

El constructor de nuestra clase AppDbContext requiere un parámetro que contenga la cadena de conexión hacia la base de datos que deseamos usar. En Windows Phone 7.1 el formato de cadena de conexión es especial y distinto del que estamos acostumbrados normalmente. Como nuestra base de datos se encuentra en el almacenamiento aislado la cadena de conexión se compone de “Data Source=’isostore:/” y la ruta en el almacenamiento aislado donde está nuestro sdf:

Data Source='isostore:/CustomersDb.sdf'

Lo único que debemos hacer para comenzar a trabajar con nuestra base de datos es, usando nuestra clase AppDbContext, consultar si nuestra base de datos existe y si no, crearla:

using (AppDbContext context = new AppDbContext("Data Source='isostore:/CustomersDb.sdf'"))
{
    if (!context.DatabaseExists())
        context.CreateDatabase();
}

Una vez que hemos realizado esto, podemos crear datos por defecto de una forma realmente sencilla, primero creamos una lista de customer con los datos que deseamos crear:

List<Customer> customers = new List<Customer>()
{
    new Customer() 
    { 
        FirstName = "Yeray", LastName = "Julián" 
    },
    new Customer()
    {
        FirstName = "Pedro", LastName = "Picapiedra"                        
    }
};

A continuación, los añadimos a la propiedad Customers de nuestra clase AppDbContext usando el método InsertAllOnSubmit, este método añade a la propiedad Customers los registros que hemos creado con un estado de pendiente de inserción:

context.Customers.InsertAllOnSubmit(customers);

Y por último solo nos queda indicar a nuestra clase AppDbContext que envíe los cambios a la base de datos usando el método SubmitChanges:

context.SubmitChanges();

Recuperar datos de nuestra base de datos también es muy sencillo, usando LINQ TO SQL, podemos consultar la propiedad Customers de nuestro contexto:

using (AppDbContext context = new AppDbContext("Data Source='isostore:/CustomersDb.sdf'"))
{
    Customers = context.Customers.ToList();
}

Como podemos ver, trabajar con SQL Server CE usando LINQ TO SQL en Windows Phone es muy sencillo y nos da muchísimas posibilidades para almacenar datos de forma sencilla y rápida en nuestras aplicaciones.

A continuación os dejo el ejemplo para que podáis descargarlo y jugar con el (Recordad que necesitareis las herramientas de desarrollo de mango para poder usarlo):

Espero que os sea de ayuda, en el próximo artículo veremos como con algunos simples trucos podemos optimizar muchísimo nuestra base de datos. Un saludo y Happy Coding

Published 19/7/2011 19:15 por Josué Yeray Julián Ferreiro
Comparte este post:

Comentarios

# re: SQL Server CE en Windows Phone Mango

Tuesday, July 19, 2011 10:22 PM por Rafa

Buena entrada.

Hemos coincidido en tiempo y asunto, casualidades...

# re: SQL Server CE en Windows Phone Mango

Friday, July 22, 2011 11:36 AM por Eduardo Ortega Bermejo

Muy bueno y muy bien explicado Yeray :) Haces que hasta parezca fácil.

Lo que no he encontrado por ningun lado es la versión de SQLCE que están usando, es de suponer que es la 4.0 que es la que está disponible para WCE sin embargo hay sospechas de que es la 3.7 que sacaron como adaptación de la 3.5.

Es oslo por curiosidad, por si lo sabías... Salu2!

# re: SQL Server CE en Windows Phone Mango

Friday, July 22, 2011 11:50 AM por Josué Yeray Julián Ferreiro

Buenas!

Por ahora SQL Server CE 4 no tiene versión para WinMo 6.X ni para WinPhone:

msdn.microsoft.com/.../gg592946(v=sql.110).aspx

Por lo que he podido investigar la estructura del sdf es igual a la versión 3.5, así que supongo que será 3.X (no se si 3.5 o 3.7 exactamente) quien sabe, quizas con el sdk definitivo y Mango liberado ya tengamos la 4.0

# [Windows Phone 7.5] Inserciones masivas en SQL Server CE vs SQL Server vs MongoDb

Thursday, December 8, 2011 1:16 PM por Josue Yeray

Hola a todos! Desde hace unas semanas, mis compañeros Pablo Doval y Unai Zorrilla están

# Windows Phone 7 – Recomendación de enlaces interesantes (II)

Wednesday, January 18, 2012 10:07 AM por Jorge Serrano - MVP Visual Developer - Visual Basic

Vamos con una segunda retahíla de enlaces relacionados con Windows Phone 7.5 (Mango). En este caso y

# re: SQL Server CE en Windows Phone Mango

Friday, May 18, 2012 8:41 AM por JACA_001

Muy buen aporte.