SQL Server EveryWhere II

Siguiendo con la idea de SQL Server EveryWhere, acá les dejo un artículo que escribí hace un tiempo atras. Cuando SQL Server EveryWhere aun se llamaba SQL Server CE. Este a diferencia del articulo anterior, toca el tema de bases de datos para dispositivos móviles, pero desde el punto de vista del código, y no, como el anterior, desde Visual Studio 2005 completamente.

Espero que les guste.

En la siguiente nota veremos como podemos implementar, en nuestros dispositivos móviles, una potente base de datos con SQL Server CE.

En los tiempos que corren, el desarrollar una aplicación que posea la habilidad de permanecer conectada constantemente a una fuente de datos es poco práctico, y más que nada, poco probable.

Modelos distribuidos y en capas, aplicaciones Web, Internet, redes, cables, conexiones, y un sin número mayor de alternativas, hacen que debamos buscar formas de asegurar los datos de los usuarios que interactúan con nuestras aplicaciones y así garantizar la estabilidad de los sistemas.

Las aplicaciones para dispositivos móviles no son la excepción. En todo caso, podemos considerarlas especiales y a su vez, más delicadas al momento de interactuar con datos. Esto se debe a que sería de un muy alto costo el poder mantener estos dispositivos conectados constantemente. Pensemos en equipos que pueden desplazarse dentro de nuestra ciudad, o viajar fuera de ella, donde no existe una vía de conexión a un servicio de redes. De esta manera, el dispositivo debe almacenar de alguna forma temporal los datos que el usuario pudiera ingresar o necesitar consultar.

De esta forma, nos enfrentamos a dos grandes problemas que deberemos resolver. Por un lado la posibilidad de no tener garantías de que el dispositivo permanezca conectado a una fuente de datos, y por otro, la necesidad de almacenar la información temporalmente para un acceso más rápido y seguro. Por suerte tenemos una solución sencilla y práctica; SQL Server CE.

El mal ejemplo.

Normalmente en aplicaciones de escritorio haríamos una conexión directa a la base de datos, esto claro está, más allá del modelo de capas implementado, o no.

Una aplicación para un dispositivo móvil puede gozar de las mismas cualidades, pero bajo ciertos parámetros que, como comentamos, en la actualidad pueden ser difícilmente alcanzados.

De cualquier forma, si gozáramos de una conexión constante a una red o a Internet, podríamos implementar un modelo de acceso a datos conectado. Nuestra aplicación gestionaría los datos de forma directa en un servidor de base datos.

Incorporando la referencia a SQL Server, podríamos conectarnos a este directamente desde el dispositivo móvil.

Dim _SqlConn As New SqlClient.SqlConnection("Data Source=[Dirección de servidor de base de datos];Initial Catalog=[Base de datos];Integrated Security=True")

Dim

_SqlDa As New SqlClient.SqlDataAdapter("[Consulta]", _SqlConn)

Dim

_SqlDT As New DataTable

_SqlDa.Fill(_SqlDT)

_SqlDT.Columns(0).ColumnName = "Registro"

_SqlDT.Columns(1).ColumnName = "Nombre"

_SqlDT.Columns(2).ColumnName = "Direccion"

_SqlDT.Columns(3).ColumnName = "Email"

Me.DataGrid1.DataSource = _SqlDT

El mismo patrón podemos plantearlo con conexiones directas a servicios web.

En todo caso, estas prácticas sólo nos guían a una catástrofe segura y, aunque controlemos los errores de conexión a los servicios, no garantizarán la continuidad del funcionamiento de la aplicación.

Es bueno que destaquemos que este modelo puede ser no sólo catastrófico para un dispositivo móvil, si no, para cualquier aplicación que desarrollemos. Nunca estamos completamente seguros del comportamiento de nuestras redes que por más que revisemos constantemente el flujo de la misma esta está sujeta a otros factores físicos que tienen tendencia a las fallas.

Archivos como base de datos.

SQL Server CE, a diferencia de su superior, no es administrado por un motor de gestión de bases de datos, si no, que la base de datos misma se compone por un archivo, el cual puede ser localizado en cualquier parte del dispositivo móvil, y sea accedido localmente por las aplicaciones instaladas.

Posiblemente esto se asemeje más al uso de Access en equipos tradicionales, pero no nos dejemos engañar por las apariencias, dentro de nuestro dispositivo móvil contamos con toda la potencia de un SQL Server en versión compacta.

Primero, lo primero.

El primer paso para poner en marcha SQL Server CE dentro de nuestras aplicaciones es incluir la referencia del mismo en nuestro proyecto. Tenemos que tener en cuenta que SQL Server CE no es una aplicación que trabajará independientemente en el dispositivo. Al igual que el Compact .Net FrameWork, que debe ser instalado en el dispositivo al momento de ejecutar la aplicación, las librerías de SQL Server CE también deben pasar por el mismo proceso para que finalmente puedan ser usadas por nuestra aplicación.


