SQLite y BD embebidas

997 views
Skip to first unread message

Kiquenet

unread,
Jan 21, 2014, 4:16:24 PM1/21/14
to altnet-...@googlegroups.com
Hola a todos,

se tiene en mente crear una aplicación de escritorio en C#, WinForms-WPF, y para cierta funcionalidad que sea liviana y ligera se ha pensado en una BD embebida (de coste cero) y a ser posible bastante rápida. No sé el estado del arte actual en 2014 a este respecto, dos como SQLite y SQLCE, aparecen mucho en foros de la comunidad.

También se pretende que la BD SQLite maneje en un registro un blob con una copia de binarios (imágenes jpf o documentos pdf por ejemplo). ¿SQLite es efectivamente tipado dinámico?

Además, hay BD Sql Server 2012 Express, por lo que también a futuro se planteará la idea de sincronización de la BD local con el Sql Server. Sync Framework es algo que me s uena, pero no sé si dará muchos dolores de cabeza, ni la curva de aprendizaje respecto SQLite y Sql Server.

Alguna sugerencia al respecto, en relación a sus experiencias con SQLite ? algún proyecto de ejemplo completo en .NET para la comunidad ?


Saludos y gracias.

majim...@taan.com.mx

unread,
Jan 21, 2014, 6:11:43 PM1/21/14
to altnet-...@googlegroups.com
En mi experiencia, en varios proyectos he usado Sqlite(principalmente para pocket pc y aplicaciones con estados fuera de linea y que despues sincronizan con un server) es bastante rapido y permite hacer cosas como db en memoria o montar otra archivo de DB y hacer una copia de las tablas.

