sábado, 26 de octubre de 2013

Agregar una Base de datos SqlCompact a un proyecto de Visual Studio

Hola a todos:

Para ir entrando en contexto…

Vamos a ver como agregar una Base de datos SqlCompact a un proyecto de desarrollo Vs, este ejemplo aplica tanto para proyectos de desarrollo C# o Vb.Net..

Para los que aun no conocen SqlCompact esta es la mejor definición de la misma pagina de descarga de Microsoft:

“SQL Server Compact 3.5 SP2 es una base de datos incrustada que permite a los desarrolladores crear aplicaciones sólidas para dispositivos móviles y equipos de escritorio con Windows”
Para descargar SqlCompact 3.5 Sp2 :

Service Pack 2 de Microsoft SQL Server Compact 3.5 para equipos de escritorio con Windows


SqlCompact es utilizado para desarrollo móviles, aunque tiene un potencia desde mi punto de vista superior al propio Access del paquete Microsoft Office comúnmente utilizado para pequeñas aplicaciones de escritorio, ya que puede fácilmente integrarse al ambiente de Sql Server Management Studio y operar tal cual como si se estuviera trabajando con una archivo Mdf (extensión de los archivo físicos de Bases de datos propios de Sql server), haciendo con esta una Base de datos muy potente, además de su fácil migración a Sql Server, el uso de muchas funciones propias de Sql Server lo hacen desde mi punto de vista la Bd por excelencia para una aplicación en crecimiento.

Bueno vayamos a lo que nos interesa….

Comience creando un proyecto del tipo WindowsForms, a este agregue dos botones a un llámelo btnTraer y al otro btnGuardar, un control TextBox y un control DataGridView.

Una vez que tenga creado el proyecto y agregado el botón, agregue un nuevo elemento al mismo:

Haga Click derecho sobre el nombre del Proyecto –> Agregar –> Nuevo Elemento
newItem

Del panel izquierdo seleccione Datos –>Del panel medio seleccione Base de datos Local –> Deje el nombre por default –>Presione Agregar
d1

Seleccione Conjunto de Datos –> Presione Siguiente
d2

Presione Finalizar
d3

Esto nos crea tres nuevos elementos en el proyecto que podremos observar por medio del Explorador de soluciones:
d4

El archivo de configuración App.cofig. Si abrimos el archivo dentro podremos observar la cadena de conexión:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="EjemploBdSqlCompact.Properties.Settings.Database1ConnectionString"
            connectionString="Data Source=|DataDirectory|\Database1.sdf"
            providerName="Microsoft.SqlServerCe.Client.3.5" />
    </connectionStrings>
</configuration>

Modifique por favor el Nombre de la cadena de conexión a.
<add name="cnnString"

DataBase1.Sdf. Este es el archivo físico de una Base de datos SqlCompact

DataBase1DataSet.xsd, este puede eliminarlo ya que nos nos servirá de nada (para la mayoría de los casos).

Ahora guarde y genere el proyecto, al generar el proyecto nuestra Bd que por defecto se crea en:

“…Documents\Visual Studio 2010\Projects\EjemploBdSqlCompact\EjemploBdSqlCompact”

se copia al directorio:

“…Documents\Visual Studio 2010\Projects\EjemploBdSqlCompact\EjemploBdSqlCompact\bin\Debug”

Bien, aquí hay un punto que resaltar y es que el Vs trabaja por defecto con la Bd que se crea en el primer directorio mencionado arriba y nuestro archivo de configuración apunta al archivo que se copia en el directorio “…Bin/Debug” después de generar el proyecto:

connectionString="Data Source=|DataDirectory|\Database1.sdf"

(al establecer el Data Source como DataDirectory, estaremos tomando la información de la Bd que se encuentra en el directorio desde donde se esta ejecutando la aplicación ósea la carpeta Debug).

Para poder utilizar un solo archivo desde el Vs, tendremos que cambiar el path de conexión con el fin de que apunte al archivo existente en Bin/Debug, para esto:

Desde el Explorador de soluciones haga doble Click sobre el elemento DataBase1.Sdf, para abrir el Explorador de Servidores.

Haga Click derecho sobre el archivo de Base de datos –> Seleccione Modificar Conexión:
d10

Seleccione Examinar –> Diríjase a la carpeta …Bin/Debug y seleccione el archivo de Base de datos –> Abrir –> Aceptar
d11

Echo lo anterior ya tenemos nuestro Vs configurado para que trabaje con el mismo archivo que nuestro App.Cofig,

Ahora Haga Click derecho sobre la Base de datos –> Seleccione Agregar Tabla
d5

Cree una tabla como la siguiente, observe que el campo Id es del tipo int, funge como clave principal y es Identity o identidad autoincrementable:

d6

Click derecho sobre la tabla que acaba de crear –> Seleccione Mostrar Datos de tabla
d7

Agregue algunos datos de ejemplo:
d8

El archivo de Base de datos que agregamos al proyecto se crea con la propiedad “Copiar en el directorio de resultados” con la opción “Copiar si es posterior” por default, si dejamos esta configuración nos traerá problemas mas adelante puesto que por cada vez que compilemos el proyecto copiara el archivo original a la carpeta Bin/Debug eliminando con esto cualquier cambio que hayamos echo con anterioridad (en realidad no elimina los cambios, sino que reemplaza el archivo por el orginal), como los datos que hayamos insertado, actualizado, cambios de tablas, etc. dando una sensación de que los cambios y actualizaciones no se estuvieran efectuando, para corregir esto:

En el Explorador de Soluciones –> Click derecho sobre el archivo de Base de datos –> Propiedades –> Establezca a la propiedad Copiar en el directorio de resultados la opción No Copiar:

d9

Después de haber echo lo anterior solo nos queda usar nuestra App.Cofig para leer nuestra Base de datos Sql Compact Edition:

Como agregamos la Bd desde el asistente de Vs automáticamente tendremos lista las referencias a la librería System.Data.SqlServerCe, en caso de agregar un archivo de Bd ya existente tendrá que crear las referencia a estas librería manualmente.

Para esto Haga Click derecho sobre le nombre del proyecto –> Seleccione Agregar Referencia –> Diríjase a la ficha .Net –> Muévase por los items de la lista hasta ubicar la librería System.Data.SqlServerCe –> Selecciónela y presione Aceptar.

Para usar el archivo de configuración tiene que hacer la referencia a la librería System.Configuration:

App. Config, cadenas de conexión

En el evento Click de uno de los botones que pusimos en el Formulario copie y pegue las siguiente líneas de código:

Código C#:
private void btnTraer_Click(object sender, EventArgs e)
{
    //
    //Encerramos la conexion en un Bloque using para asegurarse de destruir todos los objetos utilizados dentro
    //ademas de cerrar la conexion despues de ejectuar la consulta
    //
    using (SqlCeConnection cnx = new SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToString()))
    {
        //Creamos una variable que contendra la consulta a ejecutar
        //
        String SqlAction = "SELECT * FROM Estados";
        //
        //Creamos un comeando del tipo SqlCeCommand y le pasamos la variable que contiene
        //la consulta y la conexion
        //
        using (SqlCeCommand cmd = new SqlCeCommand(SqlAction, cnx))
        {
            //
            //Creamos un objeto DataAdapter este objeto se encarga de abrir la conexion a la Bd
            //
            SqlCeDataAdapter da = new SqlCeDataAdapter(cmd);
            //
            //Creamos un objeto DataTable que contendra los daos recuperados por el DataAdapter
            //
            DataTable dt = new DataTable();

            //
            //Llenamos el objeto DataTable con los datos recuperados por el DataAdapter
            //
            da.Fill(dt);
            //
            //Establecemos el DataSource del Control DataGridView
            //
            dataGridView1.DataSource = dt;
        }

    }
}

Código Vb.Net:
    Private Sub btnTraer_Click(sender As System.Object, e As System.EventArgs) Handles btnTraer.Click
        '
        'Encerramos la conexion en un Bloque using para asegurarse de destruir todos los objetos utilizados dentro
        'ademas de cerrar la conexion despues de ejectuar la consulta
        '
        Using cnx As New SqlCeConnection(ConfigurationManager.ConnectionStrings("cnnString").ToString())
            'Creamos una variable que contendra la consulta a ejecutar
            '
            Dim SqlAction As String = "SELECT * FROM Estados"
            '
            'Creamos un comeando del tipo SqlCeCommand y le pasamos la variable que contiene
            'la consulta y la conexion
            '
            Using cmd As New SqlCeCommand(SqlAction, cnx)
                '
                'Creamos un objeto DataAdapter este objeto se encarga de abrir la conexion a la Bd
                '
                Dim da As New SqlCeDataAdapter(cmd)
                '
                'Creamos un objeto DataTable que contendra los daos recuperados por el DataAdapter
                '
                Dim dt As New DataTable()

                '
                'Llenamos el objeto DataTable con los datos recuperados por el DataAdapter
                '
                da.Fill(dt)
                '
                'Establecemos el DataSource del Control DataGridView
                '
                dataGridView1.DataSource = dt

            End Using
        End Using
    End Sub

