base datos mysql y visual basic

30
6.3. Cursores Los cursores se utilizan para manejar las sentencias SELECT. Un cursor esta formado por un conjunto de registros devueltos por una instrucción SQL del tipo SELECT. Desde un punto de visto interno a la base de datos, los cursores son segmentos de memoria utilizados para realizar operaciones con los registros devueltos tras ejecutar una sentencia SELECT. Reciben el nombre de cursores implícitos , cuando la sentencia SELECT regresa solo un registro. Para procesar instrucciones SELECT que devuelvan más de una fila, son necesarios cursores explicítos combinados con un estructura de bloque. Un cursor admite el uso de parámetros. Los parámetros deben declararse junto con el cursor. El siguiente diagrama representa como se procesa una instrucción SQL a través de un cursor. Fases de un cursor MYSQL

Upload: rafael-tobar-jame

Post on 16-Apr-2017

285 views

Category:

Software


11 download

TRANSCRIPT

Page 1: Base datos mysql y visual basic

6.3. CursoresLos cursores se utilizan para manejar las sentencias SELECT. Un cursor esta formado por un conjunto de registros devueltos por una instrucción SQL del tipo SELECT. Desde un punto de visto interno a la base de datos, los cursores son segmentos de memoria utilizados para realizar operaciones con los registros devueltos tras ejecutar una sentencia SELECT.

Reciben el nombre de cursores implícitos, cuando la sentencia SELECT regresa solo un registro. Para procesar instrucciones SELECT que devuelvan más de una fila, son necesarios cursores explicítos combinados con un estructura de bloque.

Un cursor admite el uso de parámetros. Los parámetros deben declararse junto con el cursor.

El siguiente diagrama representa como se procesa una instrucción SQL a través de un cursor.

Fases de un cursor MYSQL

Fases de un cursor ORACLE

Cursores implícitos

Page 2: Base datos mysql y visual basic

Se utilizan cuando la sentencia SELECT devuelve un solo registro. En cada cursor implicito debe existir palabra reservada INTO.

Las variables que reciben los datos devueltos por el cursor tienen que contienen el mismo tipo de dato que las columnas de la tabla.

MySQL no soporta esta clase de cursores pero podemos visualizarlos así.

Importante poner un delimitador nuevo, (suele ser ';') ya que si no se cambia toma el ; como delimitador, es decir que seria el final del procedimiento o función (Línea 2).

También es posible usar cursores dentro de un procedimiento almacenado. Observe el siguiente ejemplo que a diferencia de los ejercicios anteriores no genera error si la consulta no regresa registros. Si usamos %ROWCOUNT es posible conocer cuántos registros regresa la consulta 0 ... n.

BEGIN inscripcionCursores('Compiladores','LILIANA','ENEJUN09',90); END;

DECLARE fechas dolar.fecha%TYPE ; precioActual dolar.precio%TYPE;BEGIN SELECT fecha, precio INTO fechas, precioActual FROM dolar WHERE fecha = (SELECT MAX(precio) FROM dolar); dbms_output.put_line(fechas || ' ' || precioActual);END;

Ejemplo: Video Patito. Obtener el director de una determinada pelicula.

Page 3: Base datos mysql y visual basic

DROP PROCEDURE IF EXISTS dirige;DELIMITER $$CREATE PROCEDURE dirige (IN _Pelicula CHAR(40), OUT _Director CHAR(50))BEGIN DECLARE _Dirige CURSOR FOR SELECT a.NombreActor

FROM actua ac, rol r, pelicula p, actor aWHERE ac.idActor = a.idActor

AND ac.idPelicula = p.idPelicula AND ac.idRol = r.idRol AND r.NombreRol = 'Director' AND p.NombrePelicula = _Pelicula; OPEN _Dirige; FETCH _Dirige INTO _Director; CLOSE _Dirige;END$$DELIMITER ;-- Llamada al procedimientoCALL dirige('Contrabando', @Quien);SELECT @Quien;DECLARE nombreDirector CHAR(50);BEGIN SELECT a.NombreActor INTO nombreDirector

