14 octubre 2012

Insertando datos en Access 2010 desde Visual Basic .net

En varios lugares de mi blog he explicado como mostrar datos de una tabla de Access en Visual Basic .net: puedes mostrar los datos en el ambiente de Visual mostrarlo en cajas de texto y buscar registros y mostrarlo en cajas de texto.  Una vez inserté un registro, pero no cambiaba de valor, solo insertaba el mismo registro siempre.  En esta ocasión hice un programa (que fue inspirado por el post del blog Relaciones Informáticas) que permite que usuarios llegue, ingresen su clave (o número de nómina o como le quieran llamar) y el programa registra su asistencia en una tabla hecha con Access 2010.
Aquí presento el diseño de la tabla, llamada Registro, que está en un archivo llamado Asistencia.accdb.  Si no sabes cómo crear una base de datos en Access o una tabla en vista diseño, fíjate en la primera parte de este post.  La tabla tiene estos registros y lo copié en la carpeta bin\Debug que está en la carpeta de la solución:
00_-_Tabla_Registro
En Visual Basic hice un nuevo proyecto que tiene una Label que dice “Escriba su clave”, una caja de texto llamado txtClave (que es donde van a teclear su número de empleado), dos labels donde mostrará la fecha y hora actual (llamadas lblFecha y lblHora respectivamente) y dos botones: una para registrar la asistencia (btnRegistra) y otra para salir (btnSalir).  También tiene un Timer (llamado Timer1) para actualizar la fecha y hora cada segundo (su propiedad Interval = 1000).  Así se ve la ventana en la vista diseño (están seleccionadas las dos etiquetas que tienen la fecha y hora: como están sin texto, si no las selecciono no se ven):
01_-_Form1_diseño
Ahora vamos con el código que lo hace funcionar.  Al principio de todo, aun antes del Public Class Form1, escribí lo siguiente:
02_-_Imports
Luego justo abajo del Public Class Form1 declaro el objeto que va a hacer la conexión con la base de datos y la que me va a permitir enviar comandos SQL a la tabla:
03_-_Dim_coc_y_com
En el Form_Load creo el objeto de conexión y arranco Timer1 para que muestre la fecha y hora en la ventana:
04_-_Form_Load
La variable con pone el ConnectionString de la conexión, es decir, le dice cómo se va a conectar a la base de datos y qué archivo de Access va a accesar (valga la redundancia).  Para archivos de Access 2010 siempre va a ser igual la primera parte (Provider=Microsoft.ACE.OLEDB.12.0;Data Source=) y después del Data Source= hay que indicar en dónde está el archivo que desea usar.  En este caso uso la propiedad Application.StartupPath que nos dice en qué carpeta se encuentra el archivo EXE de la aplicación (por eso copié la base de datos a la carpeta ) seguido de una diagonal invertida y el nombre del archivo de Access.
El siguiente código se encarga de insertar un nuevo registro en la tabla con la clave del usuario (que escribió en la caja de texto txtClave), la fecha y la hora actual.  Aquí pongo el código y abajo explico lo que sucede:
05_-_btnRegistra
Declaro dos variables: fecha y hora. En la fecha pongo la fecha actual (usando el método Date del objeto Now) y en hora creo una cadena con la hora actual.  Uso el bloque Try…Catch porque al trabajar con archivos en general y con bases de datos en particular, se puede tener muchos tipos de errores que causen que tu programa truene (alguien borró el archivo, alguien lo abrió en modo diseño, etc.).  Comienzo abriendo la conexión (conConexion.Open) y creo un nuevo objeto OleDbCommand.  A este objeto (llamado cmdCommand) comienzo por inicializar algunas propiedades para que pueda funcionar: la propiedad Connection que indica la conexión por medio de la cual se va a comunicar con la tabla, CommandText que contiene la instrucción SQL que va a ejecutar (si te fijas, armé una cadena con los datos de las cajas de texto y etiquetas), ExecuteNonQuery que ejecuta el comando (siempre y cuando no sea una consulta, o sea que no sea un SELECT) y Close que cierra el objeto.
Para finalizar, este es el código del Timer1_Tick que se ejecuta cada segundo para actualizar fecha y hora en las etiquetas de la ventana y el del botón de Salir (btnSalir) que se encarga de eliminar la conexión y termina la ejecución del programa:
06_-_Timer_y_btnSalir
Al ejecutarlo, se ve así:
07_-_Ejecución_1     08_-_Ejecución_2
Como verás, de forma muy similar también se pueden llevar a cabo instrucciones SQL como el DELETE y UPDATE.  Espero que les haya sido útil.