Lo del tipo dinamico, tiene algunas restricciones(http://www.sqlite.org/datatype3.html), pero si defines un tipo de datos BLOB se guarda como binario, asi que no tendrias problema alguno para traerlo o no, lo que si siento es que si vas a estar haciendo lecturas y escrituras a la db en disco, y tienes muchos binarios, va a estar moviendo datos y te va a impactar en rendimiento, lo que puedes hacer es tener 2 db de sqlite, una para datos y otra para tus blobs, consultas en una y ya cuando requieras el blob, lo sacas en la otra db de archivos.

La sincronizacion con una base de datos mas grande o central, por ejemplo sql server u oracle lo hago asi:
  • De la aplicacion movil, tomo creo una copia de las tablas que necesito sincronizar en otra db, creando el archivo y usando ATTACH DATABASE(http://www.sqlite.org/lang_attach.html)
  • Estas copias las almaceno en un archivo de sqlite, lo comprimo y lo mando por post a un servidor.
  • El servidor descomprime y carga el archivo de sqlite, comienza a leer los registros y los pasa a objetos(Aqui se hace mas facil si tienes un ORM o un sqlDataReader que llene una lista de objetos)
  • Paso mis objetos a mi ORM y hago la insercion/update, si solo voy a insertar, con sql server puedes hacer bulk insert usando objetos.
  • Leo registros que tengo que pasar al cliente, creo otra DB de sqlite, y lo devuelvo en el response del post
  • La aplicacion pasa los datos de las tablas que envio el server con un select insert into a sus tablas,antes de insertar quizas truncas las tablas para que solo sea informacion nueva
Si igual no quieres enrollarte tanto y la conexion cuando sincronizas es wifi o por cable ethernet, puedes hacer que el server vuelva a crear la DB con los datos nuevos, borras la DB anterior en el dispostivo y copias la nueva, asi te evitas de problemas de sincronizacion en el dispositivo.

Como ORM para sqlite en el desktop he usado nhibernate,massive,dapper y simple.data, funcionan sin problemas, son compatibles y en el caso de nhibernate y massive tienes linq para las queries.

En el caso de windows mobile y pocket pc, pos no he visto un ORM que funcione bien, asi que todo ha sido a "pelo" nada mas pasando la informacion a objetos usando dataReaders y vaciando a objetos. 

Para crear la db y eso puedes usar Fluentmigrator, que te cree el script para crear la Base de datos y lo embedes en tu aplicacion, para que cree automaticamente la base de datos si no hay archivo o cualquier detalle.

De ejemplos, pos en estos proyectos lo uso y que puedo compartir (lo he usado en otros proyectos pero son de la compañia donde trabajo y no puedo compartir el codigo),podrían serte de utilidad o como referencia:

Saludos

Kiquenet

unread,
Feb 13, 2014, 10:33:25 AM2/13/14
to altnet-...@googlegroups.com
Muchas gracias Miguel, es un tema para seguir profundizando.

Diego Jancic

unread,
Feb 13, 2014, 10:46:42 AM2/13/14
to AltNet-Hispano
Hola,

Use SQLite varias veces, con NHibernate y directo.  Anda perfecto.  Vas a ver que como en todo hay algunos trucos, como por ejemplo no soporta Guids, pero se pueden emular con Strings.  Es un detalle, anda muy bien y hasta tenes comandos como UPSERT (Hace Update o Insert dependiendo de si lo encuentra o no). 

Si queres algo un poco mas potente, conozco algunos que usan Firebird tambien.  Es mas complicado, pero es Open Source y mas potente que SQLite, ademas permite correrlo como server y tener varios clientes conectados.  La 3era opcion, es MySQL, que tambien es gratis y aun mas potente que Firebird.

Para manejar la DB de SQLite uso este AddOn para Firefox:  https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/  que por mas que sea un AddOn (lo cual no es muy lindo), anda perfecto, es muy liviano y anda en cualquier SO!

Abrazo!
Diego


--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a altnet-hispan...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a altnet-...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/altnet-hispano.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Miguel Angel Jimenez Perez

unread,
Feb 13, 2014, 11:07:50 AM2/13/14
to altnet-...@googlegroups.com
Si usas System.Data.Sqlite tienes la opcion de habilitar si quieres la Guid como string o binaria en la cadena de conexion:
Data Source=c:\mydb.db;Version=3;BinaryGUID=True;

Entonces cuando haces la consulta, si usas un el metodo GetGuid del datareader,automaticamente te trae la GUID sin preocupaciones, lo mismo pasa si usas un ORM y declaras tu variable como GUID.

Mysql necesita un server fuera de la aplicacion, firebird si se puede usar embedida,pero por lo menos vi que era mas complejo el usarlo y transportar la informacion, porque en el caso del sqlite es solo un archivo y con firebird los archivos los guarda en una carpeta, siento que es mas complicado llevar el control y transportar varios archivos a uno solo.

Ademas sqlite por algo lo usan la gran mayoria de dispositivos moviles, android usa sqlite, apple en sus ipad,iphones,etc usa sqlite, microsoft tambien para ciertos productos, mozilla todo lo que almacena(cache,bookmarks,historial) esta en sqlite. Creo que es la opcion mas viable como db embedida y vas a encontrar muchisima informacion para los distintos lenguajes de programacion que existen.

Saludos.

Juan María Hernández

unread,
Feb 13, 2014, 12:04:25 PM2/13/14
to altnet-...@googlegroups.com
Hola,

Por si sirve de algo, nosotros estuvimos valorando hace un par de años varias opciones para usar desde .NET (con NHibernate) y al final nos decidimos por Firebird (que me recomendaron en esta lista de correo, por cierto).

Es verdad que el despliegue es más incómodo porque son unos cuantos ficheros en lugar de un sólo assembly, pero la verdad es que es muy potente y cuando tienes que manejar volúmenes de datos relativamente grandes (no hablo de big data, sino de hacer unos cuantos joins con tablas de nos pocos miles de registros), SQLite se quedaba un poco corto.

Lo peor de Firebird son los errores. Cuando tienes que bajar a lanzar SQLs y te equivocas en algo, los mensajes de error son francamente mejorables y puedes perder bastante tiempo intentando averiguar qué es lo que no le gusta de tu consulta.

Saludos,

Juanma.

Kiquenet

unread,
Feb 13, 2014, 2:42:33 PM2/13/14
to altnet-...@googlegroups.com
Muchas gracias por los comentarios @Diego, @Miguel Angel, @Juanma, muy útiles.

@Diego, cuando comentas que utilizas SQLite con NHibernate, a qué escenario concreto te refieres? implica sincronización con algún framework como Sync Framework de Microsoft?


Lo que puedo concluir, quizá equivocado, que SQLite es bastante útil, más extendido que Firebird, y muchas más referencias en la red, por un mayor  uso (a priori). Whatsapp lo utiliza también.

Bucenado a primeras, intentando ver si la open source community ha avanzado con SQLite...

 Muchas referencias como algún Helper:




Para temas de rendimiento imagino que hay que profundizar, pero veo que hay posibilidad de almacenar imágenes.

Temás más avanzado se tiene que investigar, transacciones, etcétera. Imagino que a partir de cierto tamaño del fichero .sqlite comenzará cierta degradación en rendimiento.




Firebird quizá sea más potente, no sé si en .NET C# habrá componentes open-source que facilite su trabajo (github, codeplex, etc...), que parece es más laborioso por ejemplo la gestión y control de errores.

MySQL no aplica creo, si requiere instalación de server.

Mi escenario actual sería una aplicación WinForms o Addin Visual Studio, con el SQLite local, y un servidor Oracle u Sql Server en la intranet. Lo cual implicaría tareas de sincronización de datos de SQLite a Sql Server.

Respecto a la sincronización también hay múltiples referencias:


Con WinRT hay un framework https://syncwinrt.codeplex.com/


Y he visto que también pudiera aplicarse lo que llaman Fluent Migrator:



Creo en lo que decía Miguel Ángel hace tiempo,

"algo que podriamos tener es una seccion en Alt.Net hispano donde se tenga un showcase de proyectos open source donde estamos trabajando y para que otros puedan verlos y si les son de utilidad los comiencen a usar.

O quizas un indice de proyectos(describiendo que tecnologias alternativas se usaron) con su enlace a github o bitbucket donde la gente con menos experiencia pueda bajarlos e ir viendo como aplicar ciertas tecnologias donde tengan dudas.

Creo que a veces mas que un tutorial o una platica, el codigo te puede ser mas de utilidad para resolver dudas puntuales o como material de consulta, mas si es un codigo que se usa en produccion o es mas cercano a la vida real."

Fin de la cita

Lo que mejor aclara los conceptos es ver código fuente, y mejor código real o más cercano a la vida real.

Proyectos o componentes de la comunidad en github, codeplex, nuget, tendrían que ser la referencia.


De todas las miles de referencias googleando, si alguno puede aportar sus referencias de cabecera en este tema sería
muy útil. O sino siempre se puede recurrir al delicious de ajlopez :-)

Saludos y muchas gracias, y perdón por la extensión.

Diego Jancic

unread,
Feb 13, 2014, 3:01:03 PM2/13/14
to AltNet-Hispano
Hola,

Yo creo que no hay ni mejor ni peor.  Si necesitas que sea una DB embebidda, podes usar SQLite o Firebird, la primera siendo mucho mejor para aplicaciones chicas o medianas y la segunda siendo mejor para aplicaciones medianas a grandes.

La sincronizacion mas compleja que hicimos fue de una app  FoxPro <->  Server hecho en .NET <-> iPhone, por lo que la data cambiaba de manos y de tecnologia todo el tiempo.  iOS usa SQLite internamentne por defecto para las apps asi que puede ser una ventaja.

Si no pensas manejar mucha data anda directamente con SQLite, no hay mucha duda.  Si queres muchas features, stored procedures, la posibilidad de que funcione como server tambien, entonces Firebird o MySQL.

Abrazo,
Diego



--

Kiquenet

unread,
Apr 2, 2014, 9:07:12 AM4/2/14
to altnet-...@googlegroups.com
Gracias por los comentarios.

Al final lo aplicaré en un proyecto, en lugar de utilizar xml, utilizar SQLite para almacenar datos relacionados de pocas tablas, unas seis.

Para facilitar el acceso a SQLite y hacerlo más fácil con algún  helper o wrapper, he visto que hay unos cuantos componentes como SQLite Helper, tiene alguna referencia de ello?

Ya había indicado antes el SqliteDatabase

La idea es facilitar con el menor código posible las tareas de

Crear Database (si no existe) 
Crear tabla using string var sql = "CREATE TABLE ..."; 
Insert data in table using string var sql = "INSERT INTO TABLE ..."; 
Obtener datos using string var sql = "SELECT * FROM TABLE WHERE .."; y rellenar entidades (any full sample about it ?) 

La sincronización con Sql Server quizá más adelante en el proceso haya que abordarla.


Diego Jancic

unread,
Apr 2, 2014, 9:32:10 AM4/2/14
to AltNet-Hispano
Tambien podes usar NH para acceder a la DB..  Para crear la DB solo tenes que conectarte y se crea sola (95% seguro).

Para hacer la sincronizacion con SQL Server, usa SqlBulkCopy para copiar todo del SQLite al SQL Server y despues hace el merge con tus tablas reales usando MERGE.  Tengo un muy importante proceso haciendo eso varias veces al dia (para diferentes usuarios) e importa literalmente cientos de miles de registros en 1 o 2 minutos tranquilamente, y eso porque el proceso no fue super optimizado.  Claro, eso es one-way solamente, la inversa es otra cosa.

Abrazo,
Diego


--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a altnet-hispan...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a altnet-...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Miguel Angel Jimenez Perez

unread,
Apr 2, 2014, 11:30:13 AM4/2/14
to altnet-...@googlegroups.com
Como menciona Diego Jancic, con Nhibernate ya tienes el 95% del trabajo hecho(ORM, creacion de la DB con schemaexport o schemaupdate).

Eso del helper siento que es mas engorroso, si quieres al rapido usa dapper, que es compatible con sqlite, lo puedes instalar con nuget:
install-package dapper

y para hacer un select y traer los datos a una entidad,por ejemplo persona:

public class Persona{
  public int Id {get;set;}
  public string Nombre {get;set;}
}

using (var conexion = new SqlConnection(CadenaConexion))
{
  conexion.Open();
  var datos=conexion.Query<Persona>("select id,nombre from personas");
  Persona primeraPersona=datos.FirstorDefault();
  conexion.Close();
}


Y listo, mucho mas facil que usar los helpers.

saludos.

Kiquenet

unread,
Aug 25, 2014, 8:30:15 AM8/25/14
to altnet-...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages