Buen día para todos,
Continuando el tema anterior de las conexiones pasamos a un tema donde varios usuarios que empiezan en el mundo de la programación les cuesta comprender y como todos hemos pasado por esto que mejor forma que devolver a la comunidad lo que se ha recibido de esta misma.
Por tal motivo quiero compartir una clase creada dentro de un modulo que nos facilitara mucho las cosas, la verdad es que la hice lo mas sencilla posible que me resultara para mis propósitos, cada quien la puede adaptar a sus necesidades espero les sea de utilidad.
Bueno manos a la obra…
Para comenzar ya tengo creado un nuevo proyecto que he llamado «Tutorial_CRUD», el cual contiene un formulario y este a su vez contiene los siguientes controles:
- 5 Botones que he nombrado así:
- Name: BtnConexion – Text: Conexión
- Name: BtnLeer – Text: Leer
- Name: BtnAgregar – Text: Agregar
- Name: BtnActualizar – Text: Actualizar
- Name: BtnEliminar – Text: Eliminar
- 3 Cajas de texto que he nombrado así:
- Name: TxtId
- Name: TxtNombres
- Name: TxtApellidos
- 3 Labels que les asigne los siguientes textos así:
- Label1.text = Id
- Label2.text= Nombres
- Label3.text= Apellidos
- 1 Datagridview que he nombrado así:
- Name: DGTabla
Una vez terminado nuestro formulario debe tener una apariencia como la siguiente:
Paso seguido terminada la parte de agregar los controles necesarios para nuestro ejemplo, lo siguiente que necesitamos es agregar un nuevo modulo a nuestro proyecto que llamaremos «CRUD», esto lo hacemos dando clic derecho en el explorador de soluciones a nuestro proyecto y nos ubicamos sobre el menú agregar para seleccionar la opción «Modulo» tal como se muestra en la siguiente imagen.
Ahora que hemos creado nuestro modulo «CRUD» procedemos abrirlo dando doble clic y borramos todo lo que ahi en el momento que solo es «Module CRUD End Module», para proceder a crear los procedimientos necesarios para realizar las operaciones propuestas en este ejemplo, lo pimero que debemos hacer es identificar nuestra base de datos que para nuestro ejemplo es Access 2003 y que he creado en una carpeta en la ruta «C:\Tutorial_CRUD» y la base la he nombrado «Datos.mdb» sin contraseña, nuestra ruta completa es la siguiente «C:\Tutorial_CRUD\Datos.mdb», ahora lo que sigue es ubicar nuestra cadena de conexión en la siguiente pagina:
https://www.connectionstrings.com/
Paso seguido debemos importar la libreria que nos permita manipular este tipo procedimientos la cual es «System.Data.Oledb», lo hacemos al inicio del modulo de la siguiente forma:
':::Importamos la libreria Oledb Imports System.Data.OleDb
Ahora que ya hemos importado correctamente nuestra librería procedemos a declarar la clase que almacenara nuestros procedimientos, el nombre que le demos a nuestra clase sera el mismo que usaremos para declararla mas adelante y la declaramos así:
':::Declaramos nuestra clase de nombre CRUD Public Class CRUD End Class
Terminado de declarar nuestra clase procedemos a crear la conexión a nuestra base de datos para tener acceso a la misma y realizar todos los procedimientos que sean necesario, la conexión la creamos mediante el objeto «OleDbConnection» de la librería «OleDb» al cual le asignamos nuestra cadena de conexión y lo hacemos de la siguiente forma:
':::Creamos nuestra conexión a la base de Datos Dim con As New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=C:\Tutorial_CRUD\Datos.mdb")
El primer procedimiento que vamos a crear sera el que nos realice la prueba de la conexión a la base de datos y nos muestre si tenemos una conexión exitosa, para realizar este proceso utilizaremos la instrucción «Try» y declaramos nuestro nuevo procedimiento que llamaremos «conexión» de la siguiente forma:
Sub conexion() ':::Instruccion Try para capturar errores Try ':::Abrimos nuestro conexion con la propiedad Open con.Open() MsgBox("Conexión realizada de manera exitosa", MsgBoxStyle.Information, "Tutorial CRUD") ':::Y cerramos la conexion con.Close() Catch ex As Exception MsgBox("No se logro realizar la conexión debido: " & ex.Message, MsgBoxStyle.Critical, "Tutorial CRUD") End Try End Sub
Ahora que ya tenemos nuestra conexión creada y hemos probado que se establece correctamente el siguiente procedimiento que crearemos sera para realizar consultas a nuestra base de datos, este procedimiento lo llamaremos «consulta» y tendrá los siguientes objetos:
- OleDbDataAdapter: Nos permite crear una conexión entre la solicitud que realiza el usuario a la base y la respuesta que se obtiene de la base de datos, este objeto tiene la ventaja que no se necesita abrir primero la conexión a la base de datos debido a que es te objeto abre y cierra automáticamente la conexión una vez termina el proceso. Así mismo para que cumpla su función correctamente este objeto necesita que le pasemos dos parámetros muy importantes que son, el primero la instrucción que debe realizar y el segundo la conexión a la que debe realizar esa instrucción.
- DataTable: Este objeto sera la tabla donde se almacenaran los datos que reciba el «DataAdapter» por parte de la base de datos.
Hasta ahora hemos visto los dos objetos que necesitamos para realizar nuestro procedimiento pero también debemos mostrar el resultado en alguna forma y lo haremos mediante un «DataGridView» que ya hemos defino anteriormente.
Para que nuestro proceso funcione correctamente debemos darle dos parámetros también los cuales serian, el primero seria el «DataGridView» donde mostraremos los resultados y el segundo la instrucción que necesita el «DataAdapter», para esto al momento de crear nuestro procedimiento le indicaremos que debe solicitar mediante la propiedad «ByVal» estos dos parámetros, tal cual como se muestra a continuación:
':::Creamos el procedimiento para la consulta y le indicamos que debe pedir 2 parametros para ':::ejecutarse correctamente (Tabla, Sql) Sub consulta(ByVal Tabla As DataGridView, ByVal Sql As String) ':::Instruccion Try para capturar errores Try ':::Creamos el objeto DataAdapter y le pasamos los dos parametros (Instruccion, conexión) Dim DA As New OleDbDataAdapter(Sql, con) ':::Creamos el objeto DataTable que recibe la informacion del DataAdapter Dim DT As New DataTable ':::Pasamos la informacion del DataAdapter al DataTable mediante la propiedad Fill DA.Fill(DT) ':::Ahora mostramos los datos en el DataGridView Tabla.DataSource = DT Catch ex As Exception MsgBox("No se logro realizar la consulta por: " & ex.Message, MsgBoxStyle.Critical,"Tutorial CRUD") End Try End Sub
Ahora ya podemos realizar consultas a nuestra base de datos, también podemos obtener una respuesta y ademas mostrar este resultado de manera ordenada.
Continuamos, seguido crearemos un procedimiento que nos permita «Agregar, Actualizar y Eliminar» sin tener que crear procedimientos por separado para cada operación, para esto lo primero es crear el proceso con el nombre de «operaciones» el cual va a contener el siguiente objeto:
- OleDbCommand: El cual almacenara la instrucción para la operación que se va a realizar, este objeto necesita también de dos (2) parámetros, el primero la instrucción que debe realizar y el segundo la conexión a la que debe realizar esa instrucción. A diferencia del objeto anterior (DataAdapter) el «Command» necesita que abramos y cerremos la conexión debido a que el no lo hace automáticamente.
- ExecuteNonQuery: Es una propiedad del objeto «Command» y su función es ejecutar la instrucción que se ha recibido.
Una vez teniendo claro estos conceptos nuestro procedimiento debe quedar así:
':::Creamos el procedimiento para Agregar, Actualizar y Eliminar ademas le indicamos que debe pedir ':::2 parametros para ejecutarse correctamente (Tabla, Sql) Sub operaciones(ByVal Tabla As DataGridView, ByVal Sql As String) ':::Abrimos la conexion con.Open() ':::Instruccion Try para capturar errores Try ':::Creamos nuestro objeto de tipo Command que almacenara nuestras instrucciones ':::Necesita 2 parametros (Instruccion, conexion) Dim cmd As New OleDbCommand(Sql, con) ':::Ejecutamos la instruccion mediante la propiedad ExecuteNonQuery del command cmd.ExecuteNonQuery() Catch ex As Exception MsgBox("No se logro realizar la operación por: " & ex.Message, MsgBoxStyle.Critical, "Tutorial CRUD") End Try ':::Cerramos la conexion con.Close() End Sub
Y con esto hemos terminado la creación de nuestra clase para las operaciones CRUD, pero todavía no estamos haciendo ninguna operación recordemos que los procedimientos están a la espera de que se les de una instrucción para saber que deben hacer, para esto cerramos nuestro modulo ya que no lo vamos a utilizar y nos ubicamos en el formulario, comenzaremos con el primer botón que hemos creado y le dimos el texto «Conexión» damos doble clic en el botón para configurar.
Seguido lo primero que debemos hacer es crear un objeto que nos comunique con nuestra clase que para recordar hemos llamado «CRUD», este objeto debe ser declarado de manera global para no tener que estar repitiendo este proceso, esto lo haremos justo debajo de donde se inicia la clase del formulario.
Una vez creado nuestro objeto solo necesitamos llamar al procedimiento que nombramos «conexion» de la siguiente forma:
Public Class Form1 ':::Creamos un objeto para establecer conexion con nuestra clase CRUD Dim Obj As New CRUD Private Sub BtnConexion_Click(sender As Object, e As EventArgs) Handles BtnConexion.Click ':::Mediante el objeto que creamos accedemos al procedimiento "conexion" Obj.conexion() End Sub End Class
Ejecutamos nuestro proyecto y damos clic en le botón «Conexión» y como vemos nos indica que la conexión fue exitosa.
Como ya probamos nuestra conexión a la base de datos seguimos con el siguiente botón que le hemos dado como texto «Leer» y damos doble clic para configurar. Ahora en la configuración del botón lo primero que debemos hacer es crear una variable de tipo «string» que para mayor facilidad la llamaremos «Sql» y que sera la encargada de guardar la instrucción que le asignaremos, dicha instrucción es una consulta SQL a nuestra base de datos que tiene una sola tabla y tres (3) campos.
La instrucción SQL que utilizaremos sera «Select * from Clientes» para que nos traiga de la base datos todos los registros que tiene la tabla «Clientes» que para nuestro ejemplo solo sera un (1) registro, recordemos que debemos usar el objeto que hemos creado de manera global para acceder al procedimiento «consulta» de nuestra clase «CRUD» y que dicho procedimiento nos va a pedir dos (2) parámetros, el primero sera el nombre del «DataGridView» donde nos mostrara el resultado y el segundo que es la instrucción que hemos almacenado en la variable que acabamos de crear, el código para el botón «Leer» nos debe quedar así.
Private Sub BtnLeer_Click(sender As Object, e As EventArgs) Handles BtnLeer.Click ':::Creamos la variable Sql que guardar la instruccion de tipo SQL Dim Sql As String = "Select * from Clientes" ':::Mediante el objeto que creamos globalmente y nombramos "Obj" ':::Accedemos a nuestro procedimiento "consulta" y le pasamos los ':::dos (2) parametros (DGTabla, Sql) Obj.consulta(DGTabla, Sql) End Sub
Como vemos la clase funciona correctamente, esta solicitando los parámetros, los esta recibiendo y esta retornando un resultado de forma ordenada.
Seguimos con el siguiente botón que hemos le hemos dado el texto «Agregar», repetimos los mismos pasos que en el botón «Leer», en lo único que modificaremos sera en la consulta SQL y el nombre del procedimiento que en este caso es «operaciones» y nos debe quedar así.
Private Sub BtnAgregar_Click(sender As Object, e As EventArgs) Handles BtnAgregar.Click ':::Creamos la variable Sql que guardar la instruccion de tipo SQL Dim Sql As String = "Insert Into Clientes (Id, Nombres, Apellidos) Select "& TxtId.Text &", '"& TxtNombres.Text &"', '"& TxtApellidos.Text &"'" ':::Cambiamos el nombre del procedimiento "operaciones" Obj.operaciones(DGTabla, Sql) End Sub
Ahora realizamos una prueba con los siguientes datos:
- Id= 2
- Nombres= Maria
- Apellidos= Morales
Damos clic en el botón «Agregar» y luego en el botón «Leer», Como vemos la clase funciona correctamente, esta solicitando los parámetros, los esta recibiendo y esta ejecutando la instrucción que le hemos dado.
Continuamos con el siguiente botón que hemos dado de texto «Actualizar», repetimos los mismos pasos que en el botón «Agregar», en lo único que modificaremos sera en la consulta SQL y el nombre del procedimiento sera el mismo «operaciones» y nos debe quedar así.
Private Sub BtnActualizar_Click(sender As Object, e As EventArgs) Handles BtnActualizar.Click ':::Creamos la variable Sql que guardar la instruccion de tipo SQL Dim Sql As String = "Update Clientes Set Nombres='"& TxtNombres.Text &"', Apellidos='"& TxtApellidos.Text &"' where Id="& TxtId.Text &"" Obj.operaciones(DGTabla, Sql) End Sub
Ahora realizamos una prueba con los siguientes datos:
- Id= 2
- Nombres= Ana
- Apellidos= Rosado
Damos clic en el botón «Actualizar» y luego en el botón «Leer», Como vemos la clase funciona correctamente, esta solicitando los parámetros, los esta recibiendo y esta ejecutando la instrucción que le hemos dado.
Por ultimo terminamos con el botón que hemos dado de texto «Eliminar», repetimos los mismos pasos que en el botón «Agregar», en lo único que modificaremos sera en la consulta SQL y el nombre del procedimiento sera el mismo «operaciones» y nos debe quedar así.
Private Sub BtnEliminar_Click(sender As Object, e As EventArgs) Handles BtnEliminar.Click ':::Creamos la variable Sql que guardar la instruccion de tipo SQL Dim Sql As String = "Delete * From Clientes Where Id="& TxtId.Text &"" Obj.operaciones(DGTabla, Sql) End Sub
Ahora realizamos una prueba con los siguientes datos:
- Id= 2
Damos clic en el botón «Eliminar» y luego en el botón «Leer», Como vemos la clase funciona correctamente, esta solicitando los parámetros, los esta recibiendo y esta ejecutando la instrucción que le hemos dado.
Con esto hemos terminado este tutorial que se ha extendido un poco, pero la idea es explicar en detalle el funcionamiento de esta clase, que como apreciamos solo necesitamos de dos (2) lineas de código para realizar las operaciones «CRUD», la ventaja de trabajar con esta clase viene en los proyectos donde trabajaremos con una base de datos con varias tablas y necesitaremos realizar estas mismas operaciones una y otra vez, para lo cual solo seguiremos necesitando las mismas dos (2) lineas de código ahorrándonos tiempo y trabajo. También es importante destacar que la clase funciona correctamente independientemente de la base de datos que usemos, solo basta con modificar la cadena de conexión.
En este ejemplo utilizamos una base de datos en Access, pero para SQLite y MySQL solo basta con cambiar las librerías y los objetos tal como lo muestro ahora:
':::Para SQLite importamos la libreria correspondiente Imports System.Data.SQLite ':::Para MySQL importamos la libreria correspondiente Imports MySql.Data.MySqlClient '________________________________________________________________ ':::Para el objeto de conexion usamos el objeto segun corresponda ':::SQLite conexion Dim con as new SQLiteConnection ':::MySQL conexion Dim con as new MySqlConnection '_______________________________________________________________ ':::Lo mismo con los otros objetos ':::SQLite Dim Da as new SQLiteDataAdapter Dim cmd as new SQLiteCommand ':::MySQL Dim Da as new MySqlDataAdapter Dim cmd as new MySqlCommand
El proyecto y la base de datos usada para este ejemplo los dejo en «Mega» para que lo descarguen y estudien, lo puede encontrar en el siguiente link.
Les dejo también el link al post donde les explico las conexiones a diferentes bases de datos.
Conexión entre Visual Basic .Net y Access, MySQL y SQLite
Cualquier duda estaré presto a colaborarles en todo lo que me este posible.
Buen día para todos.
He seguido los pasos al pormenor y en el form1 me tira el error «el módulo CRUD no se puede utilizar como tipo», por lo tanto no puedo hechar a correr la aplicación, tendrás idea de lo que puede fallar? Saludos Edward
Me gustaMe gusta
Cordial saludo Fco. Javier,
Te comento que tu problema radica en que debes cambiar al inicio del modulo la parte donde dice:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
—->Module CRUD
Por —->Public Class CRUD
Y al final del modulo la parte donde dice:
—->End Module
Por —-> End Class
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Espero haber sido de ayuda.
Cualquier cosa estaré presto a colaborarte en todo lo que me sea posible.
Buen día.
Me gustaMe gusta
eres grande mi hermano! yo quiero ser como tú. GRACIAS° problema solucionado.
Me gustaMe gusta
Cordial saludo Fco. Javier,
Un gusto haber podido colaborarte.
Me gustaMe gusta
Ahora: «no se puede realizar la operación por: Error de sintaxis en la instrucción INSERT INTO».
esto como verás es en las instrucciones del botón agregar, por lo que he probado con diversos nombres y nada que lo he podido solucionar. Alguna sugerencia? GRACIAS! y disculpa…
Me gustaMe gusta
Cordial saludo Fco. Javier Medrano,
Debes tener en cuenta el nombre de la tabla y los campos que tiene la tabla.
Por favor comparte la consulta para analizarla.
Estaré presto a colaborarte en todo lo que me sea posible.
Buen día.
Me gustaMe gusta
Buen día Edward, esta es la consulta:
‘:::Creamos la variable Sql que guardar la instruccion de tipo SQL
Dim Sql As String = «Insert Into alumnos (nombre, grado, padre) Select » & txtNombre.Text & «, ‘» & TxtGrado.Text & «‘, ‘» & TxtPadre.Text & «‘»
‘:::Cambiamos el nombre del procedimiento «operaciones»
Obj.operaciones(DGtabla, Sql)
haber qué me esta fallando
El procedimiento Operaciones en el módulo está igual que el del ejemplo.
Saludos!
Me gustaMe gusta
Cordial saludo Fco. Javier Medrano,
Debes tener en cuenta los tipos de datos (Número, Texto, Fecha….), debido a que ellos influyen directamente al guardar datos en nuestra base de datos, para lo cual se usa:
Comillas simples (‘) cuando es texto
Sin comillas simples cuando es número
Ahora bien asumiendo que tus campos son todos texto, le faltaría las comillas simples al valor de txtNombre el cual debe quedar (‘»& txtNombre &»‘) y la consulta completa así:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Dim Sql As String = “Insert Into alumnos (nombre, grado, padre) Select '”& txtNombre.Text &“', '”& TxtGrado.Text &“', '”& TxtPadre.Text &“' ”
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
También puedes escribir tu consulta así:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Dim Sql As String = “Insert Into alumnos (nombre, grado, padre) Values ('”&; txtNombre.Text &“', '”& xtGrado.Text &“', '”& TxtPadre.Text &“') ”
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Espero haber sido de ayuda.
Cualquier cosa estaré presto a colaborarte en todo lo que me sea posible.
Buen día.
Me gustaMe gusta
gracias nuevamente, compréndeme que soy novato. Aprecio mucho tu ayuda amigo, espero no darte más lata. GRACIAS!
Me gustaMe gusta
Cordial saludo Fco. Javier,
No te preocupes, en lo que pueda colaborarte con todo gusto.
Que tengas buen día.
Me gustaMe gusta
Hola Edward, Ojalá me ayudes en esto: Con el ciclo For each (el problema puse en la Web del Programador), recorro una tabla sin problema, la detengo con el INPUTBOX para meter una calificación. He buscado cómo se asigna, introduce o guarda la nota correspondiente a cada alumno pero no encuentro la manera. te pregunto: ¿el método UPDATE afecta al registro actual? si es asi no tengo que poner la cláusula WHERE; y sigue recorriendo la tabla el FOR EACH?
o cómo le haría para al primer alumno guardar su nota, sigue recorriendo al siguiente, guardar su nota, siguiente alumno y guardar su nota y asi… GRACIAS!
Me gustaMe gusta
Cordial Saludo Fco. Javier Medrano Salez,
Te comento que el comando UPDATE tiene como función actualizar, pero mediante la clausula WHERE le indicas que registro deseas actualizar, si no empleas el WHERE te va actualizar toda la fila, es decir todos los registros con el mismo valor que le indiques.
Te agradezco compartas el procedimiento que estas usando para colaborar de una mejor manera.
Espero haber sido de ayuda.
Cualquier cosa estaré presto a colaborarte en todo lo que me sea posible.
Buen día.
Me gustaMe gusta
Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged
If ComboBox1.Text = «Grupo» Then
ComboBox2.Text = «Bim»
MsgBox(«Selecciona el grupo para proceder a Capturar Evaluaciones…»)
ComboBox1.Focus()
Exit Sub
End If
DataGridView1.Visible = True
Panel3.Visible = True
Dim asig() As String = {«esp», «ing», «mat», «cie», «tec», «geo», «aes», «efis», «art»}
Dim nombrefoto As String
Dim evalBim, promAsig, promBim, promGral, num As Integer
»’ aqui empiezo a conectar la base de datos
Dim cadenasql As String = («SELECT * FROM primero WHERE grado = ‘» + ComboBox1.Text + «‘ ORDER BY nombre ASC»)
Dim adaptador As New OleDbDataAdapter(cadenasql, conexion)
Dim Ds As New DataSet
adaptador.Fill(Ds)
conexion.Close()
If (Ds.Tables(0).Rows.Count = 0) Then
MsgBox(«No existen alumnos en este grado»)
Else
Label6.Text = Ds.Tables(0).Rows(0)(«grado»).ToString()
Label7.Text = ComboBox5.Text
Label8.Text = ComboBox2.Text
GroupBox1.Visible = False
»’establecer el ciclo para recorrer a todo el grupo
For Each row As DataRow In Ds.Tables(0).Rows
nombrefoto = row.Item(«nombre»).ToString() & «.jpg»
Label9.Text = row.Item(«nombre»).ToString()
If My.Computer.FileSystem.FileExists(«\\subdirector\est22\fotos\» & nombrefoto) Then
PictureBox1.Image = Image.FromFile(«\\subdirector\est22\fotos\» & nombrefoto)
Else
PictureBox1.Image = Image.FromFile(«\\subdirector\est22\fotos\EST22.jpg»)
End If
num = 0
evalbim = InputBox(«el alumno es: » & nombrefoto)
DataGridView1.Rows.Add(num, row.Item(«nombre»).ToString(), evalBim)
»’ esta instrucción es la que tengo duda cómo se llama para asignarle al alumno su nota. asig(0) va cambiando según la asignatura.
cadenasql = «UPDATE primero SET asig(0)='» & evalBim & «‘»
»’aqui realizar cálculos matemáticos (promedia todas las asignaturas y los bimestres, saca promedio general)
»’ guardar los cambios
Next
Ds.Dispose()
End If
End Sub
Edward buenos dias! este es mi codigo haber si me iluminas en la duda de actualizar el registro actual al ir recorriendo una tabla con el ciclo FOR EACH. GRACIAS!
Me gustaMe gusta
Cordial Saludo Fco. Javier Medrano Salez,
Te comento que analizando tu código observo varias cosas:
Primero: Asignas las materias o cursos a un array mediante el siguiente código:
Dim asig() As String = {“esp”, “ing”, “mat”, “cie”, “tec”, “geo”, “aes”, “efis”, “art”}
No me queda claro el porque lo haces de esta forma, lo mas correcto es crear una tabla en la base de datos para las asignaturas.
Segundo: Asignas la variable «nombrefoto» para capturar el nombre del estudiante e inmediatamente le agregas la extensión «.jpg» en esta linea.
nombrefoto = row.Item(“nombre”).ToString() & “.jpg”
Y luego la asignas al InputBox tal como viene modificada con la extención «.jpg» y lo agregas al campo «nombre» el cual asumo es el nombre del estudiante y no el de la foto.
evalbim = InputBox(“el alumno es: ” & nombrefoto)
DataGridView1.Rows.Add(num, row.Item(“nombre”).ToString(), evalBim)
Para terminar me confunde aun mas la consulta SQL que realizas por varias razones, la primera estas comparando la misma variable «evalbim» la cual si no le modificaste nada en el InputBox pues sigue con el nombre del estudiante mas la extensión «.jpg».
También noto que te hace falta la clausula WHERE en donde le dices a la consulta cual es el registro que quieres afectar o actualizar.
Por otro lado tambien estas indicando a la consulta UPDATE que actualice el campo «asig(0)» que asumo lo que quieres es indicar es el nombre de la asignatura pero no es lo que hace y que actualice la nota de esa asignatura.
Para lo que pretendes hacer tendrías que usar otro ciclo For para recorrer la asignatura debido a que le estas indicando que sera siempre la misma «esp».
Lo que quieres hacer y de la forma en la que te has propuesto hacerlo te seguirá llevando de tropiezo en tropiezo debido a que te estas complicando tu mismo las cosas, como te dije antes la esencia del ciclo For es realizar una acción una cantidad de veces de forma automática y al querer interrumpir su proceso en cada registro (300 alumnos) serias 300 interrupciones, perdería totalmente su propósito. Para esto solo usa la forma que te sugerí desde un comienzo, así tendrás mayor control sobre el registro que deseas afectar.
Este seria una idea básica para ilustrarte mejor lo que te sugiero.
Espero haber sido de ayuda.
Cualquier cosa estaré presto a colaborarte en todo lo que me sea posible.
Buen día.
Me gustaMe gusta
Hola Edwar, Cordial saludo y agradecimiento por tu tiempo y paciencia.
Efectivamente, tengo varios errores porque a fuerza de probar estoy aprendiento el NET. Muy diferente al VB6 en el que tengo mi programa para la escuela ya “perfectamente” acabado, pero con Windows 10 no funcionó, así que descargué el Visual Basic 2010 y me puse desde 0 a confeccionarlo nuevamente. En mi programa quiero controlar todo acerca de mi escuela, ya tengo varias partes y estoy en la de evaluar a mis alumnos.
Utilizo el Array porque tengo que recorrer las nueva materias que cursa cada alumno: “esp” sería para Español y así. Luego con un ciclo a esta variable le agrego un número (1,2,3,4 ó 5) de tal manera que si evalúo el Primer Bimestre la variable quedaría “esp1”, y en mi tabla exclusiva de calificaciones tengo los campos esp1, esp2, esp3, esp4, esp5 y espProm, lo mismo para todas las materias. También tengo los campos bim1, bim2, bim3, bim4, bim5 y PromGral; bim1 promedia esp1, ing1, mat1, cie1, tec1, geo1, aes1, efis1 y art1.
En el InputBox no encontré la manera rápida de poner el nombre del alumno evaluado, ahora me fijo que poniendo label9.text quedaría mejor en lugar de nombrefoto.
La consulta SQL me la invente porque ahí es donde tengo la mayor duda, no se cómo editar el registro en el que va el ciclo for each, sé que está completamente mal porque no he podido encontrar la manera de actualizar el registro 7 o el 15 mientras se va recorriendo la tabla.
Bueno en fin, con las capturas que me has mandado me he hecho una idea de cómo es más fácil capturar calificaciones en una escuela, voy a intentarlo así.
Si gustas me puedes pasar un correo y te mando mi proyecto para que veas “las maravillas que he logrado” sin saber nada del NET. (de hecho ni del VB6 pero hay muchos amigos que ayudan al igual que tú. GRACIAS! Y buen día. pacomedrano@msn.com
Me gustaMe gusta
Cordial Saludo Fco. Javier Medrano Salez,
No te preocupes que todos pasamos por lo mismo cuando iniciamos, lo importante es perseverar para lograr el objetivo.
Ya te envíe un mensaje al correo.
Espero haber sido de ayuda.
Cualquier cosa estaré presto a colaborarte en todo lo que me sea posible.
Buen día.
Me gustaMe gusta
Un cordial saludo, he ido aprendiendo y realizando este tutorial paso a paso y he ido corrigiendo y modificando los errores que se me han presentado con mucho exito, no dejo de agradecer tu ayuda amigo, ya en la fase final el boton ELIMINAR me presenta este error: “No se logro realizar la operacion por: SQL logic error or missing database
near “*”:syntax error”
Ya la cabeza no me da mas, las demas operaciones si las hace a la perfeccion el codigo esta escrito de esta manera:
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Dim Sql As String = “DELETE * FROM datos_personales WHERE ID=” & TextBox1.Text & “”
Obj.operaciones(DGTabla, Sql)
End Sub
Me gustaria saber que ocurre, de antemano muchas gracias.
Me gustaMe gusta
Cordial Saludo deejaykhali,
Me alegra que estés avanzando en el conocimiento y dominio de SQLite.
Ahora bien el problema que se te presenta es debido a que estas usando el símbolo (*) asterisco antes del FROM, en SQLite no es necesario usar este símbolo como seria en Access.
Tu consulta debe quedar así:
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Dim Sql As String = “DELETE FROM datos_personales WHERE ID=” & TextBox1.Text & “”
Obj.operaciones(DGTabla, Sql)
End Sub
Puedes revisar este ejemplo donde se aprecia el uso de esta consulta.
Agregar, consultar, actualizar y eliminar con fecha y hora mediante DateTimePicker en base de datos SQLite en Vb.Net
Ya te envíe un mensaje al correo por si necesitas mas colaboración.
Espero haber sido de ayuda.
Cualquier cosa estaré presto a colaborar en todo lo que me sea posible.
Buen día.
Me gustaMe gusta
Excelente, eso era lo que me hacia falta, agradecido nuevamente, de verdad ya estoy empezando a ver la luz al final del tunel (literal), hasta habia pensado en cambiar de lenguaje de programacion pero estoy viendo que no es necesario.
Una ultima pregunta antes de empezar a desarrollar mi nueva pequeña aplicacion, aunque el programa se ejecuta bien y sin problemas me gustaria saber porque me sale esta advertencia en la lista de errores:
Advertencia 1 La arquitectura del procesador del proyecto que se va a compilar “MSIL” y la arquitectura del procesador de la referencia “System.Data.SQLite, Version=1.0.104.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64”, “x86”, no coinciden. Esta falta de coincidencia puede causar errores en tiempo de ejecución. Cambie la arquitectura del procesador de destino del proyecto mediante el Administrador de configuración para alinear las arquitecturas de procesador entre el proyecto y las referencias, o tome una dependencia de las referencias con una arquitectura de procesador que coincida con la arquitectura del procesador de destino del proyecto. Conexion a Sqlite
Me gustaMe gusta
Cordial Saludo deejaykhali,
Te comento que ese inconveniente se puede dar por varios factores como pueden ser.
Primero, verifica que la versión del Framework que estas usando sea la misma de la librería que descargaste.
Segundo, verifica la arquitectura del proyecto, si esta en Any prueba cambiando a x86.
Tercero, verifica que la librería que descargaste sea acorde a tu sistema operativo y a la arquitectura de compilación.
Espero haber sido de ayuda.
Cualquier cosa estaré presto a colaborar en todo lo que me sea posible.
Buen día.
Me gustaMe gusta
Gracias amigo, siempre tan colaborador, buenas fiestas y felices vacaciones para ti y tu family 😀
Me gustaMe gusta
Cordial saludo estimado Fco Javier Medrano,
Gracias por tus buenos deseos, que pases igualmente unas felices fiestas y vacaciones.
Un abrazo.
Me gustaMe gusta
Gracias amigo, siempre tan colaborador, buenas fiestas y felices vacaciones para ti y tu family 😀
Me gustaMe gusta
Hola Edward Gómez. Tus aportaciones son invaluables. “Todo conocimiento debe ser compartido”. Totalmente de acuerdo, muchas gracias por tu tiempo y por compartir estos conocimientos. Estos tutoriales introductorios a conexión de BD SQLite son increíblemente sencillos, claros, muy bien documentados, precisos y concisos. Esta tu aportación, estoy seguro que ahorrará muchas horas de investigación a aquellas personas que requieran información sobre éste tema y que tengan la fortuna de llegar a tu blog.
Deja te comento lo siguiente: Empecé a trabajar en 1970 en lo que entonces se conocía como los departamentos de IBM en las empresas, no había de otra (casi). Algunos de tus lectores conocerán esto como historia de la computación, pero algunos otros lo vivimos a todo color. Registro unitario, tabuladoras, impresoras, clasificadoras… después las grandes máquinas (de tamaño) IBM 1401, 1410, 360, 370, S3, AS400… La primera computadora con la que trabajé (IBM 1401) tenía ¡12k de memoria! y medía como un metro cuadrado! se programaba en lenguaje Autocoder, antes de Assembler, y se hacían programas que en aquella época parecían maravillosos. Después Assembler, Cobol, RPG, DBase, Foxpro, Paradox, Pascal, Delphi..!, VB… y ahora varios cientos de lenguajes, miles y miles de librerías, miles de componentes, millones y millones de lineas de código, cientos de nuevas tecnologías… Al infinito y más allá…!
Hace diez años desarrollé mi última aplicación comercial (Todavía había muy buena paga…) en Delphi y con Base de datos Paradox. Otra vez por azares del destino cambié de giro y como hobby continúe estudiando (Soy autodidácta) todo lo que caía en mis manos y cuando el tiempo me lo permitía, ya que adoro las computadoras y la programación.
Casí nunca programé en VB y acabo de descargar VB 2017, con la intención de hacer algunos sistemas que sean de utilidad para mi negocio, quiero utilizar SQLite ya que son sistemas locales o de Intranet y no requiero de mayores recursos y SQLite es muy buen gestor de BD. Es por eso que buscando, tuve la fortuna de caer en tu blog, ¡Que buena suerte!.
Los que venimos desde la invención de la rueda, sabemos que aportaciones como la tuya son de gran ayuda, tal vez las nueva generaciones no pueden darse cuenta realmente de lo que esto significa, debido a que tuvieron la fortuna de nacer cuando el conocimiento está a un click del teclado y no tienen contra que comparar. Es por eso que me tomé el atrevimiento de escribir este rollo, pero sobre todo para agradecerte infinitamente por tu esfuerzo y conciencia de que podemos hacer un mundo mejor si nos despojamos de nuestro egoísmo y somos capaces de atrevernos a dar sin esperar nada a cambio… (bueno más conocimiento).
Recibe un gran saludo desde la Ciudad de México.
Me gustaLe gusta a 1 persona
Cordial saludo Angel,
Muchas gracias por el tiempo que has tomado para comentar mi articulo, es muy cierto lo que comentas cuando dices que muchos no tuvimos la facilidad de acceso a la información tal como la conocemos hoy día, anteriormente era muy difícil encontrar información sobre programación y mas aun ejemplos detallados para uno guiarse; por este motivo comencé hace poco con el blog, mas que todo a manera de contribución a la gran comunidad de programadores que existen, otro factor que me incentivo es que la mayor parte de la información esta en ingles y si bien es cierto que todo desarrollador debe manejar aunque se un nivel básico de este idioma, todavía hay muchos colegas que no lo dominan y se frustran al no poder comprender la información encontrada.
Trato de ir publicando artículos y responder cada uno de los comentarios de forma continua, pero a veces por cuestiones de tiempo se me dificulta.
Y concuerdo contigo no hay nada mas gratificante que compartir lo poco que se ha logrado aprender en el camino.
Un saludo desde Colombia.
Me gustaMe gusta
Y si fuese con c# 😦
Me gustaMe gusta
Cordial saludo,
Rjzue, Lo cierto es que C# muy poco lo utilizo pero en cuanto pueda te replicó el ejercicio para que lo revises.
Que tengas un buen día.
Me gustaMe gusta
Buenas tardes Edward Gomez fijate que he seguido tu turial y ya me conecto a mi base de dato pero no logro mostrar los datos al datagridview me envia el error.
No se logro relizar la consulta por: error de sintaxis en la clausula from.
la consulta es la misma que pusistes
select * from mitabla
estoy trabajando en visual studio 2010
el error me lo manda en esta parte del codigo
Sub consulta(ByVal Tabla As DataGridView, ByVal Sql As String)
‘:::Instruccion Try para capturar errores
Try
‘:::Creamos el objeto DataAdapter y le pasamos los dos parametros (Instruccion, conexión)
Dim DA As New OleDbDataAdapter(Sql, con)
‘:::Creamos el objeto DataTable que recibe la informacion del DataAdapter
Dim DT As New DataTable
‘:::Pasamos la informacion del DataAdapter al DataTable mediante la propiedad Fill
DA.Fill(DT)
‘:::Ahora mostramos los datos en el DataGridView
Tabla.DataSource = DT
Catch ex As Exception
MsgBox(“No se logro realizar la consulta por: ” & ex.Message, MsgBoxStyle.Critical, “Tutorial CRUD”)
End Try
End Sub
saludos.
Me gustaMe gusta
Cordial saludo Delvin,
Te pido disculpas por la demora en responder pero he estado ocupado.
Te agradezco compartas la consulta como la estas realizando al momento de llamar el procedimiento para verificar que puede estar fallando.
Un abrazo quedo atento a tu respuesta.
Me gustaMe gusta
no se puede descargar el proyecto
Me gustaMe gusta
Cordial saludo Nelson,
Ya revise el enlace y funciona correctamente.
Espero haber sido de ayuda.
Me gustaMe gusta
Gracias por tomarte el tiempo de enseñar. Utilice como ejercicio de aprendizaje tu clase y se entiende perfectamente. Una pregunta usas un control datagridview para visualizar los registros, podrías orientarme como usaríamos tu clase para llenar todos los datos del formulario p.e de edición, es decir que al dar doble click en el registro activo del datagrid ó un botón abriese el formulario para edición? Gracias por tomarte tu tiempo.
Me gustaMe gusta
Duvida em MySql
Boa tarde!
Gostei muito do seu post. ficou ainda a duvida.
estou utilizando o MySql, tem como o Sr montar um tópico com (inserir, excluir, adicionar, atualizar) utilizando o Mysql.
mostrando na Grid.
sou programador em Delphi a 12 anos, sou analista de sistemas, e estou participando de um projeto onde o cliente exigiu o VB, estou sofrendo um cubado.
Obrigado
Me gustaMe gusta
Cordial saludo marcosaureliodesouza,
Mil disculpas por la demora en responder, pero por cuestiones de trabajo he estado algo ocupado.
Gracias por tu amable comentario, que clase de inconveniente se te presenta.
Quedo atento a tus comentarios.
Un abrazo.
Me gustaMe gusta
Buenas tardes Edward, segui tus instrucciones paso a paso y me funciona todo bien, sin embargo cuando reviso la tabla de access no está actualizada, nada se ha guardado, si pudieras ayudarme a pasar la información del datagridview a access.
Espero tu respuesta
Me gustaMe gusta
Cordial saludo Melissa,
Mil disculpas por la demora en responder, pero por cuestiones de trabajo he estado algo ocupado.
Te agradezco me compartas el código que empleas para exportar los registros hacia Access para revisar si existe un error.
Otra posible causa que se me viene a la mente y que es muy recurrente es el tipo de datos del campo que tenemos en la base de datos y el tipo de datos que estamos enviando desde el formulario.
Quedo atento a tus comentarios.
Un abrazo.
Me gustaMe gusta
En primer lugar felicitarte por el trabajo realizado, no hay muchas webs que expliquen las conexiones de un modo tan sencillo. Desde siempre hago mis conexiones a datos manualmente obviando los asistentes y tengo que decir que es una práctica muy recomendable.
En segundo lugar, creo que deberías decir en alguna parte del artículo, que esta forma de programar, es exclusivamente con fines didácticos y que en ningún momento debe llevarse a producción tal cual está aquí, dado que presenta múltiples vulnerabilidades. Una de ellas es la inyección Sql. NUNCA se debe recoger texto de un formulario cumplimentado por el usuario y pasarlo directamente a nuestra base de datos. Hay bastante información por ahí de cómo evitarlo.
Saludos.
Me gustaMe gusta
Cordial saludo,
Agradezco mucho tu valiosa apreciación, en cuanto a mi material todo es de auto-aprendizaje y por ende el nombre que escogí para el blog «Aprendamos de Programación».
Un abrazo.
Me gustaMe gusta
hola Edward , saludos
oye segui al paso de tus instrucciones del código tal cual pero me marca error en el form , en las instrucciones de los botones Obj.conexion(), Obj.consulta .etc. el error que lanza es este
conexion is not a member of ejeventas.crud
generate method stub for conexion in ejeventas.crud
hice el mismo programa que tu pero cambie solo el nombre de tutorial_crud por el de ejeventas y no logro entender porque el error si lo realice tal cual lo haces tu .
te agradecería si me puedes sacar de mi duda por favor
que tengas un lindo día
gracias
Me gustaMe gusta
Cordial saludo Satura,
Te comento que el inconveniente que se te presenta al parecer es debido a que estas omitiendo crear un nuevo objeto de la clase CRUD.
Public Class Form1
':::Creamos un objeto para establecer conexion con nuestra clase CRUD
Dim Obj As New CRUD
Revisa esta parte y me comentas.
Quedo atento a tus comentarios.
Un abrazo.
Me gustaMe gusta
HolaEdward
He visto tu blog sobre programación y me ha gustado mucho pues has conseguido una forma de programar muy clara y fácil de seguir. Yo soy aficionado a la programación y dedico muchas horas a leer y ver código con el objeto de aprender algo y de paso matar el tiempo pues estoy jubilado. Hasta hace poco trabajaba con Access pero estoy intentando pasa un programa que tengo a MySql, ya tengo pasadas las operaciones de Insertar, Modificar y Eliminar, pero como te decía me ha gustado el poder hacer estas operaciones con una sola función. El problema que me estoy encontrando es que no veo la forma de encajar el código para llamar a los Procedimientos Almacenados y a las Funciones que tengo ya es por lo que me gustaría haber si puedes ayudarme a encajar mi programación con la tuya, pera ello te adjunto el código que yo utilizo para “Mostrar Datos” al abrir el formulario y para “Insertar Datos” asi como la función de “Max_Registro” que aun no he conseguido conectarla al programa pues no se como hacerlo.
Private Sub AñadeReg()
Dim sql = “InsertCalle”
Open()
Using cmd = New MySqlCommand(sql, cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue(“@Calles”, “Calles”)
cmd.Parameters.AddWithValue(“@txtCalle”, txtCalle.Text.Trim())
Try
Dim rd As MySqlDataReader = cmd.ExecuteReader()
Dim dt As New DataTable
dt.Load(rd)
rd.Close()
dgv.DataSource = dt
If dt.Rows.Count > 0 Then
dgv.CurrentCell = dgv.Rows(0).Cells(0)
End If
dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)
Dgv_Click()
labelInfo.Text = “Registro añadido correctamente”
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Information, ToString)
Finally
cn.Close()
cn.Dispose()
End Try
End Using
End Sub
*******************************************************
CREATE DEFINER=`root`@`localhost` PROCEDURE `Insert_Calle`(
IN txtCampo1 integer(4),
IN txtCampo2 varchar(50)
)
BEGIN
set @campo1=txtcampo1;
set @campo2=txtcampo2;
prepare stm from ‘Insert Into Calles VALUES (?,?)’;
execute stm using @campo1,@campo2;
DEALLOCATE prepare stm;
END
***********************************************************
Sub CargaDatos()
Dim sql = “VerCalles”
Open()
Using cmd = New MySqlCommand(sql, cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue(“@Calle”, “Calles”) ‘Calles es la Tabla
Try
Dim rd As MySqlDataReader = cmd.ExecuteReader()
Dim dt As New DataTable
dt.Load(rd)
rd.Close()
dgv.DataSource = dt
If dt.Rows.Count > 0 Then
dgv.CurrentCell = dgv.Rows(0).Cells(0)
End If
dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)
Dgv_Click()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Information, ToString)
Finally
cn.Close()
cn.Dispose()
End Try
End Using
End Sub
*****************************************************
CREATE DEFINER=`root`@`localhost` PROCEDURE `VerDatos`(
IN Tabla VARCHAR(15)
)
BEGIN
SET @VV_CONSDINAM = CONCAT(‘SELECT * FROM ‘,Tabla);
PREPARE SENTENCIA FROM @VV_CONSDINAM;
EXECUTE SENTENCIA;
END
***************************************************
CREATE DEFINER=`root`@`localhost` FUNCTION `reg_max_Calles`() RETURNS int(4)
NO SQL
BEGIN
DECLARE max_value INT(4);
SET max_value = 0;
SELECT MAX(id) INTO max_value FROM calles;
RETURN max_value + 1;
END
**************************************************
Antes lo hacia asi
Public Function MaximoReg() As Integer
Try
cn.Open()
MaximoReg = 0
Dim SQL As String = “Select Max(Id) From tabla
Dim cmd As New MySqlCommand(SQL, cn)
MaximoReg = CInt(cmd.ExecuteScalar)
Return CInt(MaximoReg)
Catch ex As Exception
Return CInt(0)
Finally
cn.Close()
End Try
End Function
Espero no abusar mucho con mis peticiones pero he intentado durante varios días encajar el código pero no lo consigo.
Muchas gracias y un saludo
Me gustaMe gusta
Hola Edward,
Soy muy aficionado a la programación hace mucho tiempo que estuve programando en VB6 y como sabes ya no es compatible con los nuevos windows la simplicidad de tu ejemplo me llamo la atención y nuevamente me intereso volver al mundo de la programación ya que te hace pensar mucho buscar la lógica de cada comando y proceso que queremos ejecutar.
Una consulta por favor.
Si queremos que cada vez que registramos un registro Nuevo continúe la correlación en automático en base a lo que esta en la BD access colocando el código en TextBox por ejemplo tengo 3 registros en la BD cuyos códigos son 001, 002 y 003, como hago para que busque el numero mayor que es 3 + 1 sería el siguiente registro el código sería 004 ubicado en el TxtId.Text.
Estoy intentando simplificar la conexión pero no logro tener éxito, todo la conexión a la BD esta en el mismo formulario y en el ejemplo que muestras todo viene desde un Modulo
Te detallo la fuente que estoy utilizando haber si me puedas ayudar ó de repente falta organizar y/o direccionar la ruta al Modulo.
De antemano muchas gracias.
Dim Conexion As New OleDbConnection
Dim Cod_Registro As New OleDbCommand
Private Sub Form_Mtto_Registro_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
Conexion.ConnectionString = “Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\BD AGENDA\AGENDA.accdb” ‘;Persist Security Info=True
Conexion.Open()
Genera_Codigo()
Catch ex As Exception
MsgBox(“Error al conectar con la BD”, MsgBoxStyle.Critical, “Advertencia”)
End Try
End Sub
Private Sub Genera_Codigo()
Dim maximo As String
Cod_Registro.Connection = Conexion
Cod_Registro.CommandType = CommandType.Text
Cod_Registro.CommandText = “Select MAX(Id) As maximo FROM Clientes”
Dim objeto As Object = Cod_Registro.ExecuteScalar()
If IsDBNull(objeto) Then
maximo = 1
Me. TxtId.Text = Microsoft.VisualBasic.Right(“00” & maximo, 3)
Else
maximo = Convert.ToInt32(Cod_Registro.ExecuteScalar()) + 1
Me. TxtId.Text = Microsoft.VisualBasic.Right(“00” & maximo, 3)
End If
End Sub
Me gustaMe gusta
Ya mee ha quedado claro. Muchas gracias.
Me gustaMe gusta
Hola pretendo sustituir esta forma de hacel el Insert
Pretendo sustituirlo por el Insert que utilizo ahora.
sql = “Insert Into Calles (Id,Calle) Select ” & txtId.Text & “, ‘” & txtCalle.Text & “‘, ‘” & txtMunicipio.Text & “‘”
por hacerlo por medio de parámetros pero me está dando un error pues no me reconoce la columna de Calle. Sin embargo lo tengo funcionado actualmente.
Private Sub Añadir(ByVal sender As System.Object, ByVal e As System.EventArgs)
sw = 1
Botones(True)
LimpiarGroupBox(gbDatos)
Try
Dim frmCalles As FrmCalles = Me
sql = “SELECT Max(Id) FROM Calles”
Dim valor As Integer = Obj.retornaEntero(dgv, sql) + 1
Me.txtId.Text = CStr(valor)
ObjCalle.Id = CInt(txtId.Text)
txtId.Text = CStr(ObjCalle.Id)
Me.txtCalle.Focus()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Information, ToString)
End Try
End Sub
Private Sub grabar(sender As Object, e As EventArgs)
Obj.Conexion()
‘:::Creamos la variable Sql que guardar la instruccion de tipo SQL
Dim sql = “Insert Into Calles(Id,Calle) Select “@Id,@Calle”
Dim cmd As New MySqlCommand(sql, Obj.con)
cmd.CommandType = CType(CStr(MySqlDbType.Text), CommandType)
cmd.Parameters.Add(“@Id”, MySqlDbType.Int32, 5).Value = txtId.Text
cmd.Parameters.Add(“@Calle”, MySqlDbType.VarChar, 50).Value = txtCalle.Text
Obj.Operaciones(dgv, sql)
sql = “Select count(*) from Calles”
If Obj.RetornaEntero(dgv, sql) > 0 Then
CargaDatos()
Dgv_CellClick()
End If
Botones(False)
End Sub
Quisiere haber si me puedes ayudar a ver mi fallo.
Muchas gracias y un saludo
Me gustaMe gusta
Perdona que me liado lo tenía copiado en una hoja y al pegarlo he metido unas lineas equivocando el tema.
Pretendo sustituirlo por el Insert lo que utilizo ahora, que es esta linea.
sql = “Insert Into Calles (Id,Calle) Select ” & txtId.Text & “, ‘” & txtCalle.Text & “‘, ‘” & txtMunicipio.Text & “‘”
Por un Insert con parámetros que es el código siguiente.
Ya me puedes disculpar.
Un saludo
Me gustaMe gusta
Amigo, me gusta mucho la manera en la que enseñas, entendi perfectamente todo. Ahora te pido un favorsito. Podrias hacer este mismo tutorial pero con la base de datos SQlite? Por favor
Me gustaMe gusta
Hola Edward, gracias por tu excelente tutorial.
Me gustaría preguntarte lo que hay que hacer si lo que deseo es que mi base de datos que se encuentra en OneDrive, cual sería el código para conexioón a la base de datos desde visual basic 2017?
Me explico mejor, deseo lo siguiente :
1.Crear programa con visual basic 2017
2.Crear base de datos SQLite
3.En el momento de instalar mi programa para un cliente, que pueda elegir en el instalador o al iniciar mi programa el lugar donde desea guardar la base de datos, por ejemplo en OneDrive…
4.Como indico la ruta donde se encuentra la base de datos a mi programa para poder usarla sin que el cliente tenga que indicarlo a cada abertura del programa.
Gracias por tu ayuda,
Juan
Me gustaMe gusta
Soy ingeniero electromecánico y en verdad, había programado en vb6,, he estado buscando en la red y en libros y puedo asegurar que tú explicación es tan didáctica Cobo los antiguos libros de Mc. Graw Hill, en verdad te felicito este artículo está muy claro., Todo está muy claro.. Felicitaciones.
Me gustaMe gusta
Amigo edward tendras cuenta en fb o un canal en youtube? me gustaria seguirte!
Me gustaMe gusta
Hola Edward Gómez, quiero ver si me puedes ayudar tengo el siguiente problema
“no se puede realizar la operación por: Error de sintaxis en la instrucción INSERT INTO”.
Dim Sql As String = “Insert Into Clientes (Email, Password) Select ‘” & TxtEmail.Text & “‘, ‘” & TxtPassword.Text & “‘”
solo estoy trabajando con 2 campos para probar y aun así me da error y no se que esta mal por que la conexiona funciona bien pero al momento de registrar datos me salta el error,
Me gustaMe gusta
Hola buenas tardes Edward todo funciona muy bien mi problema en el botón actualizar se me actualiza todo el datagrid, espero me puedas apoyar.
Me gustaMe gusta
Hola, estoy trabajando con Sqlite y al crear las opereraciones en cmd. excecuteNonQuery() .. me da este error: Excecute NonQuery() no es un miembro de SqliteCommand….
Me gustaMe gusta
Excelente tu aporte. Hace mucha falta personas como vos. Muchas Gracias.
Me gustaMe gusta
Claro, Conciso y practico.
Quizás conduzca un poco a error como le ha sucedido a Fco. Javier Medrano Salez, con la declaración del modulo. Yo estoy empezando ahora y utilizo el visual 2019. En vez de modulo, he agregado al proyecto directamente una clase.
Quería encontrar sentido a las clases, pues todos los ejemplos visto anteriormente, se dedican a explicar una estructura que no comprendía que al implementarla los datos que le pasase, se perderían al cerrar la aplicación. Esto, tiene sentido. Gracias.
Un tutorial magnifico. No hay dudas de que sabes de que hablas.
Mucha gracias por tu dedicación.
Me gustaMe gusta
Buenas tardes… muy didactica tu explicacion, soy nuevo con el visual studio … siguiendo los pasos del ejemplo tengo un problemilla al hacer click en leer… Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding… podrias ayudarme con eso por favor
Me gustaMe gusta
que es la “Tabla ” que por eso es que no me funciona el programa
Me gustaMe gusta
Edward: sé que es un trabajo de hace mucho tiempo, pero no soy experto en programación, sin embargo tengo un trabajo que hicimos hace 6 o 7 años y te comento que quiero recuperar una parte relacionada con el registro, actualización, consultas y bajas. pero a pesar de que sí tengo conexión con la base de datos, no me abre la información.
ojalá pudieras ayudarme.
Gracias anticipadas
Me gustaMe gusta