05 diciembre 2007

Otra nota: Visual Basic 2005, ADO .NET y Access

En el mensaje anterior, mostré la manera de usar instrucciones SQL para insertar datos a una tabla de una base de datos SQL Server. Hacerlo en Access es muy similar: solo cambian algunos objetos.

Como complemento del mensaje anterior, aquí pongo el código que haría lo mismo, solo que usando una tabla de una base de datos Access.


Espero que te sea útil. ¡Hasta la próxima!

45 comentarios:

Pepe dijo...

No hay manera de insertar las nuevas filas en el data set y luego el dataset pasarselo entero a la BD????

Tony Valderrama dijo...

Creo que no hay prob lema en hacerlo como mencionas. Yo me acostumbré a hacer el acceso de esta manera por tradiciones antiguas (en un trabajo tenía que accesar a una base de datos en SQL Server que estaba a cientos de kilómetros del lugar donde trabajaba desde un programa en Visual Basic 6 y después de muchas pruebas, esta era la manera en que se ejecutaba con mayor rapidez).

¡Saludos!

Anónimo dijo...

Hola Disculpe y si en vez de dejar predispuestos los datos, quiero subir lo que contenga algun textbox eso cambiaria el codigo? y de que manera?

Tony Valderrama dijo...

Lo que tendría que cambiar sería el Comm.CommandText. Tendrías que armar una cadena más o menos de esta manera:

Comm.CommandText="INSERT INTO LIBRO (ISBN,Titulo,Autor,Editorial,Anio,Lugar,NoPag) VALUES ('" & Textbox1.Text & "','" & Textbox2.Text & "','" & Textbox3.Text & "'," & textbox4.Text & "," & Textbox5.Text & ")"

Recuerda que los campos que son texto deben llevar apóstrofes antes y después como lo hice alrededor del Textbox1, Textbox2 y Textbox3. Como el Anio y NoPag son numéricos no fue necesario ponerlos.

Espero que haya quedado más claro. ¡Saludos!

Juan Jose Gutierrez Aldana dijo...

Amigo mira estoy provando eso para un trabajo:

Dim strconex As String = "Provider = Microsoft.jet.oledb.4.0;" & _
"Data Source=CarDes.mdb"
Dim conex As New OleDb.OleDbConnection
Dim comm As OleDb.OleDbCommand
conex.ConnectionString = strconex
comm.Connection = conex
comm.CommandText = "insert into doc (coddoc,NombreApellido,Especialidad,NConsultorio) VALUES ('1','1','1','1')"
conex.Open()
comm.ExecuteNonQuery()
conex.Close()
MsgBox("Registro Agregado")

y mira lo que me dice:

Variable 'comm' is used before it has been assigned a value. A null reference exception could result at runtime.

Uso el 2008 pero todas tus guias me an funcionado que puedo hacer?? :S:S

Juan Jose Gutierrez Aldana dijo...

Amigo mira estoy provando eso para un trabajo:

Dim strconex As String = "Provider = Microsoft.jet.oledb.4.0;" & _
"Data Source=CarDes.mdb"
Dim conex As New OleDb.OleDbConnection
Dim comm As OleDb.OleDbCommand
conex.ConnectionString = strconex
comm.Connection = conex
comm.CommandText = "insert into doc (coddoc,NombreApellido,Especialidad,NConsultorio) VALUES ('1','1','1','1')"
conex.Open()
comm.ExecuteNonQuery()
conex.Close()
MsgBox("Registro Agregado")

y mira lo que me dice:

Variable 'comm' is used before it has been assigned a value. A null reference exception could result at runtime.

Uso el 2008 pero todas tus guias me an funcionado que puedo hacer?? :S:S

Juan Jose Gutierrez Aldana dijo...

Correjido ya encontre mi problema disculpa la molestia :D

Juan Jose Gutierrez Aldana dijo...

Amigo como Borro o modifico????

Tony Valderrama dijo...

Que bueno que encontraste la solución al problema. Por cierto, ¿cuál era el problema?

Por otro lado puedes usar SQL para borrar (DELETE FROM) y para actualizar (UPDATE). En este blog tengo algunos ejemplos hechos en VB6 que muestran la sintaxis. Creo que no se te complicará demasiado usar código similar en VB 2005.

¡Saludos!

Juan Jose Gutierrez Aldana dijo...

Esta linea:
Dim comm As OleDb.OleDbCommand

era:

Dim comm As New OleDb.OleDbCommand

Tony una pregunta como capturo la fecha y la Hora, en un texto... que orden puedo usar para que 1 texto me muestre la hora y otro la fecha...

Tony Valderrama dijo...

Gracias por mostrarnos cual fue el error: así aprendí algo nuevo, algo que buscar cuando me ocurra una falla como esa.