16 comentarios:

3ric Martinez dijo...

no me inserta los datos yo use 3 cajas de texto una es el id, otra accesorio, otra cantidad, este es mi codigo espero me puedas ayudar.

blic Class extras
Dim conConexion As OleDb.OleDbConnection
Dim cmdCommand As OleDb.OleDbCommand

Private Sub ExistenciasBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExistenciasBindingNavigatorSaveItem.Click
Me.Validate()
Me.ExistenciasBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.ExistenciasDataSet)

End Sub

Private Sub extras_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: esta línea de código carga datos en la tabla 'ExistenciasDataSet.existencias' Puede moverla o quitarla según sea necesario.
Me.ExistenciasTableAdapter.Fill(Me.ExistenciasDataSet.existencias)
Dim con As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
Application.StartupPath & "\existencias.accdb"
conConexion = New OleDb.OleDbConnection(con)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
conConexion.Open()
cmdCommand = New OleDb.OleDbCommand
cmdCommand.Connection = conConexion
cmdCommand.CommandText = "INSERT INTO existencias(id,Accesorios,Cantidad) values(' " & _
TextBox7.Text & "','" & TextBox1.Text & "','" & TextBox2.Text & "')"
cmdCommand.ExecuteNonQuery()
conConexion.Close()
MsgBox("Datos agregados correctamente", MsgBoxStyle.Information, "Registro de Accesorios")
catch ex As Exception
MsgBox("Error de conexion", MsgBoxStyle.Exclamation, "Registro de accesorios")
End Try
TextBox7.Text = ""
TextBox7.Focus()
TextBox1.Text = ""
TextBox1.Focus()
TextBox2.Text = ""
TextBox2.Focus()

End Sub
End Class

Tony Valderrama dijo...

¿De qué tipo de datos son los campos id, Accesorios y Cantidad en tu tabla de Access? Es que si no son de tipo texto, te va a dar problemas por la forma en que combinas comillas y apostrofes en el CommendText. Por ejemplo, si id y Cantidad son numéricos, hay que quitar los apostrofes que los rodean, por ejemplo:

cmdCommand.CommandText = "INSERT INTO existencias(id,Accesorios,Cantidad) values(" & _
TextBox7.Text & ",'" & TextBox1.Text & "'," & TextBox2.Text & ")"

Pequeño cambio, pero importante. ¡Saludos!

Unknown dijo...

Disculpa modifique el codigo pero no se conecta me dice error de conexion

Imports System.Data
Imports System.Data.OleDb
Public Class Form1
Dim conconexion As OleDb.OleDbConnection
Dim cmdcommand As OleDb.OleDbCommand

Private Sub form1_load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim con As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
Application.StartupPath & "\Cliente.accdb"
conconexion = New OleDb.OleDbConnection(con)
Timer1.Start()
End Sub
Private Sub btnRegistra_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegistra.Click
Dim hora As String = Trim(Str(Now.Hour)) & ":" & Trim(Str(Now.Minute)) & ":" & Trim(Str(Now.Second))
Dim fecha As Date = Now.Date
Try
conconexion.Open()
cmdcommand = New OleDb.OleDbCommand
cmdcommand.Connection = conconexion
cmdcommand.CommandText = "INSERT INTO Tabla1 (Numero,Cliente,Nombre,Codigo,Presentacion,Hora,Fecha) VALUES (" & _
Txtnumero.Text & ",'" & txtcliente.Text & "','" & txtnombre.Text & "','" & txtcodigo.Text & "','" & txtpresentacion.Text & "','" &
hora & "','" & fecha & "')"
cmdcommand.ExecuteNonQuery()
conconexion.Close()
MsgBox("Registro Correcto", MsgBoxStyle.Information, "Registro de Cliente")
Catch ex As Exception
MsgBox("Error de Conexion", MsgBoxStyle.Exclamation, "Registro de Cliente")
End Try
Txtnumero.Text = ""
Txtnumero.Focus()
txtcliente.Text = ""
txtcliente.Focus()
txtnombre.Text = ""
txtnombre.Focus()
txtcodigo.Text = ""
txtcodigo.Focus()
txtpresentacion.Text = ""
txtpresentacion.Focus()

Tony Valderrama dijo...

¿En dónde marca el error? ¿En el Form_Load o en el btnRegistra_click o en ambos?

Unknown dijo...

Al momento de ingresar un dato me dice error de conexion, si me entiende?

