En este segundo artículo de la serie (si no leíste la parte 1 te la recomiendo) vamos a ver lo sencillo que resulta utilizar una base de datos SQLite en una aplicación escrita en C# (sería análogo para cualquier lenguaje .NET).
Lo primero que haremos será crear el proyecto en Visual Studio o cualquier otro IDE de desarrollo .NET y añadir a las referencias del proyecto el proveedor ADO.NET 2.0 para SQLite (en el artículo anterior comentamos dónde podíamos conseguir este proveedor). La librería DLL a añadir como referencia, y que habrá que distribuir con nuestra aplicación, será la denominada System.Data.SQLite.DLL que encontraremos dentro del fichero ZIP que descargamos. Una vez referenciado el proveedor para ADO.NET de SQLite ya podemos comenzar a escribir el código de nuestra aplicación. Para ello, deberemos añadir la directiva using correspondiente a la librería que acabamos de añadir:
using System.Data.SQLite;
A partir de este momento el código necesario para acceder y gestionar nuestra base de datos SQLite será completamente análogo al ya tradicional que utilizamos para el acceso a cualquier otro tipo de bases de datos, salvo que los nombres de las clases comenzarán con el prefijo «SQLite». Así, por ejemplo, tendremos a nuestra disposición las siguientes clases:
SQLiteConnection
SQLiteTransaction
SQLiteCommand
SQLiteParameter
SQLiteDataReader
…
Conexión con la base de datos
La conexión con la base de datos se realizará mediante la clase SQLiteConnection. Para el caso de SQLite, el único parámetro obligatorio de la cadena de conexión será el nombre del fichero de datos:
SQLiteConnection con = new SQLiteConnection("Data Source=index.bd");
Otros parámetros que pueden especificarse dentro de la cadena de conexión son la contraseña en caso de existir, el timeout por defecto para las operaciones sobre la base de datos, etc. Para ver todos los parámetros que podemos especificar en la conexión con la base de datos SQLite puede consultarse la ayuda proporcionada con el proveedor ADO.NET en el fichero SQLite.NET.chm
Consulta de datos
Para realizar una consulta parametrizada sobre la base de datos haremos uso de las clases SQLiteCommand, SQLiteParameter y SQLiteDataReader. Veamos cómo quedaría un método sencillo de consulta sobre una tabla especificando un parámetro de búsqueda:
public SQLiteDataReader selectClave(int clave) { SQLiteConnection con = new SQLiteConnection("Data Source=basedatos.bd"); SQLiteParameter param = new SQLiteParameter(); param.Value = clave; string cmdStr = "SELECT campo2 FROM tabla1 WHERE campo1 = ?;"; SQLiteCommand cmd = new SQLiteCommand(cmdStr, con); cmd.Parameters.Add(param); SQLiteDataReader reader = cmd.ExecuteReader(); return reader; }
Inserción de datos
La ejecución de una operación INSERT simple será análoga a la consulta descrita en el apartado anterior, salvo que el método de ejecución será ahora ExecuteNonQuery() ya que no se devolverá ningún valor:
public void insertClave(string campo1, int campo2) { SQLiteConnection con = new SQLiteConnection("Data Source=basedatos.bd"); SQLiteParameter param1 = new SQLiteParameter(); Param1.Value = campo1; SQLiteParameter param2 = new SQLiteParameter(); Param2.Value = campo2; string cmdStr = "INSERT INTO tabla1 (campo1, campo2) VALUES (?,?);"; SQLiteCommand cmd = new SQLiteCommand(cmdStr, con); cmd.Parameters.Add(param1); cmd.Parameters.Add(param2); SQLiteDataReader reader = cmd.ExecuteNonQuery(); return reader; }
Si en nuestra tabla existe un campo autonumérico y queremos recuperar su valor después de ejecutar la operación de INSERT, tendremos que modificar la instrucción ejecutada para añadir al final una llamada a la función last_insert_rowid() de SQLite y cambiar el método de ejecución por ExecuteScalar() para recuperar el valor devuelto:
string cmdStr = "INSERT INTO tabla1 (campo1, campo2) VALUES (?,?);" + "SELECT last_insert_rowid();"; ... int res = Convert.ToInt32(cmd.ExecuteScalar());
Transacciones en SQLite
Tal y como aconsejan en la ayuda del propio proveedor de ADO.NET para SQLite, en caso de ejecutar varias operaciones sobre una base de datos es recomendable hacerlas dentro de una misma transacción, algo que aumentará muchísimo el rendimiento de la base de datos y por tanto reducirá considerablemente el tiempo necesario para ejecutar las operaciones. Para comenzar una transacción bastará con llamar al método BeginTransaction() del objeto SQLiteConnection una vez creada la conexión, y para finalizar la transacción haciendo COMMIT o ROLLBACK de todas las operaciones llamaremos a los métodos Commit() o Rollback() respectivamente:
SQLiteConnection con = new SQLiteConnection("Data Source=basedatos.bd"); SQLiteTransaction tran = con.BeginTransaction(); ... tran.Commit();
Espero que este pequeño tutorial de SQLite sobre .NET les sea de ayuda.
10 comentarios
muy útil, es la primera web donde explica cómo usar sqlite en .net desde 0, gracias!
Si amig@, felicitaciones…muy buenos tus apuntes…espero lossigas avanzando…gracias y felicitaciones por tu aporte
Oye amigo como hago si quiero hacer una bd en sqlite embebida, que mi propia apliacion la genere.
Hermano me has salvado la vida, si no encuentro tu web y este buen pos, ya me hubiera ido por la linea de Mocosoft Access
Pd. Detalla como agregar la dll nada más, para los que no lo saben
Hola, respecto a como agregar la dll de sqlite, deben hacer lo siguiente:
Descargarla de la siguiente url: http://sqlite.phxsoftware.com/, solo deben descargar el instalador y proceder a instalar.
Luego van a la ficha proyecto y seleccionan la opcion agregar referencia. Una vez ahi, buscan System.Data.Sqlite y le dan aceptar.
En el proyecto, deben colocar using System.Data.SQlite; para usar la libreria, y listo!.
muy muy bueno, me encantaria saber o tener un ejemplo en asp.net con codigo vb, ya que no soy de usar c#, muchas gracias.
Como conecto SQLite en VB.net 2005 mediante ODBC, lo he intentado de varias formas, Ej:
Using dbConexion As New OdbcConnection(«DSN=dsn;Pwd=pass;»)
Me da este error:
ERROR [HY000] file is encrypted or is not a database (26)
Muy buen post, lastima que lo encontre despues de ir pegando conocimientos de varios y armar mis propias conclusiones, pero solo falta una cosa con la cual tuve un problema, que debo de incluir para ejecutar mi aplicacion en otro equio windows sin sqlite instalado segun bastaba con llevar el dll en la misma carpeta de la aplicacion pero yo no pude hacerlo tuve que instalar el descargable de la pagina sqlite, pero segun e leido si se puede sin hacer eso solo incluyendo las dll correctas en los lugares correctos.
Esta muy claro, pero cuando trato de aplicar este mismo procedimiento a un app store no permite el uso de esta librería, por que?
Hola prodria poner imagenes sobre el procedimiento de este ejercicio es que soy nueva y no estoy familiarizada y me urge saber sobre este tema