Ejecute la aplicación y presione el botón Traer, si siguió el articulo obtendrá un resultado como el siguiente:

d12

Ahora, probemos guardar un nuevo registro:

Copie y pegue el siguiente código en el botón Guardar:

Código C#:
private void btnGuardar_Click(object sender, EventArgs e)
{
    //
    //Encerramos la conexion en un Bloque using para asegurarse de destruir todos los objetos utilizados dentro
    //ademas de cerrar la conexion despues de ejectuar la consulta
    //
    using (SqlCeConnection cnx = new SqlCeConnection(ConfigurationManager.ConnectionStrings["cnnString"].ToString()))
    {
        //
        //Abrimos la conexion a la Base de datos
        //
        cnx.Open();
        //Creamos una variable que contendra la consulta a ejecutar
        //
        String SqlAction = "INSERT INTO Estados (Nombre) VALUES (@nombre)";
        //
        //Creamos un comeando del tipo SqlCeCommand y le pasamos la variable que contiene
        //la consulta y la conexion
        //
        using (SqlCeCommand cmd = new SqlCeCommand(SqlAction, cnx))
        {
            //
            //Establecemos valores a los parametros
            //
            cmd.Parameters.AddWithValue("@nombre", textBox1.Text.Trim());
            //
            //Ejecutamos la consulta
            //
            cmd.ExecuteNonQuery();
        }

    }
}

Código Vb.Net:
    Private Sub btnGuardar_Click(sender As System.Object, e As System.EventArgs) Handles btnGuardar.Click
        '
        'Encerramos la conexion en un Bloque using para asegurarse de destruir todos los objetos utilizados dentro
        'ademas de cerrar la conexion despues de ejectuar la consulta
        '
        Using cnx As New SqlCeConnection(ConfigurationManager.ConnectionStrings("cnnString").ToString())
            '
            'Abrimos la conexion a la Base de datos
            '
            cnx.Open()
            'Creamos una variable que contendra la consulta a ejecutar
            '
            Dim SqlAction As String = "INSERT INTO Estados (Nombre) VALUES (@nombre)"
            '
            'Creamos un comeando del tipo SqlCeCommand y le pasamos la variable que contiene
            'la consulta y la conexion
            '
            Using cmd As New SqlCeCommand(SqlAction, cnx)
                '
                'Establecemos valores a los parametros
                '
                cmd.Parameters.AddWithValue("@nombre", textBox1.Text.Trim())
                '
                'Ejecutamos la consulta
                '
                cmd.ExecuteNonQuery()

            End Using
        End Using
    End Sub

Al ejecutar la consulta inmediatamente la Bd se vera afectada:

d13

Recuerde que si trabaja sobre el archivo ubicado el Bin/Debug al momento de crear su proyecto de Setup deberá de copiar este archivo a la carpeta por default osea a:

“…Documents\Visual Studio 2010\Projects\EjemploBdSqlCompact\EjemploBdSqlCompact”

Ya que al momento de crear el proyecto este tomara la Bd de ahí para armar el paquete de instalación y cuando lo instale dejara esta archivo en el mismo directorio que el ejecutable de su aplicación…

Saludos desde Monterrey, Nuevo León México!
Ejemplo C#
Ejemplo Vb.Net
Nota: El proyecto fue desarrollado en Vs2010 usando una Bd SqlCe v3.5 y Framework 4.0 Client Profile

30 comentarios:

  1. EXCELENTE EXPLICACION !!! Me surge una pregunta. Una base de datos SDF (como asi tambien una MDF) admite como máximo 4Gb de datos. Me da algo de vértigo tener ese techo. Ponele que haga la super aplicación y después me quedo corto con ese espacio... qué hago !!!

    ResponderEliminar
  2. Hola:
    Me da gusto que el articulo te haya gustado y espero te haya sido de utilidad, en relación a tu pregunta, un archivo de Base de datos SqlCe esta pensado para dispositivos móviles o aplicaciones que no requieran de mucha información (que de entrada 4 gb de datos para una móvil es mucha información), para el caso que planteas existen patrones de diseño para codificar tu Aplicación, por ejemplo esta el Repository:

    http://msdn.microsoft.com/en-us/library/ff649690.aspx
    http://www.remondo.net/repository-pattern-example-csharp/

    O tambien y las factorias que te permite trabajar tu codigo de acceso a datos con independencia del motor por ejemplo:

    Para conectarte a una Bd SqlServer usarías el objeto SqlConnection usando factorías usarías DbConnection que es la clase base de acceso, Sqlcommand usarias DbCommand...

    http://msdn.microsoft.com/en-us/library/ee817667.aspx

    De esta manera podrás cambiar tu motor de Base de datos cuando lo desees sin tener que modificar nada de código, próximamente publicare un articulo sobre el uso de factorías (que es el único que he trabajado hasta ahora).

    Saludos desde Monterrey, Nuevo León, México

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Gracias por tu post, realmente muy bueno!.. fue de mucha ayuda el unico que soluciono mi problema de forma sencilla y eficaz!:.

    gracias un saludo!.

    ResponderEliminar
    Respuestas
    1. Hola Joako:

      Me da gusto el artículo haya sido de utilidad, espero pronto darme un tiempo para publicar otros artículos, personalmente trato de hacerlos con la mayor explicación posible, tal cual como me gustaría a mi encontrar los artículos de los cuales muchas veces me apoyo...

      Eliminar
    2. Hola Jose Luis, Nuevamente Gracias y en hora buena por el blog!.

      Eliminar
  5. Hola jose luis estoy siguiendo este post es muy util pero tengo un problema, cuando termino , y ejecuto el programa no muestra nada de la base de datos,
    en la parte donde a la base de datos hay que cambiar la opcion de Copiar en el directorio de resultados en "NO copiar", es cuando no me muestra NADA,

    pero si le dejo la opcion de copiar siempre, si me muestra los datos de la BDD como puedo solucionarlo? o por que no me lo muestra. verifico la carpeta bin debug y no esta la base de datos,

    ResponderEliminar
    Respuestas
    1. Hola Alejandro: Gracias por visitar mi blog y por tus comentarios, ¿Lograste resolver lo que comentas?

      Eliminar
    2. pues el archivo de base de datos lo sigo teniendo en copiar siempre, solo asi aparacen los datos, si lo cambio a no copiar ya no me muestra nada al querer mostrar los datos en el grid

      Eliminar
  6. hola yo de nuevo pidiendo aqui si pudieras hacer un post sobre como crear un instalador en visual con BDD , haz de cuenta este ejemplo pero creando el instalador, ya que no he podido crear un instalador que reconosca el archivo de BDD

    ResponderEliminar
    Respuestas
    1. Hola Alejandro:

      De verdad que he quedado a deber muchos temas el problema es el tiempo, pero dime como es que estas tratando de crear el instalador y si tienes Skype podríamos tener una sesión remota para apoyarte con esto...

      Eliminar
    2. el instalador lo creo asi.

      1.- creo un nuevo proyecto setup.
      2.- selecciono que agregue el proyecto a la instalacion.
      3.-creo los accesos directos que se crearan despues de la instalacion

      segun a mi entender deberia de agregar todos los archivos , incluyendo la base de datos pero me di cuenta que al instalarlo en una pc en el directorio de instalacion no me aparece el archivo de base de datos, no lo esta agregando en la instalacion.. sigo tratando.. se hacer programas y todo eso pero el instalador me esta matando jeje hasta ahora lo que yo hacia era modificar la cadena de coneccion e instalar sql en la pc cosa muy lenta y con demasiados problemas

      Eliminar
    3. Encontraste solucion a tu problema Alejandro!??

      Eliminar
    4. Hola:

      Agreguen el archivo como "Archivo Adjunto" dentro de su proyecto de instalación "Setup" no deberían de tener mayor problema...

      Eliminar
  7. Que tal, muy buen post, te agradeceria si pudieras crear un tutorial para como hacer el proyecto Setup ya que en la computadora donde lo instalo me muestra un mensaje diciendo que no puede encontrar el archivo de base de datos.
    gracias.

    ResponderEliminar
    Respuestas
    1. Hola Jairo:

      Para adjuntarlo a tu proyecto setup tienes que agregarlo como archivo adjunto. No he podido crear el articulo por cuestiones de tiempo, ya sabes entre el trabajo y las diferentes ocupaciones personales, espero pronto darme unos minutos...

      Eliminar
  8. COMO PUEDO IMPRIMIR UNA SOLA FILA DEL DATAGRID en un reportview? esto lo necesito con mucha urgencia.. Espero que me puedas ayudar con eso

    ResponderEliminar
    Respuestas
    1. Hola:

      Podrías darle una leída a este articulo:

      http://joseluisgarciab.blogspot.mx/2013/10/reportviewer-y-rdlc-ejemplo-facturacion.html

      Ahí menciono como trabajar con ReportViewer.

      Si los articulos son de tu agrado no olvides apoyar al blog con nuestros anuncios.

      Eliminar
  9. Hola José Luis.
    Soy la Gemma Campillo, te querría preguntar porque estoy cansada de los problemas que da el Access 2007 en 64 bits aunque le meta las extensiones, no compacta, etc. Bueno, me estoy pasando y leyendo las bases de datos SqlCompact 4.0 y no acabo de ver que producto puede haber por ahí pasar pasar los datos de Access a compact.Pero desde luego, me paso a compact por mi tipo de aplicación,
    Un fuerte abrazo.
    Gemma

    ResponderEliminar
    Respuestas
    1. Hola Gemma:

      Yo en particular no he tenido la necesidad de migrar Access a sqlCompact pero supongo que podríamos hacer dos cosas.

      Uno, sacar los datos en texto plano (txt) y posteriormente pasar estos a Compact por medio de instrucciones sql desde. NET o...

      Dos, usar sólo. NET para hacer el select insert de Access a Compact.

      Buscaré alguna solución de migración si encuentro algo te lo hace saber

      Saludos

      Eliminar
    2. Hola José Luis:
      En el código ya je convertido casi todo a sqlcompact, tampoco es problema la creación de tabas porque las tengo también por código, lo único era que si he crear unas tablas con bastantes campos y esa era la cosa de poder convertir la tabla de Access. Si encuentras algo perfecto, si no, como siempre muchas gracias por ayudarme.
      He visto en tu blog todo el proceso de creación y lo tengo hecho en un exe. y va de fábula.
      José Luis, gracias como siempre y un fuerte abrazo.
      Gemma

      Eliminar
    3. Hola Gemma:

      Desafortunadamente no encontre ninguna herramienta que pudiera ayudarte con esta migracion, a si que creo que lo mejor que podras hacer es por medio de una aplicacion lanzar tus queries de seleccion a Access y posteriormente estos datos obtenidos enviarlos a SqlCompact.

      La herramienta cuenta con una opcion facilisima para hacer la migracion pero hacia arriba es decir hacia SQlServer que ya cuando llegues a necesitarla hablaremos de ella.

      Gusto saludarte, saludos

      Eliminar
    4. Gracias José Luis:
      Así lo haré. He de crear unas pocas tablas a mano, ya que las otras van por código. Después lanzaré las intos y ya está.
      Muchas gracias querido amigo.
      Gemma

      Eliminar
  10. Hola Jose Luis,
    Es posible insertar datos desde un sqlcompact a un sql server? . Tengo un proyecto que la aplicación actual se comunica a un sql server por internet (ip publica del server) pero en ocasiones no hay internet donde estan ocupando la aplicacion.

    Se puede crear algo para que guarde los datos local y luego cuando exista conexion a internet el sqcompact actualice el sqlserver central??

    de antemano muchas gracias por la respuesta

    ResponderEliminar
    Respuestas
    1. Hola:

      Pero eso nada tiene que ver con Sql Compact, porque bien podrias ir almacenando los datos locales y luego crear un proceso que este verificando la existencia de conexion despues en tu logica seleccionas toda la informacion que se registroa en el SQlCompact desde que dejo de existir el internet (para eso yo crearia un marcador por cada registro) y envias la lista a la Bd web (desconozco si estas usando servicios o como es que estes logrando la comunicacion con la Bd)...

      Eliminar
  11. podrias comparti el link de descarga gumdam2017@gmai.com

    ResponderEliminar
  12. tengo visual basic 2015 en donde tengo que realizar una base de datos local pero esta no aparece en las extensiones, si no que aparece es base de datos de servicio, me pdrian ayudar como instalarlo en el visual basic 2015. gracias

    ResponderEliminar
  13. Estoy pensando en hacer una aplicación universal de windows. La idea es correrla casi siempre en una tablet con ese sistema operativo. SqlCompact me sirve ? si se puede tener el SqlCompact en una tablet con windows ?

    ResponderEliminar
  14. oye discupa porfavor no se si me pueda ayudar alguien no me aparece la opcion de base de datos local en visual basic porque ? espero una respuesta

    ResponderEliminar

Deja un comentario si el articulo fue de utilidad.