Al adicionar la referencia de SQL Server CE, Visual Studio se encargará de gestionar la instalación del mismo en el dispositivo móvil.

Debido a que aún no tenemos en el dispositivo móvil la base de datos, antes de empezar a trabajar con ella es necesario crearla.

Para esto, tendremos que importar el espacio de nombre correspondiente en nuestra clase (System.Data.SqlServerCe). En él encontraremos tanto las clases tradicionales de acceso a datos, SqlCeDataAdapter o SqlCeCommand por ejemplo, como aquellas que hacen referencia al motor mismo de SQL Server CE (SqlCeEngine), que nos entrega todas las herramientas para poder crear, borrar, o modificar el archivo de una base de datos.

De esta forma, como la base de datos es un archivo en el dispositivo, necesitamos la ruta física donde se alojará el archivo y, por supuesto esta ruta será la misma ruta para todas las demás conexiones que realicemos al archivo de base de datos.

Private

strDataBasePath As String = "My DocumentsDemoDB.sdf"

Finalmente, creamos la base de datos basándonos en la ruta y el nombre elegido. Para esto, creamos una nueva instancia del motor de SQL Server CE. En este momento, éste requerirá de la ruta de la base de datos formando parte de una cadena de conexión que sólo involucra la fuente de datos. Como último paso ejecutamos el método de creación.

Dim

_SqlEngine As New SqlCeEngine("Data Source=" & strDataBasePath)

_SqlEngine.CreateDatabase()

Con la base de datos en nuestro dispositivo, estamos listos para crear tablas, y adicionar nuevos registros en ellas.

Para esto tenemos un par de posibilidades a nuestra disposición.

Datos, tablas, y esas cosas.

Una vez creamos la base de datos, esta es mostrada en el dispositivo físicamente. Y debido a que, con la instalación de nuestra aplicación, se adicionaron al sistema operativo del dispositivo los componentes de administración de bases de datos, es fácil entender que contamos con una herramienta de gestión para estos archivos.

Simplemente buscamos en la ruta especificada para la creación de la base de datos y veremos el archivo previamente creado. Al seleccionarlo este será abierto con el gestor de SQL Server CE, y desde él, podremos crear tablas, insertar, borrar o modificar registros, entre otras acciones.


Un QueryAnalizer en miniatura, con toda la funcionalidad de su padre.

Es indudable que sería un trabajo tedioso y poco práctico el tener que hacer esta tarea manualmente por cada dispositivo en el cual instaláramos nuestra aplicación.

Por suerte contamos con una segunda opción. Podríamos incluir código dentro de nuestra aplicación para que esta se encargue de crear, tanto la base de datos, paso que hicimos previamente, como las tablas y los registros iniciales en el caso que fueran necesarios.

Entonces, como el archivo ya fue creado, sólo deberemos conectarnos a él mediante un objeto de conexión.

Dim

_SqlConn As New SqlCeConnection("Data Source=" & strDataBasePath)

Dim

_SqlComm As SqlCeCommand = _SqlConn.CreateCommand

Y ejecutar algunas consultas SQL que creen las tablas necesarias dentro de la base de datos. En este punto podemos asignar llaves primarias y relaciones con otras tablas de la base de datos.

_SqlComm.CommandText = "Create TABLE Registro(RecordID int IDENTITY(0,1)" & _ "PRIMARY KEY," & _

"NombreApellido ntext," & _

"Direccion ntext," & _

"Email ntext)"

Acto seguido, abrimos la conexión la base de datos, y ejecutamos el comando.

_SqlConn.Open()

_SqlComm.ExecuteNonQuery()

_SqlConn.Close()

Con una tabla creada, los pasos para manipular información dentro de ella se tornan simples en extremo. Una consulta de selección de registros, con un condicionamiento basado en una o más columnas pueden ser capturados por objetos ya utilizados en aplicaciones para equipos tradicionales. Un "DataAdapter" o un "DataReader" están a la mano para estos actos sencillos.

Objetos comunes para acceso a datos.

Clase

Descripción

SqlServerCe.SqlCeCommand

Especial para ejecutar consultas que pueden o no retornar datos.

SqlServerCe.SqlCeConnection

Representa la conexión a la base de datos.

SqlServerCe.SqlCeDataAdapter

Ejecuta consultas que pueden llenar automáticamente un DataSet.

SqlServerCe.SqlCeDataReader

De solo lectura y con recorrido asía adelante. Se complementa con SqlCeCommand.

SqlServerCe.SqlCeEngine

Motor de Sql Server CE, para manipular la base de datos.

SqlServerCe.SqlCeTransaction

Brinda el uso de consultas transaccionales.

SqlServerCe.SqlCeParameter

Especial para consultas parametrizadas. Pueden prevenir fallas de seguridad como inyección de código SQL.

SqlServerCe.SqlCeException

Dentro de un bloque Try…Catch. Para capturar excepciones de interacción con la base de datos.

