25 junio 2010

SQLite con C# desde Windows Forms



Después de ver cómo crear una aplicación de consola en C# que cree una base de datos con SQLite, guarde datos y los lea, vamos a ver cómo hacer algo similar en una aplicación "de ventana", usando Windows Forms.

Lo haremos usando componentes "normales", en vez de los predefinidos que permiten acceder a bases de datos. Tendremos una ventana principal, que muestre los datos actuales en un ListView, y que incluya un botón para añadir datos nuevos:


El botón de "Añadir" mostrará un segundo formulario, que será el que pida los datos:


Lo podemos hacer dando los siguientes pasos (en Visual C# 2008):
  • Crear un nuevo proyecto, que sea una "Aplicación de Windows Forms"
  • En la ventana principal, añadir un ListView y un botón.
  • Personalizar el ListView usando la pestaña de propiedades, de modo que tenga dos columnas (una para el código y otra para el nombre), y que como modo de visualización ("View") tenga el de "detalles" ("Details").
  • Crear una segunda ventana, desde el menú "Proyecto", en la opción "Agregar Windows Forms".
  • Añadir a esa ventana dos TextBox para los textos que introducirá el usuario, junto con sus Label para los textos aclaratorios y un botón para confirmar.
  • Añadir el fichero DLL a las referencias del proyecto (en la ventana del "Explorador de soluciones", pulsando el botón derecho sobre "References", y escogiendo el fichero System.Data.SQLite.DLL desde la pestaña "Examinar").
  • Completar el código fuente del proyecto.
En cuanto al código, las dos partes claves son la parte que lee los datos para rellenar el ListView y la parte que lanza la ventana auxiliar, toma de ella lo que teclee el usuario y después introduce esos datos.

La de rellenar el ListView (que se llamaría al final del contructor, y después de cada introducción de un nuevo dato) podría ser así:






 1:         private void ActualizarListaCiudades()
2: {

3: conexion =
4: new SQLiteConnection
5: ("Data Source=personal.sqlite;Version=3;New=False;Compress=True;");

6: conexion.Open();
7:
8: lstCiudades.Items.Clear();

9:
10: // Lanzamos la consulta y preparamos la estructura para leer datos
11:
string consulta = "select * from ciudad";
12: SQLiteCommand cmd = new SQLiteCommand(consulta, conexion);

13: SQLiteDataReader datos = cmd.ExecuteReader();
14: // Leemos los datos de forma repetitiva
15:
while (datos.Read())

16: {
17: string codigo = Convert.ToString(datos[0]);

18: string nombre = Convert.ToString(datos[1]);
19: // Y los mostramos

20:
ListViewItem item = new ListViewItem(codigo);
21: item.SubItems.Add(nombre);

22: lstCiudades.Items.Add(item);
23: }
24: conexion.Close();

25: }


Y la de añadir otro dato podría sería así:


 1:         private void InsertarDatos(string codigo, string nombre)
2: {

3:
4: string insercion; // Orden de insercion, en SQL
5:
SQLiteCommand cmd; // Comando de SQLite

6:

7: conexion =
8: new SQLiteConnection
9: ("Data Source=personal.sqlite;Version=3;New=False;Compress=True;");

10: conexion.Open();
11:
12: try
13: {

14: insercion = "INSERT INTO ciudad " +
15: "VALUES ('"+codigo+"','"+nombre+"');";

16: cmd = new SQLiteCommand(insercion, conexion);
17: cmd.ExecuteNonQuery();

18: }
19: catch (Exception e)
20: {
21: MessageBox.Show(

22: "No se ha podido insertar. Posiblemente un codigo esta repetido",
23: "Aviso");
24: }
25: conexion.Close();

26: }


De modo que la acción completa sobre el botón de "Añadir" sería algo como

1:         private void btAnadir_Click(object sender, EventArgs e)
2: {

3: ventanaAnadir.Limpiar();
4: ventanaAnadir.ShowDialog();

5: InsertarDatos(ventanaAnadir.GetCodigo(), ventanaAnadir.GetNombre());

6: ActualizarListaCiudades();
7: }


Y aquí puedes descargar el proyecto, con los dos fuentes, los ficheros DLL y el ejecutable: csharp_sqlite2.zip



2 comentarios:

Anónimo dijo...

Primero gracias por el articulo es genial. Pero tengo una duda ¿no seria mejor hacerlo con databindings? ¿cuales son las ventajas o inconvenientes?

Anónimo dijo...

Hola amigo.. gracias por el juguete, está bastante bueno. Mi duda pasa porque al crear un proyecto nuevo no deja agregar las referencias a la sqlite3.dll me reclama que no puede agregarla. No sé si me salté algún paso, o si hay que compilar primero esa dll de forma local, no se (por que el ejemplo que subiste, lo puedo ejecutar/debuggear sin problemas)...
Bueno, eso... y gracias...