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
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
Del panel izquierdo seleccione Datos –>Del panel medio seleccione Base de datos Local –> Deje el nombre por default –>Presione Agregar
Seleccione Conjunto de Datos –> Presione Siguiente
Presione Finalizar
Esto nos crea tres nuevos elementos en el proyecto que podremos observar por medio del Explorador de soluciones:
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:
Seleccione Examinar –> Diríjase a la carpeta …Bin/Debug y seleccione el archivo de Base de datos –> Abrir –> Aceptar
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
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:
Click derecho sobre la tabla que acaba de crear –> Seleccione Mostrar Datos de tabla
Agregue algunos datos de ejemplo:
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:
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:
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:
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
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 !!!
ResponderEliminarHola:
ResponderEliminarMe 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
Este comentario ha sido eliminado por el autor.
ResponderEliminarGracias por tu post, realmente muy bueno!.. fue de mucha ayuda el unico que soluciono mi problema de forma sencilla y eficaz!:.
ResponderEliminargracias un saludo!.
Hola Joako:
EliminarMe 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...
Hola Jose Luis, Nuevamente Gracias y en hora buena por el blog!.
EliminarHola 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,
ResponderEliminaren 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,
Hola Alejandro: Gracias por visitar mi blog y por tus comentarios, ¿Lograste resolver lo que comentas?
Eliminarpues 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
Eliminarhola 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
ResponderEliminarHola Alejandro:
EliminarDe 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...
el instalador lo creo asi.
Eliminar1.- 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
Encontraste solucion a tu problema Alejandro!??
EliminarHola:
EliminarAgreguen el archivo como "Archivo Adjunto" dentro de su proyecto de instalación "Setup" no deberían de tener mayor problema...
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.
ResponderEliminargracias.
Hola Jairo:
EliminarPara 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...
COMO PUEDO IMPRIMIR UNA SOLA FILA DEL DATAGRID en un reportview? esto lo necesito con mucha urgencia.. Espero que me puedas ayudar con eso
ResponderEliminarHola:
EliminarPodrí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.
Hola José Luis.
ResponderEliminarSoy 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
Hola Gemma:
EliminarYo 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
Hola José Luis:
EliminarEn 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
Hola Gemma:
EliminarDesafortunadamente 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
Gracias José Luis:
EliminarAsí 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
Hola Jose Luis,
ResponderEliminarEs 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
Hola:
EliminarPero 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)...
como se haria con un datagrid
ResponderEliminarpodrias comparti el link de descarga gumdam2017@gmai.com
ResponderEliminartengo 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
ResponderEliminarEstoy 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 ?
ResponderEliminaroye 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