FROM actua ac, rol r, pelicula p, actor aWHERE ac.idActor = a.idActor

AND ac.idPelicula = p.idPelicula AND ac.idRol = r.idRol AND r.NombreRol = 'Director' AND p.NombrePelicula = 'Contrabando'; dbms_output.put_line('El director de

Page 4: Base datos mysql y visual basic

Contrabando es: ' || nombreDirector);END;

Cursores explícitos:

Se utilizan cuando la sentencia SELECT puede devolver varios registros. También se pueden utilizar en consultas que devuelvan un solo registro por razones de eficiencia con respecto a los cursores implícitos, eficiencia que mejorará especialmente si el cursor explícito se tiene que ejecutar varias veces dentro del bloque de código.

Un cursor explícito tiene que ser definido previamente como cualquier otra variable cursores explícitos admiten el uso de parámetros. Los parámetros deben declararse junto con el cursor.

Ejemplo: Reloj checador

Iniciaremos creando las siguientes tablas

CREATE TABLE empleados ( idEmpleado INTEGER AUTO_INCREMENT, nombre CHAR(40) NOT NULL, PRIMARY KEY (idEmpleado, nombre)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_spanish_ci;CREATE TABLE checar ( idChecar INTEGER AUTO_INCREMENT, fecha DATE NOT NULL, hora TIME NOT NULL, idEmpleado INT NOT NULL, PRIMARY KEY (idchecar), CONSTRAINT fk_idEmpleado FOREIGN KEY (idEmpleado ) REFERENCES empleados (idEmpleado )) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_spanish_ci;

Ingresaremos los siguientes empleados

INSERT INTO empleados VALUES (1,'Jorge Pérez García');INSERT INTO empleados VALUES (2, 'Roberto Carlos Hernández Alamillo');INSERT INTO empleados VALUES (3,'Francisco Argona Luis');

Declaramos ahora el cursor (línea 9 al 12) y el procedimiento correspondiente

DROP PROCEDURE IF EXISTS checando;

Page 5: Base datos mysql y visual basic

DELIMITER $$CREATE PROCEDURE checando(IN fechas DATE, IN horas TIME, IN id INTEGER, OUT mensaje CHAR(20))BEGIN DECLARE n INTEGER DEFAULT 0; DECLARE nChecadas CURSOR FOR SELECT COUNT(*) FROM checar WHERE (idEmpleado = id) AND (fecha = fechas); OPEN nChecadas; FETCH nChecadas INTO n; CLOSE nChecadas; IF (n <= 1) THEN IF (n = 0) THEN INSERT INTO checar (fecha, hora, idEmpleado) VALUES (fechas, horas, id); SET mensaje = 'Entrada'; ELSE INSERT INTO checar (fecha, hora, idEmpleado) VALUES (fechas, horas, id); SET mensaje = 'Salida'; END IF; ELSE SET mensaje = 'No jugar';END IF;END$$DELIMITER ;

El comando DECLARE (línea 5) sirve para declarar variables locales y cursores. Solo funcionan dentro de procedimientos inmediantamente del BEGIN.

Ejemplo: Tipo de cambio para solventar obligaciones denominadas en dólares de los EE.UU.A., pagaderas en la República Mexicana.Fuente:

DROP PROCEDURE IF EXISTS precioDolar;DELIMITER $$;CREATE PROCEDURE precioDolar( OUT fechas CHAR(10), OUT precioCaro DECIMAL(8,4)) BEGIN DECLARE c CURSOR FOR SELECT fecha, precio FROM dolar WHERE precio = (SELECT MAX(precio) FROM dolar); SET precioCaro = 0; OPEN c; FETCH c INTO fechas, precioCaro; CLOSE c; END$$DELIMITER ;CALL precioDolar(@fecha,@precio);SELECT @fecha, @precio;

Page 6: Base datos mysql y visual basic

Ejemplo:Modificando una tabla mediante un cursor

CREATE TABLE IF NOT EXISTS base ( idCodigo int(11) NOT NULL, colonia char(85) COLLATE utf8_spanish_ci NOT NULL, idAsentamiento int(11) DEFAULT NULL, Asentamiento char(50) COLLATE utf8_spanish_ci NOT NULL, idMunicipio int(11) DEFAULT NULL, municipio char(85) COLLATE utf8_spanish_ci NOT NULL, idEstado int(11) NOT NULL, idZona int(11) NOT NULL, zona char(30) COLLATE utf8_spanish_ci NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

CREATE TABLE IF NOT EXISTS zonas ( idZona int(11) NOT NULL AUTO_INCREMENT, Zona char(20) NOT NULL, PRIMARY KEY (idZona)) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS tiposAsentamiento ( idTipo int(11) NOT NULL AUTO_INCREMENT, asentamiento char(50) COLLATE utf8_spanish_ci NOT NULL, PRIMARY KEY (idTipo)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=1;

Vamos a poblar las tablas zonas y tiposAsentamiento

UPDATE base SET idZona = 1 WHERE zona = 'Rural';UPDATE base SET idZona = 2 WHERE zona = 'Semiurbano';UPDATE base SET idZona = 3 WHERE zona = 'Urbano';

INSERT INTO municipios(idEstado, municipio) SELECT DISTINCT idEstado, municipio FROM base ORDER BY idEstado, municipio

Nuestro procedimiento y cursor debE lucir similar a:

DELIMITER //DROP PROCEDURE IF EXISTS tipos;CREATE PROCEDURE tipos()BEGIN DECLARE done INT DEFAULT FALSE; DECLARE Tipo, tipos INT; DECLARE Asentamientos, nAsentamiento CHAR(50); DECLARE cMunicipios CURSOR FOR SELECT idTipo, asentamiento FROM tiposAsentamiento; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

Page 7: Base datos mysql y visual basic

OPEN cMunicipios; main_loop: LOOP FETCH cMunicipios INTO Tipo, Asentamientos; IF done THEN LEAVE main_loop; END IF; SET tipos = Tipo;

SET nAsentamiento = Asentamientos; UPDATE base SET idAsentamiento = Tipos WHERE asentamiento = nAsentamiento; END LOOP;END;DELIMITER ;CALL tipos();

De forma simisilar

DROP PROCEDURE IF EXISTS pMunicipio; CREATE PROCEDURE pMunicipio()BEGIN DECLARE done INT DEFAULT 0; DECLARE idMun,idMuni, idEsta, idEstados INT; DECLARE Mun, Municipios CHAR(85); DECLARE cMunicipios CURSOR FOR SELECT idMunicipio, municipio, idEstado FROM municipios; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cMunicipios; main_loop: LOOP FETCH cMunicipios INTO idMun, Mun, idEsta; IF done = 1 THEN LEAVE main_loop; END IF; SET idMuni = idMun;

SET Municipios = Mun;SET idEstados = idEsta;

UPDATE base SET idMunicipio = idMuni WHERE (idEstado = idEstados) AND (municipio = Municipios); END LOOP;END;CALL pMunicipio();

Por último elimine los campos Asentamientos,municipio y zon. Elabore la tabla denominada colonias, con su respectiva integridad referencial. Si usted esta aquí ya casi acredita el curso, animo

Page 8: Base datos mysql y visual basic

Anterior Acerca dehome Contactame

Siguiente

Private Sub GuardarImagen(sRuta As String, rst As ADODB.Recordset)Dim b() As ByteOpen sRuta For Binary As #1ReDim b(FileLen(sRuta))Get #1, , bClose #1rst.AddNewrst.Fields("CampoBLOB").AppendChunk brst.UpdateEnd Sub"CampoBLOB" es el nombre del campo imagen.

Para llamarlo:GuardarImagen "C:\Mis imágenes\La imagen.jpg", MiRecordset

(Source: todoexpertos.com)

Public Sub CONECTAR() Dim STRHOST As String Dim STRDATABASE As String Dim STRUSER As String Dim STRPASS As String Dim STRCONSTRING As String

If CON.State = 0 Then

On Error GoTo conexion STRHOST = "192.168.1.20" STRDATABASE = "lujan" STRUSER = "root" STRPASS = "lujan"

Page 9: Base datos mysql y visual basic

STRCONSTRING = "DRIVER={MySQL ODBC 3.51 Driver};" _ & "SERVER=" & STRHOST & ";" _ & "DATABASE=" & STRDATABASE & ";" _ & "UID=" & STRUSER & ";PWD=" & STRPASS & "; OPTION=3" With CON .ConnectionString = STRCONSTRING .CursorLocation = adUseClient .Open End With Exit Sub conexion: MsgBox Err.Number & " " & Err.Description & " ", vbCritical, "Asegurese que el Servidor este encendido..." Else End If end sub

Gracias por ponerme atencion.... he probado cambiando mi code de la forma que dice en el link que me dio tesis, y bueno no le allo la diferencia en cuanto a rapidez...... pero me parece mas viable.. gracias... los segundo tengo un campo de tipo numerico en cada tabla es por eso que tengo una funcion CREARID(TABLA), talves la mecanica de la enzeñanza que me dieron, pero si prientan de otra forma lo pruebo y vemos... lo ultimo mi cadena de conexion es la siguiente:

Public CON As New ADODB.Connection

Public Sub CONECTAR()

Dim STRHOST As String Dim STRDATABASE As String Dim STRUSER As String Dim STRPASS As String Dim STRCONSTRING As String

Page 10: Base datos mysql y visual basic

If CON.State = 0 Then

On Error GoTo conexion STRHOST = "192.168.1.20" STRDATABASE = "lujan" STRUSER = "root" STRPASS = "lujan"

STRCONSTRING = "DRIVER={MySQL ODBC 3.51 Driver};" _ & "SERVER=" & STRHOST & ";" _ & "DATABASE=" & STRDATABASE & ";" _ & "UID=" & STRUSER & ";PWD=" & STRPASS & "; OPTION=3" 'On Error GoTo CONERROR With CON .ConnectionString = STRCONSTRING .CursorLocation = adUseClient .Open End With COMM.ActiveConnection = CON Exit Sub conexion: MsgBox Err.Number & " " & Err.Description & " ", vbCritical, "Asegurese que el Servidor este encendido..." Else End If

.. escucho consejos por favor quiero seguir aprendiendo..-.

Page 11: Base datos mysql y visual basic

o

o

o

o

o

o

o

o

o

o

o

o

oo

Tutoriales MS Access - Procedimientos Almacenados desde Access vía código VBA

Miguel Ángel Sandoval Sepúlveda

248

3,369

Publicado el 28/03/2013

Aprenderemos a ejecutar procedimientos almacenados en mysql desde MS Access, todo esto vía código, en la descripción encontraras material adicional para tus proyectos.

Esta es el código que he establecido para ejecutar mi procedimiento almacenado de crear al usuario con su contraseña.

Const DB_CONNECT As String = "Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=tubasededatos;User=tuusuario;Passwor-

Page 12: Base datos mysql y visual basic

d=tupassword;Option=3;"

'Definición de ObjetosDim cn As ADODB.ConnectionDim cmd As ADODB.CommandDim rst As ADODB.Recordset

Set cn = New ADODB.Connection

With cn.ConnectionString = DB_CONNECT.OpenEnd With

Set cmd = New ADODB.CommandWith cmd.ActiveConnection = cn 'Activo la Conexión.NamedParameters = True.CommandType = adCmdStoredProc 'Defino el tipo de comando.CommandText = "proc_nuevo_usuario('" & txt_usuario & "', '" & txt_clave & "')" 'Defino los parámetros a enviar.Execute 'Ejecuto el envio del procedimiento.End With

cn.Close 'Cierro la conexiónSet cmd = NothingSet cn = Nothing

Page 13: Base datos mysql y visual basic

Dijimos que los procedimientos almacenados pueden devolver información; para ello se emplean parámetros de salida. El valor se retorna a quien realizó la llamada con parámetros de salida. Para que un procedimiento almacenado devuelva un valor se debe declarar una variable con la palabra clave "output" al crear el procedimiento:

create procedure NOMBREPROCEDIMIENTO @PARAMETROENTRADA TIPO =VALORPORDEFECTO, @PARAMETROSALIDA TIPO=VALORPORDEFECTO output as SENTENCIAS select @PARAMETROSALIDA=SENTENCIAS;

Los parámetros de salida pueden ser de cualquier tipo de datos, excepto text, ntext e image.

Creamos un procedimiento almacenado al cual le enviamos 2 números y retorna el promedio:

create procedure pa_promedio @n1 decimal(4,2), @n2 decimal(4,2), @resultado decimal(4,2) output as select @resultado=(@n1+@n2)/2;

Al ejecutarlo también debe emplearse "output":

declare @variable decimal(4,2) execute pa_promedio 5,6, @variable output select @variable;

Declaramos una variable para guardar el valor devuelto por el procedimiento; ejecutamos el procedimiento enviándole 2 valores y mostramos el resultado.

La instrucción que realiza la llamada al procedimiento debe contener un nombre de variable para almacenar el valor retornado.

Page 14: Base datos mysql y visual basic

Creamos un procedimiento almacenado que muestre los títulos, editorial y precio de los libros de un determinado autor (enviado como parámetro de entrada) y nos retorne la suma y el promedio de los precios de todos los libros del autor enviado:

create procedure pa_autor_sumaypromedio @autor varchar(30)='%', @suma decimal(6,2) output, @promedio decimal(6,2) output as select titulo,editorial,precio from libros where autor like @autor select @suma=sum(precio) from libros where autor like @autor select @promedio=avg(precio) from libros where autor like @autor;

Ejecutamos el procedimiento y vemos el contenido de las variables en las que almacenamos los parámetros de salida del procedimiento:

declare @s decimal(6,2), @p decimal(6,2) execute pa_autor_sumaypromedio 'Richard Bach', @s output, @p output select @s as total, @p as promedio;

Page 15: Base datos mysql y visual basic

1. Entorno

Visual Basic 6.0. MySQL 5.0.

2. Introducción

Visual Basic es un lenguaje de programación orientado a eventos, desarrollado por el alemán Alan Cooper para Microsoft. Este lenguaje de programación es un dialecto de BASIC, con importantes agregados. Su primera versión fue presentada en 1991, con la intención de simplificar la programación utilizando un ambiente de desarrollo completamente gráfico que facilitara la creación de interfaces gráficas y, en cierta medida, también la programación misma. Y el siguiente tutorial podran ver un ejemplo de como comunicar Visual Basic 6.0 con una base de datos MySQL 5.0 que tiene procedimientos almacenados. Desarrollaremos un ejemplo de mantenimiento a una tabla que espero les sea de su utilidad.

3. Desarrollo

3.1. Driver

Primero debemos de instalar el Driver de MySQL para que se pueda comunicar Visual Basic 6.0 con MySQL 5.0 para eso lo descargamos del siguiente LINK

3.2. Creando Base de Datos con MySQL

A continuación les paso el script para crear la base y la tabla que vamos a usar en el ejemplo ---- Creando la base de datos--

Page 16: Base datos mysql y visual basic

CREATE DATABASE IF NOT EXISTS bdblog;---- Usando la base de datos--USE bdblog;---- Creando la tabla--DROP TABLE IF EXISTS `visitante`;CREATE TABLE `visitante` ( `codigo` int(11) NOT NULL AUTO_INCREMENT, `nombre` varchar(50) NOT NULL, `fechaNacimiento` datetime NOT NULL, `peso` decimal(18,2) NOT NULL, PRIMARY KEY (`codigo`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;

3.3. Creando los procedimiento

El script de los procedimientos almacenados que vamos a usar

-- Insertar VisitanteDELIMITER $$

DROP PROCEDURE IF EXISTS `spI_visitante` $$CREATE DEFINER=`root`@`localhost` PROCEDURE `spI_visitante`( _codigo int , _nombre varchar(50) , _fechaNacimiento datetime , _peso decimal(18, 2))BEGIN

SELECT IFNULL(MAX(codigo),0)+1 into _codigo FROM `visitante`;INSERT INTO `visitante`( `codigo`, `nombre`, `fechaNacimiento`, `peso`)VALUES ( _codigo, _nombre, _fechaNacimiento, _peso);END $$

DELIMITER ;

-- Actualizar VisitanteDELIMITER $$

DROP PROCEDURE IF EXISTS `spU_visitante` $$

Page 17: Base datos mysql y visual basic

CREATE DEFINER=`root`@`localhost` PROCEDURE `spU_visitante`( _codigo int , _nombre varchar(50) , _fechaNacimiento datetime , _peso decimal(18, 2))BEGIN

UPDATE visitanteSET `nombre` = _nombre, `fechaNacimiento` = _fechaNacimiento, `peso` = _pesoWHERE `codigo` = _codigo;END $$

DELIMITER ;

-- Mostrar todos los VisitanteDELIMITER $$

DROP PROCEDURE IF EXISTS `spF_visitante_all` $$CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_visitante_all`()BEGIN

select codigo, nombre, fechaNacimiento, peso from visitante order by nombre;END $$

DELIMITER ;

3.4. Creando el proyecto en Visual Basic 6.0.

Debemos de crear un proyecto en Visual Basic 6.0 y luego diseñamos el siguiente formulario

Page 18: Base datos mysql y visual basic

Y las referencias del proyecto deberian ser las siguientes:

Page 19: Base datos mysql y visual basic

3.4.1. Métodos de soporte

Dentro del formulario vamos a crear unos métodos que den soporte a nuestro formulario. Como el evento limpiar, que limpia todos los textbox o el método habilitar que habilita los controles.

Option Explicit

'Para saber si es un nuevo registroDim nuevo As Boolean'Para saber si vamos a modificarDim modificar As Boolean

Page 20: Base datos mysql y visual basic

'Habilita los controles que son textbox, combobox, dtpickerPrivate Sub habilitar(ByVal blnEstado As Boolean) Dim crl As Control For Each crl In Me.Controls If TypeOf crl Is TextBox Or TypeOf crl Is ComboBox Or TypeOf crl Is DTPicker Then crl.Enabled = blnEstado End If NextEnd Sub'Limpia las cajas de textoPrivate Sub limpiar() Dim crl As Control For Each crl In Me.Controls If TypeOf crl Is TextBox Then crl.Text = "" End If NextEnd Sub'Habilita o deshabilita los botonesPrivate Sub botones() If nuevo = True Or modificar = True Then habilitar True btnNuevo.Enabled = False btnGuardar.Enabled = True btnModificar.Enabled = False btnCancelar.Enabled = True Else habilitar False btnNuevo.Enabled = True btnGuardar.Enabled = False btnModificar.Enabled = True btnCancelar.Enabled = False End IfEnd Sub'Cargamos los metodos en el loadPrivate Sub Form_Load() nuevo = False modificar = False habilitar False botones 'Este metodo lo implementamos despues llenarListViewEnd Sub

3.4.2. Método Conectar

El siguiente método nos permite conectarnos a la base de datos que esta en MySQL desde Visual Basic 6.0.

Public Function Conectar() As ADODB.Connection Dim con As ADODB.Connection Set con = New ADODB.Connection con.CursorLocation = adUseClient con.Open "DRIVER={MySQL ODBC 3.51 Driver};" _ & "SERVER=localhost;" _

Page 21: Base datos mysql y visual basic

& "DATABASE=bdblog;" _ & "UID=root;PWD=clave;PORT=3306;OPTION=131072" Set Conectar = conEnd Function

3.4.3. Método llenar listView

Private Sub llenarListView() With lvwVisitante .Refresh .ListItems.Clear End With Dim sqlcon As ADODB.Connection Set sqlcon = Me.Conectar Dim sqlrec As New ADODB.Recordset sqlrec.Open "call spF_visitante_all()", sqlcon, adOpenStatic, adLockOptimistic Dim Item As ListItem While Not sqlrec.EOF Set Item = lvwVisitante.ListItems.Add(, , sqlrec!nombre) Item.Tag = sqlrec!nombre Item.SubItems(1) = VBA.Format$(sqlrec!fechaNacimiento, "dd-MM-yyyy") Item.SubItems(2) = "" & sqlrec!peso Item.SubItems(3) = "" & sqlrec!Codigo sqlrec.MoveNext Wend lvwVisitante.Refresh sqlrec.Close sqlcon.Close Set sqlrec = Nothing Set sqlcon = NothingEnd Sub

3.4.4. Método para insertar un visitante

Este método sirve para insertar un visitante a nuestra base de datos y llama al procedimiento almacenado "spI_Visitante"

Public Function insertarvisitante() As BooleanOn Error GoTo Problemas Dim rpta As Boolean ' Variables que nos indicar si se inserto el Registro rpta = False Dim sqlcon As ADODB.Connection ' Variable que sirve para establecer la conexion con MySQL Set sqlcon = Me.Conectar Dim sqlcmd As New ADODB.Command ' El comando que vamos a ejecutar --> Insertar un registro a la tabla visitante With sqlcmd .CommandText = "call spI_visitante(" & _ "?," & _ "?," & _ "?," & _

Page 22: Base datos mysql y visual basic

"?" & _ ")" .ActiveConnection = sqlcon ' Establecemos la conexion al comando .CommandType = adCmdText ' Va a ejecutar un Store Procedure .Prepared = True ' La sentencia esta prepara para ejecutarse End With 'Parametros que tendra el procedimiento almacenado spI_visitante Dim paramcodigo As New ADODB.Parameter Dim paramnombre As New ADODB.Parameter Dim paramfechaNacimiento As New ADODB.Parameter Dim parampeso As New ADODB.Parameter 'Establecemos los valores para los parametros del procedimiento almacenado spI_visitante With paramcodigo .Name = "_codigo" .Size = 0 .Direction = adParamInput .Type = adInteger .Value = 0 End With With paramnombre .Name = "_nombre" .Size = 50 .Direction = adParamInput .Type = adVarChar .Value = UCase(Me.txtNombre.Text) End With With paramfechaNacimiento .Name = "_fechaNacimiento" .Size = 0 .Direction = adParamInput .Type = adDate .Value = Me.dtpFechaNacimiento.Value End With With parampeso .Name = "_peso" .Size = 0 .Direction = adParamInput .Type = adDecimal .Precision = 18 .NumericScale = 2 .Value = Me.txtPeso.Text End With 'Agregamos los parametros al comando sqlcmd.Parameters.Append paramcodigo sqlcmd.Parameters.Append paramnombre sqlcmd.Parameters.Append paramfechaNacimiento sqlcmd.Parameters.Append parampeso 'Ejecutamos el procedimiento sqlcmd.Execute 'Limpiamos los recursos Set sqlcmd = Nothing sqlcon.Close Set sqlcon = Nothing insertarvisitante = True Exit FunctionProblemas:

Page 23: Base datos mysql y visual basic

insertarvisitante = False Exit FunctionEnd Function

3.4.5. Método para actualizar un visitante

Este método sirve para actualizar un visitante a nuestra base de datos y llama al procedimiento almacenado "spU_Visitante"

Public Function actualizarvisitante() As BooleanOn Error GoTo Problemas Dim rpta As Boolean ' Variables que nos indicar si se actualizo el Registro rpta = False Dim sqlcon As ADODB.Connection ' Variable que sirve para establecer la conexion con MySQL Set sqlcon = Me.Conectar Dim sqlcmd As New ADODB.Command ' El comando que vamos a ejecutar --> Actualizar un registro a la tabla visitante With sqlcmd .CommandText = "call spU_visitante(" & _ "?," & _ "?," & _ "?," & _ "?" & _ ")" .ActiveConnection = sqlcon ' Establecemos la conexion al comando .CommandType = adCmdText ' Va a ejecutar un Store Procedure .Prepared = True ' La sentencia esta prepara para ejecutarse End With 'Parametros que tendra el procedimiento almacenado spI_visitante Dim paramcodigo As New ADODB.Parameter Dim paramnombre As New ADODB.Parameter Dim paramfechaNacimiento As New ADODB.Parameter Dim parampeso As New ADODB.Parameter 'Establecemos los valores para los parametros del procedimiento almacenado spI_visitante With paramcodigo .Name = "_codigo" .Size = 0 .Direction = adParamInput .Type = adInteger .Value = Me.lblCodigo.Caption End With With paramnombre .Name = "_nombre" .Size = 50 .Direction = adParamInput .Type = adVarChar .Value = UCase(Me.txtNombre.Text) End With With paramfechaNacimiento .Name = "_fechaNacimiento" .Size = 0 .Direction = adParamInput .Type = adDate

Page 24: Base datos mysql y visual basic

.Value = Me.dtpFechaNacimiento.Value End With With parampeso .Name = "_peso" .Size = 0 .Direction = adParamInput .Type = adDecimal .Precision = 18 .NumericScale = 2 .Value = Me.txtPeso.Text End With 'Agregamos los parametros al comando sqlcmd.Parameters.Append paramcodigo sqlcmd.Parameters.Append paramnombre sqlcmd.Parameters.Append paramfechaNacimiento sqlcmd.Parameters.Append parampeso 'Ejecutamos el procedimiento sqlcmd.Execute 'Limpiamos los recursos Set sqlcmd = Nothing sqlcon.Close Set sqlcon = Nothing actualizarvisitante = True Exit FunctionProblemas: actualizarvisitante = False Exit FunctionEnd Function

3.4.6. Eventos de los controles del formulario

A continuación les mostraremos los eventos de los botones del formulario y del evento double clic del listview

'Evento clic del boton cancelarPrivate Sub btnCancelar_Click() nuevo = False modificar = False botones limpiar Me.lblCodigo.Caption = ""End Sub

'Evento clic del boton guardarPrivate Sub btnGuardar_Click() Dim respuesta As Integer Dim rpta As Boolean rpta = False If nuevo = True Then rpta = Me.insertarvisitante Else respuesta = MsgBox("Desea guardar los cambios realizados", 52, "MENSAJE") If respuesta = vbYes Then rpta = Me.actualizarvisitante End If

Page 25: Base datos mysql y visual basic

End If If rpta = True Then Dim men As String men = "Se " If nuevo = True Then men = men + "registro " Else men = men + "actualizo " End If men = men + "de forma correcta al Visitante" MsgBox men, vbDefaultButton1, "MENSAJE" Else MsgBox "No se realizo el proceso correctamente", vbCritical, "ERROR" End If nuevo = False modificar = False botones limpiar llenarListView Me.lblCodigo.Caption = ""End Sub

'Evento clic del boton modificarPrivate Sub btnModificar_Click() If lblCodigo.Caption <> "" Then modificar = True botones Else MsgBox "Debe de buscar un dato para modificar", vbCritical, "ERROR" End IfEnd Sub

Private Sub btnNuevo_Click() nuevo = True modificar = False botones limpiar Me.txtNombre.SetFocus Me.lblCodigo.Caption = ""End Sub

'Evento double clic del lisviewPrivate Sub lvwVisitante_DblClick()On Error GoTo Problemas If lvwVisitante.ListItems.Count = 0 Then Exit Sub If lvwVisitante.SelectedItem Is Nothing Then Exit Sub Me.txtNombre.Text = lvwVisitante.SelectedItem.Tag Me.dtpFechaNacimiento.Value = lvwVisitante.SelectedItem.SubItems(1) Me.txtPeso.Text = lvwVisitante.SelectedItem.SubItems(2) Me.lblCodigo.Caption = lvwVisitante.SelectedItem.SubItems(3) Exit SubProblemas: MsgBox "Debe de seleccionar un Visitante", vbCritical, "ERROR" Exit SubEnd Sub

Page 26: Base datos mysql y visual basic

4. Ejemplo de la Aplicación