En esta entrada os mostraré como conectar una base de datos local creada en SQlite desde Microsoft Visual Studio 2013.
No existen muchos ejemplos al menos que haya encontrado en Internet actualizados a 2013 y con acceso a la base gratuita y de forma programática.
También os dejaré el código fuente y una demo del ejecutable en funcionamiento.
Es ideal para comenzar algún proyecto que tengas en mente …
Las ventaja de este mini proyecto es que posibilita conectar a una base de datos de carácter gratuito que puede ser usada sin necesidad de instalar nada en el ordenador local. Además puede ser accedida desde internet con lenguajes del lado servidor como PHP.
Otra característica es que no emplea DSN externos. Por otro lado posee asociado un Datagrid estándar (no un control o dlls de pago) para realizar todo tipo de operaciones sobre la tabla clientes. Os dejaré el código que he programado de forma sencilla.
Altas, bajas, consultas, modificaciones. Posibilita ordenar por campo, editar desde la propia tabla, borrado selectivo de registros. Asociación de campos externos con el Datagrid.
Comencemos …
La utilidad de este ejemplo es mostrar como podemos conectarnos a la base directamente desde programación y realizar operaciones con los registros.
Programado en Vb.net.
Pantalla de ejemplo demostrativo.
Pantalla de llamada a formulario con control para ver informes.
También es preciso señalar que podemos gestionar la base de datos con herramientas gratuitas como sqliteadmin, para crear SMD y SDD.
Para poder programar esto desde una solución es preciso instalar el paquete mediante Nuget SQLite Core en las dos arquitecturas x.
Para crear el control de informes que viene en el propio Visual studio (no necesitamos Crystal) podemos usar el ReportViewer.
Recuerdo que es importante tener control sobre las rutas de acceso a los informes (carpeta informes- informe-clientes.rdlc)
Código del formulario principal.
'--- Código para gestión de tablas con SQLite desde VB.net. '--- Editado con Visual Studio 2013. '--- Para el software PWP '--- Fecha 10-12-2014 por Oscar de la Cuesta '--- www.palentino.es Imports Microsoft.VisualBasic Imports System Imports System.Windows.Forms Imports System.Drawing '--- OTRAS LIBRERIAS UTILES Imports System.Text Imports System.IO Imports System.Net Imports System.Xml '-- Para trabajar con SQlite Imports System.Data.SQLite Imports System.Data Public Class CCclientes 'IMPORTNTE, Variable para el tipo de tabla a gestionar Dim tabla = "clientes" Dim Nombre_Base = "Pwp-base.s3db" Private bs As New BindingSource() Private dataAdapter As New SQLiteConnection Private apd Dim ruta, cadena As String Dim tab As String = tabla Dim conexion = New SQLiteConnection(cadena) Dim cmd = New SQLiteCommand("SELECT * FROM " & tabla, conexion) Dim adapter = New SQLiteDataAdapter(cmd) Dim dt As DataTable = Nothing Dim ds As New DataSet Private Sub Contactos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load labeltabla.Text = "Tabla " & tabla DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter ruta = Application.StartupPath + "\" & Nombre_Base cadena = "Data Source=" & Application.StartupPath & "\" & Nombre_Base Dim conexion = New SQLiteConnection(cadena) Dim cmd = New SQLiteCommand("SELECT * FROM " & tabla, conexion) Dim adapter = New SQLiteDataAdapter(cmd) Dim dt As DataTable = Nothing Dim ds As New DataSet Try adapter.Fill(DataSet1, tabla) adapter.Fill(ds, tabla) dt = ds.Tables(tabla) Catch ex As Exception MsgBox("Se ha cancelado la acción: " & ex.Message) End Try 'Haciendo un binding bs.DataSource = adapter Me.DataGridView1.DataSource = DataSet1 Me.DataGridView1.DataMember = tab DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.FloralWhite DataGridView1.DefaultCellStyle.BackColor = Color.Beige Try estado.Text = "Tiene " & CStr(dt.Rows.Count) & " " & tabla & "." Catch ex As Exception MsgBox("Error en la cuenta de " & tabla & " en la base: " & ex.Message) Finally If Not cmd Is Nothing Then cmd.Dispose() DataGridView1.Refresh() End Try End Sub Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick ID.Text = "" empresa.Text = "" Dim i As Integer i = DataGridView1.CurrentRow.Index 'El id If Not String.IsNullOrEmpty(DataGridView1.Item(0, i).Value.ToString) Then ID.Text = DataGridView1.Item(0, i).Value End If 'la empresa If Not String.IsNullOrEmpty(DataGridView1.Item(1, i).Value.ToString) Then empresa.Text = DataGridView1.Item(1, i).Value End If 'Otros ejemplos, OJO cambiar tambien en el evento de cambio de celda del datagrid 'Apellidos ' If Not String.IsNullOrEmpty(DataGridView1.Item(2, i).Value.ToString) Then 'Iautor.Text = DataGridView1.Item(2, i).Value ' End If 'Email ' If Not String.IsNullOrEmpty(DataGridView1.Item(3, i).Value.ToString) Then 'Ifecha.Text = DataGridView1.Item(3, i).Value ' End If End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Guardar.Click Try BNuevo.Visible = True BNuevo.Enabled = True Borrar.Enabled = True Modificar.Enabled = True Ncancel.Visible = False Dim conexion As New SQLite.SQLiteConnection() conexion.ConnectionString = cadena conexion.Open() cmd = conexion.CreateCommand cmd.CommandText = "INSERT INTO " & tabla & "(id, empresa) " & _ "values(" & ID.Text & "," & _ "'" & empresa.Text & "'" & _ ");" cmd.ExecuteNonQuery() estado.Text = "Estado: Datos almacenados correctamente." Modificar.Enabled = True Guardar.Enabled = False 'Refrescamos el control superior. Me.refrescar_Click(sender, New System.EventArgs()) DataGridView1.Refresh() 'Inicializamos los datos. ID.Text = "" empresa.Text = "" DataGridView1.CurrentCell = DataGridView1.Rows(CInt(ID.Text) - 1).Cells(0) Catch ex As Exception estado.Text = "Error en la inserción : " & ex.Message Finally End Try End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Borrar.Click Dim salida As Integer Dim conexion As New SQLite.SQLiteConnection() conexion.ConnectionString = cadena conexion.Open() cmd = conexion.CreateCommand If ID.Text <> "" Then salida = MsgBox("¿ Está seguro de realizar esta acción ?, Seleccionado: " & ID.Text, MsgBoxStyle.YesNo) End If If salida = 6 Then Try cmd.CommandText = "DELETE FROM " & tabla & " WHERE ID = " & ID.Text cmd.ExecuteNonQuery() 'Refrescamos el control superior. DataGridView1.Refresh() Me.refrescar_Click(sender, New System.EventArgs()) estado.Text = "Estado: El registro se ha eliminado correctamente." ID.Text = "" empresa.Text = "" Catch ex As Exception MsgBox("Error en el borrado " & ex.Message) End Try End If End Sub Private Sub refrescar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles refrescar.Click Dim dt As DataTable = Nothing Dim ds As New DataSet ruta = Application.StartupPath + "\" & Nombre_Base cadena = "Data Source=" & Application.StartupPath & "\" & Nombre_Base Dim conexion = New SQLiteConnection(cadena) Dim cmd = New SQLiteCommand("SELECT * FROM " & tabla, conexion) Dim adapter = New SQLiteDataAdapter(cmd) Try adapter.MissingMappingAction = MissingMappingAction.Passthrough adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey Catch ex As Exception MsgBox("Error en la conexion con la base: " & ex.Message) End Try For Each tbl As DataTable In DataSet1.Tables tbl.Clear() Next 'Rellenar la tabla ahora Try adapter.Fill(DataSet1, tab) adapter.Fill(ds, tabla) dt = ds.Tables(tabla) Catch ex As Exception MsgBox("Fallo al Rellenar: " & ex.Message) End Try 'Haciendo un binding ahora bs.DataSource = adapter Me.DataGridView1.DataSource = DataSet1 Me.DataGridView1.DataMember = tab DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.FloralWhite DataGridView1.DefaultCellStyle.BackColor = Color.Beige DataGridView1.Refresh() DataGridView1.Update() 'Contamos de nuevo los contactos. Try estado.Text = "Tiene " & CStr(dt.Rows.Count) & " registros en la tabla " & tabla Catch ex As Exception Finally End Try End Sub Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Modificar.Click Dim conexion As New SQLite.SQLiteConnection() 'Dim Micomando As SQLiteCommand conexion.ConnectionString = cadena conexion.Open() cmd = conexion.CreateCommand Dim i As Integer Try i = DataGridView1.CurrentRow.Index 'Add Items in the table Dim sql As String = "UPDATE " & tabla & " SET " & _ "empresa = '" & empresa.Text & "' " & _ "WHERE (id = " & DataGridView1.Item(0, i).Value & ")" cmd.CommandText = sql cmd.ExecuteNonQuery() 'Refrescamos el control superior. DataGridView1.Refresh() Me.refrescar_Click(sender, New System.EventArgs()) estado.Text = "Estado: Datos modificados correctamente." DataGridView1.CurrentCell = DataGridView1.Rows(i).Cells(0) Catch ex As Exception MsgBox(ex.Message) Finally End Try End Sub Private Sub BNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BNuevo.Click Ncancel.Visible = True Borrar.Enabled = False ID.Text = "" empresa.Text = "" Try Dim conexion As New SQLite.SQLiteConnection() conexion.ConnectionString = cadena conexion.Open() cmd = conexion.CreateCommand Dim numero As Object cmd.CommandText = "Select Max(id) as cuenta from " & tabla numero = cmd.ExecuteScalar() If ((IsDBNull(numero))) Then ID.Text = "1" Else If numero = 0 Then ID.Text = "1" Else ID.Text = CStr(numero + 1) End If End If Guardar.Enabled = True Modificar.Enabled = False estado.Text = "Estado: Preparando campos para el alta de un nuevo registro." BNuevo.Enabled = False Catch ex As Exception MsgBox("Error en la inserción: " & ex.Message) Finally End Try End Sub Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click Dim salida As Integer salida = MsgBox("¿ Está seguro de realizar esta acción ?, Borrará todos los registros: " & ID.Text, MsgBoxStyle.YesNo) If salida = 6 Then Try Dim conexion As New SQLite.SQLiteConnection() conexion.ConnectionString = cadena conexion.Open() cmd = conexion.CreateCommand cmd.CommandText = "DELETE FROM " & tabla & " WHERE id >=0" cmd.ExecuteNonQuery() 'Refrescamos el control superior. DataGridView1.Refresh() Me.refrescar_Click(sender, New System.EventArgs()) StatusStrip1.Text = "Estado: Se han eliminado todos los registros." ID.Text = "" empresa.Text = "" Catch ex As Exception MsgBox("Error en el borrado de registros de la base: " & ex.Message) End Try End If End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim conexion = New SQLiteConnection(cadena) Dim cmd = New SQLiteCommand("SELECT * FROM " & tabla, conexion) Dim sadapter = New SQLiteDataAdapter(cmd) Dim sTable As DataTable Dim sDs As DataSet sDs = New DataSet() sadapter.Fill(sDs, tabla) sTable = sDs.Tables(tabla) adapter.Update(sTable) End Sub Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged ID.Text = "" empresa.Text = "" Dim i As Integer i = DataGridView1.CurrentRow.Index If Not String.IsNullOrEmpty(DataGridView1.Item(0, i).Value.ToString) Then ID.Text = DataGridView1.Item(0, i).Value End If 'El nombre If Not String.IsNullOrEmpty(DataGridView1.Item(1, i).Value.ToString) Then empresa.Text = DataGridView1.Item(1, i).Value End If 'Necesario indicar mas campos en caso de diferente TABLA, ojo Me.Button6_Click(sender, New System.EventArgs()) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles buscar.Click DataGridView1.Refresh() Dim conexion As New SQLite.SQLiteConnection() Dim cmd As SQLiteCommand conexion.ConnectionString = cadena conexion.Open() cmd = conexion.CreateCommand Dim campo, valor As String campo = InputBox("Introduzca el nombre del campo tal y como aparece en la tabla:") If campo <> "" Then valor = InputBox("Introduzca el valor que desea buscar:") If valor <> "" Then If UCase(campo) = "ID" Then cmd.CommandText = "Select * FROM " & tabla & " WHERE " & campo & " = " & valor & "" Else cmd.CommandText = "Select * FROM " & tabla & " WHERE " & campo & " Like '%" & valor & "%'" End If End If End If Dim adapter = New SQLiteDataAdapter(cmd) Dim dt As DataTable = Nothing Dim ds As New DataSet DataGridView1.DataBindings.Clear() For i = 0 To Me.DataGridView1.Rows.Count - 1 Me.DataGridView1.Rows(0).Selected = True Me.DataGridView1.Rows(0).Dispose() Me.DataGridView1.Rows.RemoveAt(Me.DataGridView1.SelectedRows(0).Index) Next DataGridView1.Refresh() Try adapter.Fill(DataSet1, tabla) adapter.Fill(ds, tabla) dt = ds.Tables(tabla) Catch ex As Exception MsgBox("Se ha cancelado la acción: " & ex.Message) Me.refrescar_Click(sender, New System.EventArgs()) End Try 'Haciendo un binding ;-)... bs.DataSource = adapter Me.DataGridView1.DataSource = DataSet1 Me.DataGridView1.DataMember = tab DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.FloralWhite DataGridView1.DefaultCellStyle.BackColor = Color.Beige End Sub Private Sub Ncancel_Click(sender As Object, e As EventArgs) Handles Ncancel.Click Guardar.Enabled = False Modificar.Enabled = True Ncancel.Visible = False BNuevo.Enabled = True Borrar.Enabled = True End Sub Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Bseleccionados.Click ' Dim cnDb As OdbcConnection Dim salida, i As Integer Dim conexion As New SQLite.SQLiteConnection() 'Dim Micomando As SQLiteCommand conexion.ConnectionString = cadena conexion.Open() cmd = conexion.CreateCommand If ID.Text <> "" Then salida = MsgBox("¿ Está seguro de realizar esta acción ?", MsgBoxStyle.YesNo) End If If salida = 6 Then Try For Each row As DataGridViewRow In DataGridView1.SelectedRows cmd.CommandText = "DELETE FROM " & tabla & " WHERE id = " & row.Cells(0).Value cmd.ExecuteNonQuery() Next estado.Text = "Estado: El registro/s se han eliminado correctamente." ID.Text = "" empresa.Text = "" 'Refrescamos el control superior. DataGridView1.Refresh() Me.refrescar_Click(sender, New System.EventArgs()) Catch ex As Exception MsgBox("Error en el borrado " & ex.Message) End Try End If End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click Form2.Show() End Sub End Class
Descarga del proyecto de ejemplo, con librerías y base de datos en SQlite.
Código Fuente
Programa ejemplo demostrativo del proyecto, ejecutar PWP.exe