{"id":7458,"date":"2014-12-11T11:23:47","date_gmt":"2014-12-11T10:23:47","guid":{"rendered":"http:\/\/www.palentino.es\/blog\/?p=7458"},"modified":"2023-05-11T21:17:31","modified_gmt":"2023-05-11T19:17:31","slug":"trabajando-con-sqlite-desde-visual-studio-2013-informes-y-control-de-registros","status":"publish","type":"post","link":"https:\/\/www.palentino.es\/blog\/trabajando-con-sqlite-desde-visual-studio-2013-informes-y-control-de-registros\/","title":{"rendered":"SQLite desde Visual Studio. Informes y control de registros."},"content":{"rendered":"<p style=\"text-align: justify;\">En esta entrada os mostrar\u00e9 como conectar una base de datos local creada en <strong>SQlite<\/strong> desde<strong> Microsoft Visual Studio 2013.<\/strong><br \/>\nNo existen muchos ejemplos al menos que haya encontrado en Internet actualizados a 2013 y con acceso a la base gratuita y de forma program\u00e1tica.<\/p>\n<p style=\"text-align: justify;\">Tambi\u00e9n os dejar\u00e9 el c\u00f3digo fuente y una demo del ejecutable en funcionamiento.<\/p>\n<p style=\"text-align: justify;\">Es ideal para comenzar alg\u00fan proyecto que tengas en mente &#8230;<\/p>\n<p style=\"text-align: justify;\">Las ventaja de este mini proyecto es que posibilita <strong>conectar a una base de datos de car\u00e1cter gratuito que puede ser usada sin necesidad de instalar nada en el ordenador local<\/strong>. Adem\u00e1s puede ser accedida desde internet con lenguajes del lado servidor como PHP.<\/p>\n<p style=\"text-align: justify;\">Otra caracter\u00edstica es que no emplea DSN externos. Por otro lado posee asociado un<strong> Datagrid est\u00e1ndar<\/strong> (no un control o dlls de pago) para realizar todo tipo de operaciones sobre la tabla clientes. Os dejar\u00e9 el c\u00f3digo que he programado de forma sencilla.<\/p>\n<p style=\"text-align: justify;\"><strong>Altas, bajas, consultas, modificaciones<\/strong>. Posibilita <strong>ordenar<\/strong> por campo, <strong>editar desde la propia tabla<\/strong>, borrado selectivo de registros. Asociaci\u00f3n de campos externos con el Datagrid.<\/p>\n<p style=\"text-align: justify;\">Comencemos &#8230;<\/p>\n<p><!--more--><\/p>\n<p>La utilidad de este ejemplo es mostrar como podemos conectarnos a la base directamente desde programaci\u00f3n y realizar operaciones con los registros.<br \/>\nProgramado en <strong>Vb.net<\/strong>.<\/p>\n<p>Pantalla de ejemplo demostrativo.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7459\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/1.jpg\" alt=\"1\" width=\"916\" height=\"546\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/1.jpg 916w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/1-300x178.jpg 300w\" sizes=\"auto, (max-width: 916px) 100vw, 916px\" \/><\/a><\/p>\n<p>Pantalla de llamada a formulario con control para ver informes.<\/p>\n<p><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7460\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/2.jpg\" alt=\"2\" width=\"673\" height=\"374\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/2.jpg 673w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/2-300x166.jpg 300w\" sizes=\"auto, (max-width: 673px) 100vw, 673px\" \/><\/a><\/p>\n<p>Tambi\u00e9n es preciso se\u00f1alar que podemos gestionar la base de datos con herramientas gratuitas como <a href=\"http:\/\/sqliteadmin.orbmu2k.de\/\" target=\"_blank\" rel=\"noopener\">sqliteadmin<\/a>, para crear SMD y SDD.<\/p>\n<p><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/Sqlite-administrator.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7465\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/Sqlite-administrator.jpg\" alt=\"Sqlite-administrator\" width=\"776\" height=\"495\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/Sqlite-administrator.jpg 776w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/Sqlite-administrator-300x191.jpg 300w\" sizes=\"auto, (max-width: 776px) 100vw, 776px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Para poder programar esto desde una soluci\u00f3n es preciso instalar el paquete mediante Nuget SQLite Core en las dos arquitecturas x.<\/p>\n<p><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/5.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7463\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/5.jpg\" alt=\"5\" width=\"900\" height=\"600\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/5.jpg 900w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/5-300x200.jpg 300w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Para crear el control de informes que viene en el propio Visual studio (no necesitamos Crystal) podemos usar el ReportViewer.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/reportviewer.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7464\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2014\/12\/reportviewer.jpg\" alt=\"reportviewer\" width=\"160\" height=\"61\" \/><\/a><\/p>\n<p>Recuerdo que es importante tener control sobre las rutas de acceso a los informes (carpeta informes- informe-clientes.rdlc)<\/p>\n<p>&nbsp;<\/p>\n<p><strong>C\u00f3digo del formulario principal.<\/strong><\/p>\n<pre class=\"lang:vbnet decode:true\">'--- C\u00f3digo para gesti\u00f3n de tablas con SQLite desde VB.net. \r\n'--- Editado con Visual Studio 2013.\r\n'--- Para el software PWP\r\n'--- Fecha 10-12-2014 por Oscar de la Cuesta\r\n'--- www.palentino.es\r\n\r\nImports Microsoft.VisualBasic\r\nImports System\r\nImports System.Windows.Forms\r\nImports System.Drawing\r\n\r\n'--- OTRAS LIBRERIAS UTILES\r\nImports System.Text\r\nImports System.IO\r\nImports System.Net\r\nImports System.Xml\r\n\r\n'-- Para trabajar con SQlite\r\nImports System.Data.SQLite\r\nImports System.Data\r\n\r\n\r\nPublic Class CCclientes\r\n\r\n    'IMPORTNTE, Variable para el tipo de tabla a gestionar\r\n    Dim tabla = \"clientes\"\r\n    Dim Nombre_Base = \"Pwp-base.s3db\"\r\n\r\n    Private bs As New BindingSource()\r\n\r\n    Private dataAdapter As New SQLiteConnection\r\n    Private apd\r\n    Dim ruta, cadena As String\r\n    Dim tab As String = tabla\r\n    Dim conexion = New SQLiteConnection(cadena)\r\n    Dim cmd = New SQLiteCommand(\"SELECT * FROM \" &amp; tabla, conexion)\r\n    Dim adapter = New SQLiteDataAdapter(cmd)\r\n    Dim dt As DataTable = Nothing\r\n    Dim ds As New DataSet\r\n\r\n    Private Sub Contactos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load\r\n\r\n        labeltabla.Text = \"Tabla \" &amp; tabla\r\n\r\n        DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter\r\n\r\n        ruta = Application.StartupPath + \"\\\" &amp; Nombre_Base\r\n        cadena = \"Data Source=\" &amp; Application.StartupPath &amp; \"\\\" &amp; Nombre_Base\r\n\r\n        Dim conexion = New SQLiteConnection(cadena)\r\n        Dim cmd = New SQLiteCommand(\"SELECT * FROM \" &amp; tabla, conexion)\r\n        Dim adapter = New SQLiteDataAdapter(cmd)\r\n        Dim dt As DataTable = Nothing\r\n        Dim ds As New DataSet\r\n\r\n        Try\r\n            adapter.Fill(DataSet1, tabla)\r\n            adapter.Fill(ds, tabla)\r\n            dt = ds.Tables(tabla)\r\n        Catch ex As Exception\r\n            MsgBox(\"Se ha cancelado la acci\u00f3n: \" &amp; ex.Message)\r\n\r\n        End Try\r\n\r\n        'Haciendo un binding  \r\n        bs.DataSource = adapter\r\n\r\n        Me.DataGridView1.DataSource = DataSet1\r\n        Me.DataGridView1.DataMember = tab\r\n        DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.FloralWhite\r\n        DataGridView1.DefaultCellStyle.BackColor = Color.Beige\r\n\r\n        Try\r\n            estado.Text = \"Tiene \" &amp; CStr(dt.Rows.Count) &amp; \" \" &amp; tabla &amp; \".\"\r\n\r\n        Catch ex As Exception\r\n            MsgBox(\"Error en la cuenta de \" &amp; tabla &amp; \" en la base: \" &amp; ex.Message)\r\n\r\n        Finally\r\n            If Not cmd Is Nothing Then cmd.Dispose()\r\n            DataGridView1.Refresh()\r\n\r\n        End Try\r\n\r\n    End Sub\r\n\r\n    Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick\r\n\r\n        ID.Text = \"\"\r\n        empresa.Text = \"\"\r\n\r\n        Dim i As Integer\r\n        i = DataGridView1.CurrentRow.Index\r\n        'El id\r\n        If Not String.IsNullOrEmpty(DataGridView1.Item(0, i).Value.ToString) Then\r\n            ID.Text = DataGridView1.Item(0, i).Value\r\n        End If\r\n        'la empresa\r\n        If Not String.IsNullOrEmpty(DataGridView1.Item(1, i).Value.ToString) Then\r\n            empresa.Text = DataGridView1.Item(1, i).Value\r\n        End If\r\n\r\n        'Otros ejemplos, OJO cambiar tambien en el evento de cambio de celda del datagrid\r\n\r\n        'Apellidos\r\n        '  If Not String.IsNullOrEmpty(DataGridView1.Item(2, i).Value.ToString) Then\r\n        'Iautor.Text = DataGridView1.Item(2, i).Value\r\n        ' End If\r\n        'Email\r\n        '  If Not String.IsNullOrEmpty(DataGridView1.Item(3, i).Value.ToString) Then\r\n        'Ifecha.Text = DataGridView1.Item(3, i).Value\r\n        '  End If\r\n        \r\n\r\n    End Sub\r\n\r\n\r\n\r\n    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Guardar.Click\r\n\r\n        Try\r\n            BNuevo.Visible = True\r\n            BNuevo.Enabled = True\r\n            Borrar.Enabled = True\r\n            Modificar.Enabled = True\r\n            Ncancel.Visible = False\r\n\r\n            Dim conexion As New SQLite.SQLiteConnection()\r\n\r\n            conexion.ConnectionString = cadena\r\n            conexion.Open()\r\n            cmd = conexion.CreateCommand\r\n\r\n            cmd.CommandText = \"INSERT INTO \" &amp; tabla &amp; \"(id, empresa) \" &amp; _\r\n            \"values(\" &amp; ID.Text &amp; \",\" &amp; _\r\n            \"'\" &amp; empresa.Text &amp; \"'\" &amp; _\r\n            \");\"\r\n\r\n            cmd.ExecuteNonQuery()\r\n\r\n            estado.Text = \"Estado: Datos almacenados correctamente.\"\r\n\r\n            Modificar.Enabled = True\r\n            Guardar.Enabled = False\r\n\r\n            'Refrescamos el control superior.\r\n            Me.refrescar_Click(sender, New System.EventArgs())\r\n            DataGridView1.Refresh()\r\n\r\n            'Inicializamos los datos.\r\n            ID.Text = \"\"\r\n            empresa.Text = \"\"\r\n\r\n            DataGridView1.CurrentCell = DataGridView1.Rows(CInt(ID.Text) - 1).Cells(0)\r\n\r\n        Catch ex As Exception\r\n            estado.Text = \"Error en la inserci\u00f3n : \" &amp; ex.Message\r\n        Finally\r\n        End Try\r\n\r\n\r\n\r\n\r\n    End Sub\r\n\r\n    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Borrar.Click\r\n        Dim salida As Integer\r\n        Dim conexion As New SQLite.SQLiteConnection()\r\n        conexion.ConnectionString = cadena\r\n        conexion.Open()\r\n        cmd = conexion.CreateCommand\r\n        If ID.Text &lt;&gt; \"\" Then\r\n            salida = MsgBox(\"\u00bf Est\u00e1 seguro de realizar esta acci\u00f3n ?, Seleccionado: \" &amp; ID.Text, MsgBoxStyle.YesNo)\r\n        End If\r\n        If salida = 6 Then\r\n            Try\r\n                cmd.CommandText = \"DELETE FROM \" &amp; tabla &amp; \" WHERE ID = \" &amp; ID.Text\r\n                cmd.ExecuteNonQuery()\r\n                'Refrescamos el control superior.\r\n                DataGridView1.Refresh()\r\n                Me.refrescar_Click(sender, New System.EventArgs())\r\n                estado.Text = \"Estado: El registro se ha eliminado correctamente.\"\r\n                ID.Text = \"\"\r\n                empresa.Text = \"\"\r\n            Catch ex As Exception\r\n                MsgBox(\"Error en el borrado \" &amp; ex.Message)\r\n            End Try\r\n        End If\r\n    End Sub\r\n\r\n\r\n\r\n    Private Sub refrescar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles refrescar.Click\r\n\r\n        Dim dt As DataTable = Nothing\r\n        Dim ds As New DataSet\r\n        ruta = Application.StartupPath + \"\\\" &amp; Nombre_Base\r\n        cadena = \"Data Source=\" &amp; Application.StartupPath &amp; \"\\\" &amp; Nombre_Base\r\n        Dim conexion = New SQLiteConnection(cadena)\r\n        Dim cmd = New SQLiteCommand(\"SELECT * FROM \" &amp; tabla, conexion)\r\n        Dim adapter = New SQLiteDataAdapter(cmd)\r\n        Try\r\n            adapter.MissingMappingAction = MissingMappingAction.Passthrough\r\n            adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey\r\n        Catch ex As Exception\r\n            MsgBox(\"Error en la conexion con la base: \" &amp; ex.Message)\r\n        End Try\r\n\r\n        For Each tbl As DataTable In DataSet1.Tables\r\n            tbl.Clear()\r\n        Next\r\n\r\n        'Rellenar la tabla ahora\r\n        Try\r\n            adapter.Fill(DataSet1, tab)\r\n            adapter.Fill(ds, tabla)\r\n            dt = ds.Tables(tabla)\r\n\r\n        Catch ex As Exception\r\n            MsgBox(\"Fallo al Rellenar: \" &amp; ex.Message)\r\n\r\n        End Try\r\n\r\n        'Haciendo un binding ahora \r\n        bs.DataSource = adapter\r\n\r\n        Me.DataGridView1.DataSource = DataSet1\r\n        Me.DataGridView1.DataMember = tab\r\n        DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.FloralWhite\r\n        DataGridView1.DefaultCellStyle.BackColor = Color.Beige\r\n        DataGridView1.Refresh()\r\n        DataGridView1.Update()\r\n\r\n        'Contamos de nuevo los contactos.\r\n        Try\r\n            estado.Text = \"Tiene \" &amp; CStr(dt.Rows.Count) &amp; \" registros en la tabla \" &amp; tabla\r\n        Catch ex As Exception\r\n\r\n        Finally\r\n\r\n        End Try\r\n\r\n\r\n    End Sub\r\n\r\n    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Modificar.Click\r\n\r\n        Dim conexion As New SQLite.SQLiteConnection()\r\n        'Dim Micomando As SQLiteCommand\r\n        conexion.ConnectionString = cadena\r\n        conexion.Open()\r\n        cmd = conexion.CreateCommand\r\n\r\n\r\n        Dim i As Integer\r\n        Try\r\n            i = DataGridView1.CurrentRow.Index\r\n            'Add Items in the table\r\n            Dim sql As String = \"UPDATE \" &amp; tabla &amp; \" SET \" &amp; _\r\n            \"empresa = '\" &amp; empresa.Text &amp; \"' \" &amp; _\r\n            \"WHERE (id = \" &amp; DataGridView1.Item(0, i).Value &amp; \")\"\r\n\r\n            cmd.CommandText = sql\r\n            cmd.ExecuteNonQuery()\r\n\r\n            'Refrescamos el control superior.\r\n            DataGridView1.Refresh()\r\n            Me.refrescar_Click(sender, New System.EventArgs())\r\n            estado.Text = \"Estado: Datos modificados correctamente.\"\r\n            DataGridView1.CurrentCell = DataGridView1.Rows(i).Cells(0)\r\n        Catch ex As Exception\r\n            MsgBox(ex.Message)\r\n        Finally\r\n\r\n        End Try\r\n\r\n\r\n    End Sub\r\n\r\n\r\n    Private Sub BNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BNuevo.Click\r\n\r\n        Ncancel.Visible = True\r\n        Borrar.Enabled = False\r\n        ID.Text = \"\"\r\n        empresa.Text = \"\"\r\n\r\n        Try\r\n            Dim conexion As New SQLite.SQLiteConnection()\r\n            conexion.ConnectionString = cadena\r\n            conexion.Open()\r\n            cmd = conexion.CreateCommand\r\n\r\n            Dim numero As Object\r\n            cmd.CommandText = \"Select Max(id) as cuenta from \" &amp; tabla\r\n            numero = cmd.ExecuteScalar()\r\n\r\n            If ((IsDBNull(numero))) Then\r\n                ID.Text = \"1\"\r\n            Else\r\n                If numero = 0 Then\r\n                    ID.Text = \"1\"\r\n                Else\r\n                    ID.Text = CStr(numero + 1)\r\n                End If\r\n            End If\r\n\r\n            Guardar.Enabled = True\r\n            Modificar.Enabled = False\r\n            estado.Text = \"Estado: Preparando campos para el alta de un nuevo registro.\"\r\n            BNuevo.Enabled = False\r\n\r\n        Catch ex As Exception\r\n            MsgBox(\"Error en la inserci\u00f3n: \" &amp; ex.Message)\r\n\r\n        Finally\r\n\r\n        End Try\r\n\r\n\r\n\r\n    End Sub\r\n\r\n\r\n    Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click\r\n\r\n        Dim salida As Integer\r\n        salida = MsgBox(\"\u00bf Est\u00e1 seguro de realizar esta acci\u00f3n ?, Borrar\u00e1 todos los registros: \" &amp; ID.Text, MsgBoxStyle.YesNo)\r\n        If salida = 6 Then\r\n            Try\r\n\r\n                Dim conexion As New SQLite.SQLiteConnection()\r\n                conexion.ConnectionString = cadena\r\n                conexion.Open()\r\n                cmd = conexion.CreateCommand\r\n                cmd.CommandText = \"DELETE FROM \" &amp; tabla &amp; \" WHERE id &gt;=0\"\r\n                cmd.ExecuteNonQuery()\r\n\r\n                'Refrescamos el control superior.\r\n                DataGridView1.Refresh()\r\n                Me.refrescar_Click(sender, New System.EventArgs())\r\n\r\n                StatusStrip1.Text = \"Estado: Se han eliminado todos los registros.\"\r\n\r\n                ID.Text = \"\"\r\n                empresa.Text = \"\"\r\n\r\n            Catch ex As Exception\r\n                MsgBox(\"Error en el borrado de registros de la base: \" &amp; ex.Message)\r\n\r\n            End Try\r\n        End If\r\n    End Sub\r\n\r\n\r\n    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click\r\n\r\n        Dim conexion = New SQLiteConnection(cadena)\r\n        Dim cmd = New SQLiteCommand(\"SELECT * FROM \" &amp; tabla, conexion)\r\n        Dim sadapter = New SQLiteDataAdapter(cmd)\r\n        Dim sTable As DataTable\r\n        Dim sDs As DataSet\r\n        sDs = New DataSet()\r\n        sadapter.Fill(sDs, tabla)\r\n        sTable = sDs.Tables(tabla)\r\n        adapter.Update(sTable)\r\n    End Sub\r\n\r\n    Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged\r\n\r\n        ID.Text = \"\"\r\n        empresa.Text = \"\"\r\n\r\n        Dim i As Integer\r\n        i = DataGridView1.CurrentRow.Index\r\n        If Not String.IsNullOrEmpty(DataGridView1.Item(0, i).Value.ToString) Then\r\n            ID.Text = DataGridView1.Item(0, i).Value\r\n        End If\r\n        'El nombre\r\n        If Not String.IsNullOrEmpty(DataGridView1.Item(1, i).Value.ToString) Then\r\n            empresa.Text = DataGridView1.Item(1, i).Value\r\n        End If\r\n\r\n        'Necesario indicar mas campos en caso de diferente TABLA, ojo\r\n\r\n        Me.Button6_Click(sender, New System.EventArgs())\r\n\r\n\r\n    End Sub\r\n\r\n\r\n\r\n    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles buscar.Click\r\n\r\n\r\n        DataGridView1.Refresh()\r\n\r\n        Dim conexion As New SQLite.SQLiteConnection()\r\n        Dim cmd As SQLiteCommand\r\n        conexion.ConnectionString = cadena\r\n        conexion.Open()\r\n        cmd = conexion.CreateCommand\r\n\r\n        Dim campo, valor As String\r\n        campo = InputBox(\"Introduzca el nombre del campo tal y como aparece en la tabla:\")\r\n        If campo &lt;&gt; \"\" Then\r\n            valor = InputBox(\"Introduzca el valor que desea buscar:\")\r\n            If valor &lt;&gt; \"\" Then\r\n\r\n                If UCase(campo) = \"ID\" Then\r\n                    cmd.CommandText = \"Select * FROM \" &amp; tabla &amp; \" WHERE \" &amp; campo &amp; \" = \" &amp; valor &amp; \"\"\r\n                Else\r\n                    cmd.CommandText = \"Select * FROM \" &amp; tabla &amp; \" WHERE \" &amp; campo &amp; \" Like '%\" &amp; valor &amp; \"%'\"\r\n                End If\r\n            End If\r\n        End If\r\n\r\n\r\n        Dim adapter = New SQLiteDataAdapter(cmd)\r\n        Dim dt As DataTable = Nothing\r\n        Dim ds As New DataSet\r\n        DataGridView1.DataBindings.Clear()\r\n\r\n        For i = 0 To Me.DataGridView1.Rows.Count - 1\r\n            Me.DataGridView1.Rows(0).Selected = True\r\n            Me.DataGridView1.Rows(0).Dispose()\r\n            Me.DataGridView1.Rows.RemoveAt(Me.DataGridView1.SelectedRows(0).Index)\r\n        Next\r\n\r\n        DataGridView1.Refresh()\r\n\r\n        Try\r\n            adapter.Fill(DataSet1, tabla)\r\n            adapter.Fill(ds, tabla)\r\n            dt = ds.Tables(tabla)\r\n        Catch ex As Exception\r\n            MsgBox(\"Se ha cancelado la acci\u00f3n: \" &amp; ex.Message)\r\n            Me.refrescar_Click(sender, New System.EventArgs())\r\n\r\n        End Try\r\n\r\n        'Haciendo un binding  ;-)... \r\n        bs.DataSource = adapter\r\n\r\n        Me.DataGridView1.DataSource = DataSet1\r\n        Me.DataGridView1.DataMember = tab\r\n        DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.FloralWhite\r\n        DataGridView1.DefaultCellStyle.BackColor = Color.Beige\r\n\r\n\r\n    End Sub\r\n\r\n    Private Sub Ncancel_Click(sender As Object, e As EventArgs) Handles Ncancel.Click\r\n        Guardar.Enabled = False\r\n        Modificar.Enabled = True\r\n        Ncancel.Visible = False\r\n        BNuevo.Enabled = True\r\n        Borrar.Enabled = True\r\n\r\n    End Sub\r\n\r\n    Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Bseleccionados.Click\r\n\r\n        ' Dim cnDb As OdbcConnection\r\n        Dim salida, i As Integer\r\n\r\n        Dim conexion As New SQLite.SQLiteConnection()\r\n        'Dim Micomando As SQLiteCommand\r\n        conexion.ConnectionString = cadena\r\n        conexion.Open()\r\n        cmd = conexion.CreateCommand\r\n\r\n        If ID.Text &lt;&gt; \"\" Then\r\n            salida = MsgBox(\"\u00bf Est\u00e1 seguro de realizar esta acci\u00f3n ?\", MsgBoxStyle.YesNo)\r\n        End If\r\n\r\n        If salida = 6 Then\r\n            Try\r\n                For Each row As DataGridViewRow In DataGridView1.SelectedRows\r\n                    cmd.CommandText = \"DELETE FROM \" &amp; tabla &amp; \" WHERE id = \" &amp; row.Cells(0).Value\r\n                    cmd.ExecuteNonQuery()\r\n                Next\r\n                estado.Text = \"Estado: El registro\/s se han eliminado correctamente.\"\r\n                ID.Text = \"\"\r\n                empresa.Text = \"\"\r\n                'Refrescamos el control superior.\r\n                DataGridView1.Refresh()\r\n                Me.refrescar_Click(sender, New System.EventArgs())\r\n            Catch ex As Exception\r\n                MsgBox(\"Error en el borrado \" &amp; ex.Message)\r\n            End Try\r\n        End If\r\n\r\n    End Sub\r\n\r\n\r\n    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click\r\n        Form2.Show()\r\n\r\n    End Sub\r\nEnd Class<\/pre>\n<p>&nbsp;<\/p>\n<p>Descarga del proyecto de ejemplo, con librer\u00edas y base de datos en SQlite.<br \/>\n<a href=\"http:\/\/www.palentino.es\/rar\/formularios-ejemplo-SQlite.rar\" target=\"_blank\" rel=\"noopener\">C\u00f3digo Fuente<\/a><\/p>\n<p>Programa ejemplo demostrativo \u00a0del proyecto, ejecutar<strong> PWP.exe<\/strong><\/p>\n<p><a href=\"http:\/\/www.palentino.es\/rar\/demo-SQLite-VisualStudio2013.rar\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2874\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/12\/Descarga.png\" alt=\"Descarga\" width=\"300\" height=\"100\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En esta entrada os mostrar\u00e9 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\u00e1tica. Tambi\u00e9n os dejar\u00e9 el c\u00f3digo fuente y una demo del ejecutable en funcionamiento. Es ideal para comenzar alg\u00fan proyecto que tengas en mente &#8230; Las ventaja de este mini proyecto es que posibilita conectar a una base de datos de car\u00e1cter gratuito que puede ser usada sin necesidad de instalar nada en el ordenador local. Adem\u00e1s puede ser accedida desde internet con lenguajes del lado servidor como PHP. Otra caracter\u00edstica es que no emplea DSN externos. Por otro lado posee asociado un Datagrid est\u00e1ndar (no un control o dlls de pago) para realizar todo tipo de operaciones sobre la tabla clientes. Os dejar\u00e9 el c\u00f3digo que he programado de forma sencilla. Altas, bajas, consultas, modificaciones. Posibilita ordenar por campo, editar desde la propia tabla, borrado selectivo de registros. Asociaci\u00f3n de campos externos con el Datagrid. Comencemos &#8230;<\/p>\n","protected":false},"author":1,"featured_media":7088,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40,557,102,5,7,295],"tags":[599,598,597,465],"class_list":["post-7458","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bases-de-datos","category-it","category-microsoft","category-programacion","category-software","category-sql-2","tag-datagrid","tag-informes","tag-sql-server-2013","tag-sqlite"],"_links":{"self":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/7458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/comments?post=7458"}],"version-history":[{"count":9,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/7458\/revisions"}],"predecessor-version":[{"id":10753,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/7458\/revisions\/10753"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media\/7088"}],"wp:attachment":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media?parent=7458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/categories?post=7458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/tags?post=7458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}