Hablando de fecha y hora, la función Today te devuelve la fecha de hoy y la función TimeOfDay te devuelve la hora actual. Si lo quieres en una cadena, usa las funciones DateString y TimeString.

¡Saludos!

Juan Jose Gutierrez Aldana dijo...

Tony una pregunta mira tengo una tabla llamada pacientes, donde agrego nuevos registros a una tabla, es posible hacer que cada vez que cree un paciente cree una tabla con el nombre del paciente es decir algo como

create table PACIENTE_historia, en paciente colocara el nombre o la cedula del paciente que se a registrado.

Podrias decirme como lo haria Gracias :D

Tony Valderrama dijo...

Creo que no te conviene hacer una nueva tabla por cada paciente... tendrías al rato una base de datos enorme y demasiado confunso.

Mejor diseña tus tablas para que puedas agregar los datos de los pacientes a una o varias tablas y cada vez agregues registros a esas tablas y no tablas nuevas.

Yo escribí algo en mi blog sobre diseño de tablas. El artículo se llama "Diseñando tablas chidas" y lo escribí el 11/Feb/2007. Ojalá te sea de utilidad.

¡Saludos!

Juan Jose Gutierrez Aldana dijo...

El problema es q es para ls historias medicas y ese campo en una tabla abarca mucho mas de 255 caracteres y por eso no me sirve de campo como podria hacer :S

Tony Valderrama dijo...

Desconozco el problema completo, pero se me ocurre tener una tabla con una llave primaria del no. del paciente y el campo grande de 255 caracteres que necesitas. De esa manera, al dar de alta un nuevo paciente, solo agregas un registro en esa tabla.

A lo mejor te sirve la idea...

Juan Jose Gutierrez Aldana dijo...

Bueno tony cree una tabla llamada historia para que cada paciente que haga una consulta agrege un nuevo valor en historia, amigo y e presentado el proyecto todo bien, gracias a tus consejos gracias, ahora entrando al pasado como usar base de datos en acces o sql pero usando el visual 6 porq no recuerdo nada, tendras un tema por casualidad?? (ojo en estos momentos estoy buscando y no e visto nada :S)

Tony Valderrama dijo...

Busca en mi blog el tema ADO y comienza desde abajo. El 27/Feb/2007 está el primero.

Ojalá te sea de utilidad. ¡Saludos!

kcho2099 dijo...

hola si pudieras subir un video pq lo hice como tu lo manejas pero no me agrega nada o pon uno deonde agregar actualizar y borrar si no es much amolestia

Karolina dijo...

hola, hize la prueba para agregar un registro pero en la linea comm.ExecuteNonQuery()
me sale un error que dice que necesita una consulta actualizable, por favor si alguien me pudiera ayudar ??
Graciaas!

Juan Jose Gutierrez Aldana dijo...

Hola Karolina si puedes poner el codigo de la consulta que estas realizando podre ayudarte...

Sim embargo si sigues la guia al 100% no debe de dar error a mi no me dio...

Espero respuesta saludos....

Juan Pablo Sepulveda dijo...

Hola Tony! tus guias me han funcionado de lo mejor pero tengo el siguiente problema.

este es el codigo

Private Sub btIngresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btIngresar.Click
If textITEM.Text = "" Then
MsgBox("Debe Ingresar un ITEM valido")
End If
Dim strConex As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:.\Inventario_ryy.mdb"
Dim Conex As New OleDb.OleDbConnection
Dim Comm As New OleDb.OleDbCommand
Conex.ConnectionString = strConex
Comm.Connection = Conex
Comm.CommandText = "INSERT INTO inventario (ITEM,DESCRIPCION,UNIDAD,CANTIDAD,PROVEEDOR,AREA,FECHA,Nº ENTRADA, V UNITARIO, V TOTAL) VALUES (" & textITEM.Text & ",'" & textDESCRIPCION.Text & "','" & textUNIDAD.Text & "'," & textCANTIDAD.Text & ",'" & textPROVEEDOR.Text & "','" & textPROVEEDOR.Text & "','" & textAREA.Text & "','" & textFECHA.Text & "'," & textNUMENTRADA.Text & "," & textVUNITARIO.Text & "," & textVTOTAL.Text & ")"
Conex.Open()
Comm.ExecuteNonQuery()
Conex.Close()
MsgBox("Producto ingresado exitosamente")

Pero al ejecutarlo me marca la sentencia Comm.ExecuteNonQuery() y dice SYNTAX ERROR
Si puedes ayudarme te lo agradeceria un monton

Juan Pablo Sepulveda dijo...

Disculpa, este es el error que dice cuando marca la sentencia anterior

Syntax error in INSERT INTO statement.

Tony Valderrama dijo...

Juan Pablo:

Un detalle que no tiene nada que ver con el problema, pero te puede causar problemas más adelante: en donde pones el End If (donde comparas si TextITEM.TEXT="", yo pondría un Else y pondría el End If al final del código, después del MsgBox("Producto ingresado exitosamente").

Probablemente te esté marcando error porque tus campos tienen espacios. Cambia en el código y en tu tabla el nombre del campo Nº ENTRADA por NoENTRADA, V UNITARIO por VUnitario, y V TOTAL por VTotal o algo por el estilo.

Para SQL un espacio indica que termina una cosa y lo que sigue debe ser otra parte de la instrucción. Si de plano no puedes cambiar los nombres a los campos, enciérralos en corchetes cuadrados, por ejemplo [V UNITARIO].

Espero que esto te esa útil...

Juan Jose Gutierrez Aldana dijo...

Amigo Juan yo tampien pienso lo mismo ademas que me a pasado algo similar, no dejes que ningun campo de una BD tenga espacios, prueba y si no funciona avisas y buscamos una solucion..

Suerte y Saludos al Tony =)

Juan Pablo Sepulveda dijo...

Muchas gracias por tu ayuda Tony!! pero tengo 3 consultas.

La primera, no entiendo bien a que te refieres con poner un Else, pues el End If ya viene despues del MsgBox.

La segunda es que al modificar en access los campos (columnas) de la tabla inventario de la base de datos inventario_ryy ahora en el DataGridVIew no me carga la tabla

La tercera es como puedo grabar esos datos en la base de datos

Todo esto es para hacer un inventario, agradezco su ayuda

Juan Pablo Sepulveda dijo...

Tony ya solucione todo lo anterior, lo unico es que si ejecuto el programa dentro de Visual Basic 2005 no se graban los datos, solo se van grabando si ejecuto el ejecutable en la carpeta "Debug", pero supongo que no importa. Ahora quiero preguntar si sabes como mostrar en una rejilla todos los datos que compartan la misma informacion en un determinado campo.

Por ejemplo que si yo escribo en un textbox1.text = "11223344" que en la rejilla me muestre todos los ITEM que tengan en el campo NoEntrada 11223344

Muchas gracias por todo!

Tony Valderrama dijo...

Tendrías que hacer una instrucción SELECT (en mi blog fíjate en el tema SQL) de tal forma que el CommandText sería algo así:

"SELECT lista de campos FROM tabla WHERE NoEntrada LIKE '*" & text1.text & "*'"

Tony Valderrama dijo...

Fíjate en este post:

http://tony-valderrama.blogspot.com/2007/11/access-y-visual-basic-2005.html

Juan Pablo Sepulveda dijo...

Gracias pero ya vi ese post y me sirvio bastante para lo que estaba haciendo, muy bueno, pero no explica como usar la sentencia SELECT FROM WHILE que al parecer es la que necesito, pues al apretar un boton debo dejar en un datagridview solamente aquellos productos que en el campo NoEntrada tengan el valor del textbox.text

Conoces algun ejemplo?

Josue dijo...

Que tal tony muy bueno el tutorial, mira tengo el problema del amigo anterior me manda error de sintaxis en la instruccion INSERT INTO ya eh buscado todos los posibles errores pero no los encuentro mira aqui esta el codigo:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim strConex As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\prueba.mdb"
Dim Conex As New OleDb.OleDbConnection
Dim comm As New OleDb.OleDbCommand
Conex.ConnectionString = strConex
comm.Connection = Conex
comm.CommandText = "INSERT INTO Login (User,Pass) VALUES ('Admin','12345')"
Conex.Open()
comm.ExecuteNonQuery()
Conex.Close()
MsgBox("Registro agregado correctamente")
End Sub
End Class

no se que sucede la base de datos es de prueba a un no la eh implentado a mi prog, es para entender bien como funciona, agradesco tu atencion

Tony Valderrama dijo...

Josué:

¿De qué tipo de dato es el campo "Pass"? Es que si es de tipo numérico, te va a marcar error debido a los apóstrofes que tiene antes y después del 12345.

Los apóstrofes solo van cuando el campa recibe datos alfanuméricos, texto.

Ojalá ese sea el problema. ¡Saludos!

Josue dijo...

bueno te cuento que no es el problema ya que los dos campos son texto asi que no creo que sea ese el problema, encontre otra forma de hacerlo un poco similar pero me funciono, te la pongo aqui:

Dim str As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=GMFVDB.mdb"
Dim con As New OleDb.OleDbConnection(str)
Dim oData As OleDbDataReader

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
con.Open()
Dim cmd As New OleDb.OleDbCommand(" Select User from Login where User='" + txtuser.Text + "'", con)
oData = cmd.ExecuteReader()
If (oData.HasRows) Then
MsgBox("Error!!! El usuario ya existe")
Else
oData.Close()
Dim cs As New OleDb.OleDbCommand("INSERT INTO Login VALUES (@User, @Pass, @Cargo)", con)
cs.Parameters.Add(New OleDb.OleDbParameter("User", txtuser.Text))
cs.Parameters.Add(New OleDb.OleDbParameter("Pass", txtpass.Text))
cs.Parameters.Add(New OleDb.OleDbParameter("Cargo", cmbcargo.Text))