van van dijo...

a mi igua.. manda directo al catch diciendo la ventana de error, estoy trabajando en Visual estudio 2012 xpreess, no se si cambie el codigo para conectarse. ya verifique tu codigo, es igual, solo que hice lo del chavo, ingrese otros datos..
saludos, espero comentarioo

Tony Valderrama dijo...

Estimado Van Van:

¿Qué error te manda? Usa el Err.Description cuando entra al Catch para ver cuál es el problema.

Anónimo dijo...

muchas gracias me sirvgio mucho

Anónimo dijo...

NIcolas:
Buenas, no hace mucho que empece con este lenguaje y se me dificultan algunas cositas, este es supuestamente un codigo para guardar "X" informacion de una Base de Datos. La conexion hacia la DB ya la tengo establecida en otro Form, me gustaria saber si me falta algo o cometi algun error... Porque no me permite guardar,me salta el msg de error, desde ya muchas gracias y esperando comentario...


Imports System.Data.OleDb

Public Class frm_ficha

Private Sub frm_ficha_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'TODO: esta línea de código carga datos en la tabla 'Base_de_datos1DataSet.Ficha' Puede moverla o quitarla según sea necesario.
Me.FichaTableAdapter.Fill(Me.Base_de_datos1DataSet.Ficha)
End Sub

'Declarar Variables
Dim Nombre = txtNombre
Dim Apellido = txtApellido
Dim Descripcion = txtDescripcion
Dim Fecha = txtFecha
Dim Id = txtId

'Grilla DB

Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)

End Sub

Dim conexion As New OleDbConnection
Dim comandos As New OleDbCommand

Private Sub btn_save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_save.Click


Try
comandos = New OleDbCommand("INSERT INTO Ficha (Id,Nombre,Apellido,Descripcion,Fecha)" & Chr(12) &
"VALUES(txtNombre,txtApellido,txtDescripcion,txtFecha,txtId)", conexion)
comandos.Parameters.AddWithValue("@Nombre", txtNombre.Text)
comandos.Parameters.AddWithValue("@Apellido", txtApellido.Text)
comandos.Parameters.AddWithValue("@Descripcion", txtDescripcion.Text)
comandos.Parameters.AddWithValue("@Fecha", txtFecha.Text)
comandos.Parameters.AddWithValue("@Id", txtId.Text)
comandos.ExecuteNonQuery()
MsgBox("Guardado Correctamente", vbInformation, "Correcto")
txtNombre.Clear()
txtApellido.Clear()
txtDescripcion.Clear()
txtFecha.Clear()
txtId.Clear()
txtNombre.Focus()
Catch ex As Exception
MsgBox("Error al Guardar", vbExclamation, "Error")
End Try
End Sub

Private Sub btn_Salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Salir.Click
conexion.Close()
Me.Close()
End Sub
End Class

Alexis Martinez (@Alkz6) dijo...

No precisamente buscaba lo de "Application.StartupPath" pero sin querer llegue a el. gracias por el dato :)

César A. Martínez dijo...

Amigo una pregunta: ¿Es aconsejable enlazar el formulario directamente a la tabla o a una consulta SQL de la propia base de datos como hace Microsoft en muchos ejemplos de Access? ¿Afecta esto el rendimiento y/o seguridad? Saludos!

Tony Valderrama dijo...

Yo encontré, en versiones viejas de Visual Basic, que era mejor hacer el acceso directamente con SQL. Era más rápido y funcional. Pero ahora no lo he probado.

Unknown dijo...

como veo la conexion con access?

Unknown dijo...

brother, excelente tu post!
lo aplique y fue de mucha ayuda....
pero tu sabes como crear una tablas desde vb2010 y obviamente tambn crearle campos a esa tabla?

te lo agradeceria mucho! estoy atento a tu respuesta; mi correo es jexuz27@hotmail.com

carlos dijo...

Hola
Necesito saber como puedo hacer que se guarde la fecha en la tabla de la base de datos para luego ver cuando se registro
Gracias por tu ayuda
Saludos
Carlos

Tony Valderrama dijo...

No sé, Carlos, exactamente que necesitas. Puedes hacer una tabla que contenga un campo fecha (que guarda fecha y hora) y al entrar al programa que añada automáticamente un registro con el usuario y la fecha/hora del sistema.

Tal vez la instrucción SQL cambie un poco dependiendo del DBMS que estés usando: algunos lo ponen entre comillas, Access necesita que la fecha esté entre #, etc.

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...