martes, 2 de abril de 2013

Crear Contexto de datos para Bases de datos Locales en Windows Phone

Este articulo sirvio de base para la creacion de esta aplicacion para windows phone EvolucionBrowser

Los motores de bases de datos que podemos utilizar locales en Windows Phone 7.5 son:
  • Microsoft SQL Server Mobile (Compact Edition)
  • SQLite
 Debemos crear un contexto de datos (DataContext) para poder tener acceso a la base de datos local en Windows Phone 7.5, aquí es necesario aclarar, que no podemos utilizar ADO.NET de manera directa para el acceso a la base de datos local.

 Por este motivo debemos crear un contexto de datos de la base de datos, este DataContext, no es mas que una clase en uno de los lenguajes de la plataforma .NET (VB.NET o C#), en la cual se encuentran métodos que permiten las operaciones CRUD (Create, Read, Update, Delete) , clases de tipo entidad que representan un registro de cada una de las tablas, clases de tipo colección que representan la tabla o un conjunto de registros de la tabla.

  el manejo de las operaciones de la base de datos locales en Windows Phone 7.5 se realiza a través de LinQ y un DataContext. Algo que debemos tener claro es que nuestra base de datos local se almacena en el almacenamiento privado del dispositivo, lo que conocemos como “Isolated Storage”.

  
Vamos a definir el modelo de datos en nuestra base de datos SQL, para esto vamos a utilizar SQL Server Management Studio para crear la base de datos y la estructura de las tablas de nuestra base de datos.
Se puede utilizar Entity Framework 4.1 para realizar esta operación, lo importante es definir el modelo de nuestro repositorio de datos y generar el archivo .SDF de la base de datos SQL Serve.

 No vamos a entrar en detalles, asumimos que el lector sabe como crear bases de datos en SQL Server, solo hay que tener en cuenta el parametro Server Type:


 Debemos seleccionar SQL Server Compact, todo lo demas es el mismo proceso que usualmente se sigue a la hora de crear la base de datos las tablas, etc.

si ya tenemos nuestra base de datos .SDF creada, ahora vamos a realizar el proceso de la creación de la clase que forma el DataContext para poder utilizarlo en nuestra aplicación de Windows Phone, para poder llevar a cabo nuestro objetivo necesitamos un programa que se instala con el SDK de Windows Phone 7.5, SQLMetal.

Para ejecutarlo, vamos a abrir una ventana de comandos del sistema operativo, pero la ventana de comandos a abrir es la que se encuentra en la sección de Visual Studio 2010, ver imagen:



















El comando a utilizar es el siguiente:

SQLMETAL D:\Jose\Projects\Silverlight\DBWPhone.sdf
/code:D:\Jose\Projects\Silverlight\DBWPhone.cs
/language:csharp
/namespace:LocalDB
/context:DBWPhoneDataContext
/pluralize

  1. El primer parámetro es la ruta y el nombre de la base de datos .SDF a la cual vamos a generar el DataContext.
  2. /code: representa la ruta y el nombre del archivo físico en donde se va a generar el DataContext.
  3. /language: representa el lenguaje de programación en el cual se va a generar la clase.
  4. /namespace: representa el NameSpace con el cual se va a generar el DataContext.
  5. /context: representa el nombre que va a tener al clase del DataContext.
  6. /pluralize: indica que se deben crear los objetos que representan las colecciones y grupos de registros en el DataContext.


Lo siguiente que debemos hacer con la clase DataContext generada es eliminar dos de los cuatro constructores de la clase, si los dejamos, al compilar la clase en nuestro proyecto vamos a tener errores pues estos constructores no son soportados por el espacio de nombres System.Data.Linq.

public DBWPhoneDataContext(string connection) :  base(connection, mappingSource)
{
 OnCreated();
}
 
public DBWPhoneDataContext(System.Data.IDbConnection connection) :  
base(connection, mappingSource)
{
 OnCreated();
}
 
public DBWPhoneDataContext(string connection,                 System.Data.Linq.Mapping.MappingSource mappingSource) :  
base(connection, mappingSource)
{
 OnCreated();
}
 
public DBWPhoneDataContext(System.Data.IDbConnection connection, 
                System.Data.Linq.Mapping.MappingSource mappingSource) :  
base(connection, mappingSource)
{
 OnCreated();
}


Los constructores señalados de color amarillo son los que se deben eliminar de la clase DataContext generada, al eliminarlos y compilar, los errores desapareceran.


El codigo para crear nuestra base de datos en el isolated store es:


 // Cadena de Conexion a la base de datos local
 private const string ConnectionString = @"isostore:/DBWinPhone.sdf";
 
private void buttonCreaBD_Click(object sender, RoutedEventArgs e)
{
    try
    {
        using (DBWPhoneDataContext context = new 
                        DBWPhoneDataContext(ConnectionString))
        {
            if (!context.DatabaseExists())
            {
                // create database if it does not exist
                context.CreateDatabase();
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Ha ocurrido un error:" + ex.Message,  
                   "Creando Base de Datos",MessageBoxButton.OK );
    }
}

 Luego para hacer operaciones CRUD (Create, Read, Update, Delete) Siga este orto tutorial:
http://xgeeker.blogspot.com/2012/10/operaciones-crud-create-read-update-and.html