El procedimiento de conexión a la base de datos es, sin duda, independiente de las acciones que realicemos con ella. Con esto queremos decir que, la apertura, ejecución, y cierre de la conexión son pasos que siempre deberemos realizar. Por esto, sólo nos queda entender como podemos recuperar, insertar, borrar o modificar registros.

Para el caso, seleccionaremos un conjunto de registros de la tabla creada, pero, a diferencia del ejemplo de creación de una tabla, en este caso usaremos un DataAdapter para poblar un DataSet.

Dim

_SqlConn As New SqlCeConnection("Data Source=" & strDataBasePath)

Dim _SqlDa As New SqlCeDataAdapter("select * from Registro", _SqlConn)

Dim _SqlDT As New DataTable

_SqlDa.Fill(_SqlDT)

Una vez obtenidos los registros, los podemos enlazar con cualquier objeto que soporte las propiedades de enlazado de datos (Binding) como por ejemplo una grilla.

Cabe destacar que el enlazado de datos se produce de igual manera que en aplicaciones de escritorio. Podemos pasar un objeto con datos a la propiedad DataSoruce del control, y este absorberá los registros para mostrarlos en la interfaz del dispositivo.

_SqlDT.Columns(0).ColumnName = "Registro"

_SqlDT.Columns(1).ColumnName = "Nombre"

_SqlDT.Columns(2).ColumnName = "Direccion"

_SqlDT.Columns(3).ColumnName = "Email"

Me.DataGrid1.DataSource = _SqlDT

Un paso más allá.

Además de usar consultas en formato texto plano y realizar concatenaciones a estas para condicionar los resultados, insertar o modificar o borrar nuestros registros. Podemos realizar estas mismas acciones mediante parámetros SQL.

Una de las principales ventajas radica en que estos parámetros pueden ser definidos como tipos de datos específicos, lo que nos ahorrarán una serie de problemas futuros. Problemas, especialmente con valores numéricos o de fechas, ya que estos pueden variar en su formato dependiendo la configuración del sistema operativo en el cual estamos trabajando.

Para esto, usamos un comando de SQL Server CE, y una consulta SQL válida, remplazando los valores concatenados por signos de interrogación, los que finalmente serán referenciados por parámetros de SQL Server CE.

Dim _SqlConn As New SqlCeConnection("Data Source=" & strDataBasePath)

Dim

_SqlComm As SqlCeCommand = _SqlConn.CreateCommand

_SqlComm.CommandText = "insert into Registro(NombreApellido, Direccion, Email) " & _

"values(?,?,?)"

_SqlComm.Parameters.Add(New SqlCeParameter("NombreApellido", SqlDbType.NText, 50))

_SqlComm.Parameters.Add(New SqlCeParameter("Direccion", SqlDbType.NText, 50))

_SqlComm.Parameters.Add(New SqlCeParameter("Correo", SqlDbType.NText, 50))

_SqlComm.Parameters("NombreApellido").Value = Me.txtNombre.Text

_SqlComm.Parameters("Direccion").Value = Me.txtDireccion.Text

_SqlComm.Parameters("Correo").Value = Me.txtEmail.Text

_SqlConn.Open()

_SqlComm.ExecuteNonQuery()

_SqlConn.Close()

Otra de las cualidades que nos presenta el motor de SQL Server CE es, además de la creación de bases de datos, la capacidad de compactar una base de datos existente.

Debido a que la base de datos no es controlada exhaustivamente como en el caso de su superior, y al igual que una base de datos Access, esta en ocasiones puede ocupar mas espacio en el dispositivo de lo que realmente abarcan los datos alojados en ella.

Entonces, es buena práctica en aplicaciones que utilizarán este sistema de base datos de forma constante, compactar el archivo de la base de datos y así ahorrar espacio en un dispositivo que, de por si, es escaso en capacidad de almacenamiento.

Con un objeto motor de SQL Server CE hacemos referencia a la base de datos actual o a aquella que queremos compactar. Debido a que la base de datos principal estará exclusivamente tomada por el motor, para realizar la compactación es necesario establecer una segunda ruta para que se cree una copia de la original pero compactada.

Dim

_SqlEngine As New SqlCeEngine("Data Source=" & strDataBasePath)

_SqlEngine.Compact("Data Source=My DocumentsDemoDB2.sdf")

Así, obtendremos una copia fiel de la base de datos, pero con menor tamaño. Indudablemente si esta hubiera tenido información extra no utilizada.

Conclusiones.

SQL Server CE representa una ayuda invaluable al momento de desarrollar aplicaciones para dispositivos móviles. Nos otorga la posibilidad de generar y manipular contenido desconectado para nuestras aplicaciones, para ser sincronizadas o replicadas en el momento en que el dispositivo es conectado a una red o a un equipo de escritorio.

En definitiva, una alternativa simple de usar, y que nos abre a otro mundo de posibilidades en el desarrollo de aplicaciones.


One Comment on “SQL Server EveryWhere II”

  1. Alfredo dice:

    Gracias por el aporte, como hago para tener la base de datos en el disco duro del pc, esto para poder desarrollar la aplicacion sin tener el celular conectado


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s