cs.ExecuteNonQuery()
MsgBox("Registro agregado correctamente")
End If
con.Close()
End Sub

primero valido para que el usuario no exista en la BD si no exite procede a agragar el registo, gracias por tu atención, te agradeceria que si tienes los codigos o ejmplos secillos para lo que es eliminar actualizar y buscar (mostrar en textbox's la informacion) me lo enviaras al correo josue.0716@gmail.com te lo agradeceria muchisimo ya que busco y busco pero no encuentro mucho, estoy trabajando la BD desde visual con la funcion OleDB.

Nuevamente Gracias por tu atencion

Faruck dijo...

Oye amigo! necesito urgente una respuesta, es q me aparece como error al insertarle un dato "The ConnectionString property has not been initialized." me podrias ayudar con eso!
Este es el codigo
Dim strConex As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=Ganaderia.mdb"
Dim conex As New OleDb.OleDbConnection
Dim comm As New OleDb.OleDbCommand
comm.Connection = conex
comm.CommandText = "INSERT INTO Registro_Individual(Numero,Nombre_Vaca,Raza_Vaca,Finca,Propietario,FNacimiento_Vaca,Comprada_A)VALUES ('666','Rosa','Pura','cerritos','yusepe','de abril','faruck')"
conex.Open()
comm.ExecuteNonQuery()
conex.Close()

Tony Valderrama dijo...

Estimado Faruck:

Creo que tienes que abrir la conexión (conex.Open()) antes de asignarla como conexión activa al objeto command (comm.Connection = conex).

Creo que debería funcionar :)

jose dijo...
Este comentario ha sido eliminado por el autor.
jose dijo...

Saludos tony me gustaria que me hecharas una mano quiero guardar dos datos en una base de datos en access con visual studio 2005

Public Class Form1

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

End Sub

Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click
Dim conexion As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\Jose Tallaferro\Mis documentos\ejemplo.mdb"
Dim conecta As New OleDb.OleDbConnection
Dim comunicador As New OleDb.OleDbCommand
conecta.ConnectionString = conexion
comunicador.Connection = conecta
comunicador.CommandText = "INSERT INTO LIBRO (ISBN,Titulo,Autor,Editorial,Anio,Lugar,NoPag) VALUES (" & tbUsuario.Text & ",'" & tbClave.Text & ")"
conecta.Open()
comunicador.ExecuteNonQuery()
conecta.Close()
End Sub
End Class

Tony Valderrama dijo...

Creo que falta un apóstrofe al final de tu instrucción INSERT:

Está así:
& tbClave.Text & ")"

Y debería estar así:
& tbClave.Text & "')"

Ojalá ese sea el único problema. ¡Saludos!

jose dijo...

Nada que podra ser!!!

Miguel Angel Leon Scott dijo...

Buenas tardes tengo una aplicacion disenada en vb 2008 con access 2000 como motor de BD pero tengo un problema con un formulario con un datagridview en donde filto los datos hasta alli todo bien pero no se como grabar ese filtrado en una base de datos temporal para hacer unos calculos y presentalos en un crystal report

Anónimo dijo...

hola soy nuevo en esto y no se para que es esta linea ni como la obtienen me pueden ayudar?

String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\Jose Tallaferro\Mis

como sacan el string para conexion??

Tony Valderrama dijo...

Estimado Anónimo:

Yo creo que lo que te convendría sería usar una ruta relativa. Es que si llevas tu programa a otra PC que no tenga la carpeta "C:\Documents and Settings\Jose Tallaferro\Mis".

MEjor pon la base de datos en la misma carpeta que el EXE del programa (en la carpeta Debug y/o Release). Entonces escribes "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=nombredelarchivo.mdb"

Creo que con eso debería quedar.

Gregory Rivero dijo...

Podrias mandarme un proyecto sencillo con un update,select, y Delete Por favor tony gregoucla23@gmail.com gregorypineda@hotmail.com

Gregory Rivero dijo...

Hola Amigo como hago para realizar un select y asignar esas consultas a un o varios textbox ?

Wanbyn dijo...

Muy bueno el post, mira tengo una pregunta que pasa si yo quiero guardar el contenido de un textbox el cual tienen "Don Gravin's Bar" como vez tiene el símbolo ' y a la hora de guardarlo como texto no me lo permite por que dice que falta un signo que puedo hacer en este caso si ocupo que el nombre se guarde con ese signo

Tony Valderrama dijo...

Estimado Wanbyn:

La verdad no sé como hacerle. Déjame investigar porque es muy buena pregunta.

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...