martes, 31 de julio de 2012

Programadores: Visual Basic .Net y MySQL (Completo)








Un poco de teoria para inciar:
Open DataBase Connectivity (ODBC) es un estándar de acceso a bases de datos desarrollado por SQL Access Group en 1992, el objetivo de ODBC es hacer posible el acceder a cualquier dato desde cualquier aplicación, sin importar qué sistema de gestión de bases de datos (DBMS) almacene los datos, ODBC logra esto al insertar una capa intermedia (CLI) denominada nivel de Interfaz de Cliente SQL, entre la aplicación y el DBMS, el propósito de esta capa es traducir las consultas de datos de la aplicación en comandos que el DBMS entienda. Para que esto funcione tanto la aplicación como el DBMS deben ser compatibles con ODBC, esto es que la aplicación debe ser capaz de producir comandos ODBC y el DBMS debe ser capaz de responder a ellos
Fuente: http://es.wikipedia.org/wiki/Open_Database_Connectivity

Siendo así, el esquema de la aplicación sera el siguiente:


Si embargo, y esto es muy importante, este mismo esquema se puede usar de manera local, si es que estas pensando en diseñar una aplicación que no requiera de un servidor; para lograrlo simplemente haremos que un mismo computador sea cliente y servidor a la vez. 

Programas requeridos:
Para llevar a cabo estos tutoriales necesitaremos los siguientes programas:
- Motor de Base de Datos (o servidor) MySQL - Descargalo AQUI
- Controlador (o enlace) ODBC de MySQL - Descargalo AQUI
- GUI Tools MySQL - Descargalo AQUI
- MS Visual Basic Express 2010 - Descargalo AQUI o la version normal de VB.Net


Asegurate de tener instalados estos 3 programas antes de continuar con el tutorial. La instalacion de los componentes MySQL es muy sencilla.  

Lo recomendado seria instalar el Servidor MySQL en el computador Servidor y el Controlador ODBC en los computarores clientes, para efectos didacticos puedes instalar todo en el mismo computador. 

NOTA IMPORTANTE: Si eres programador de PHP y usas MySQL con PHPMyAdmin NO instales el Servidor MySQL, solo el Controlador ODBC

Creación de la Base de Datos

Una vez instalados los componentes de MySQL procederemos a crear nuestra base de datos, para eso vamos a: 
> Inicio 
>> Todos los programas
>>> MySQL
>>>> My SQL Administrator.

Iniciamos sesión usando los datos de usuario que debimos crear en la instalación del MySQL:


Ventana Principal de MySQL Administrator:



Para quienes no tienen experiencia en MySQL, podríamos decir que la palabra "Schema" es sinonimo de "Base de Datos"

Creación del "Schema"
Primero, damos un nombre al "schema" (que de ahora en adelante seguire llamando Base de Datos)


Pasaremos muy rápido por esto, hacemos clic en la nueva base de datos, luego en "Create Table", le damos un nombre y creamos los campos, asi: 


Con esto finalizamos la creación de la base de datos, en esta parte podran crear cuantas tablas y campos necesiten para poner a funcionar sus creaciones en VB.Net.




Configuración del Origen de Datos
Ahora debemos crear un origen de datos, este origen de datos sera el encargado de comunicar el computador "Cliente" con el computador "Servidor" que sera donde se almacenen todos los datos que insertemos o modifiquemos, es decir, nuestra base de datos.



Este origen de datos sera a la vez el punto de conexion que usara nuestro programa en Vb.Net, dicho mas claro seria asi:

VB.Net ---> Conector MySQL ODBC ---> Servidor MySQL
o
Servidor MySQL ---> Conector MySQL ODBC ---> VB.Net

Crear Origen de Datos
El origen de datos se debe crear en el computador donde se ejecutara nuestro programa de VB.Net (Cliente)
Sigamos la siguiente ruta (Para Windows 7):
>Inicio
>>Panel de Control
>>>Sistemas y seguridad
>>>>Herramientas Administrativas
>>>>>Origenes de Datos ODBC

Una vez estemos en el Administrador de origenes de datos ODBC, haremos clic en la pestaña "DNS de Sistema" y luego en el boton "Agregar..."


Windows nos mostrara los conectores ODBC que esten instalados en el computador:


Seleccionamos el Controlador MySQL ODBC Driver y clic en "Finalizar"

Ahora configuraremos el Origen de Datos asi:


Data Source Name: Es el Nombre del Origen de Datos, usando este nombre conectaremos nuestro programa desarrollado en Vb.Net con el Origen. 

TCP/IP Server: Es la dirección IP del servidor, si usan el mismo equipo como Cliente y Servidor a la vez colocamos "localhost", si se tiene conexión con un servidor colocamos allí su IP

User: Es el nombre de usuario que se creo al instalar el servidor de MySQL, por defecto es "root"

Password: Es la clave que se le asigno al "root" durante la instalacion del servidor MySQL, si no asignaron una contraseña deben dejar el campo en blanco. 

Database: Es el nombre del "Schema" o de la base de datos que previamente creamos en el servidor. Esta debe elegirse de la lista desplegable. 

Para verificar que el controlador se comunica con el servidor hacemos clic en el boton "Test" y nos mostrara un mensaje indicándonos si hubo éxito en la conexión o no. 

Creación de la Clase Conexión

Bueno, por fin, despues de tanto configurar vamos a programar, creamos nuestro nuevo proyecto en VB.Net (Recuerden que los codigos y ejemplos que ire publicando han sido creados en la version 2010 de Visual Studio)

Una vez estemos en nuestro nuevo proyecto, agregaremos un modulo asi:
> Menu "Proyecto"
>> Agregar Modulo...



Le pondremos como nombre Conexion.vb y este sera el código que pondremos allí (lo iré explicando por partes):

Declaraciones:

Public Reader As Odbc.OdbcDataReader
Public Conec As New Data.Odbc.OdbcConnection
Public comando As New Odbc.OdbcCommand
Dim uid As String, pwd As String

Reader: Este objeto "leera" los datos de una consulta a la base de datos
Conec: Este objeto sera la encargada de crear un conexion con la base de datos
comando: Este objeto ejecutara las peticiones SQL que escribamos
uid: Esta variable la usaremos para almacenar el nombre de usuario del servidor MySQL, que por lo general es "root"
pwd: Esta variable almacenara el password del servidor MySQL

Función Conectar:
Sub Conectar(ByVal uid As String, ByVal pwd As String)
        Try
            If Conec.State = ConnectionState.Closed Then
                Conec.ConnectionString = "DSN=factusis2;Uid=" & uid & ";pwd=" & pwd & ";"
                Conec.Open()
            End If
        Catch ex As Exception
            MsgBox("No es posible conectarse a la base de datos", MsgBoxStyle.Critical, "Error")
        End Try
End Sub

En este procedimiento usaremos una estructura Try...Catch para validar la conexión entre nuestro programa y la base de datos ODBC, si la conexion se logra se procedera a abrir la misma, de lo contrario se notificara al usuario que no ha sido posible dicha conexión.

Procedimiento New
Sub New()

End Sub

Sub New(ByVal Usuario As String, ByVal Pass As String)
        Conectar(Usuario, Pass)
End Sub

Primero, creamos la función New vacía para que se cree el Constructor, y luego si le damos la instrucción requerida, en este caso le estamos diciendo que ejecute la función Conectar, y le estamos dando los parámetros que esta requiere: El usuario y la contraseña.

Procedimiento DDL

Sub DDL(ByVal Peticion As String)
        Try
            If Not Conec.State = ConnectionState.Open Then
                Conec.Open()
            End If
            Dim Comando As New Odbc.OdbcCommand(Peticion, Conec)
            Comando.ExecuteNonQuery()
            Conec.Close()
            MsgBox("Proceso realizado con exito.")
        Catch ex As Exception
            Conec.Close()            
            MsgBox(ex.Message, vbCritical, "Error")
        End Try
End Sub

Este procedimiento sera el encargado de ejecutar las instrucciones SQL de nuestro programa. Al mismo tiempo, este procedimiento nos permitirá saber y a la vez informar al usuario de la aplicación, si la orden ejecutada (guardar, eliminar, actualizar, etc) fue realizada con éxito o no. Cuando la orden no puede ejecutarse, ya sea por errores en la sintaxis, errores en la base de datos o errores de conexion, se mostrara un mensaje con el error especifico.

Función Consulta
Function Consulta(ByVal Peticion As String) As Odbc.OdbcDataReader
        Try
            If Not Conec.State = ConnectionState.Open Then
                Conec.Open()
            End If

            Dim Comando As New Odbc.OdbcCommand(Peticion, Conec)
            Comando.ExecuteNonQuery()
            Reader = Comando.ExecuteReader
            Return Reader
        Catch ex As Exception
            Conec.Close()
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
            Return Nothing
        End Try
End Function

Esta función, como su nombre ya lo dice, sera la encargada de ejecutar los comandos de consulta SQL de nuestra aplicación.

Variables Globales
Para que podamos usar la clase Conexion.vb explicada en el tutorial anterior, es necesario definir unas variables de ambito global, para esto agregaremos otro modulo al proyecto, y declararemos dentro de este lo siguiente:
Public Conec As New Conexion("root", "clave123")
Public Peticion As String
Public Buscar As Odbc.OdbcDataReader

A través del objeto Conec crearemos una nueva conexion con el origen de datos a la vez que le pasamos los parámetros que esta requiere, el usuario del servidor MySQL y su respectiva contraseña.

La variable Peticion o en muchos otros tutoriales denominada "query" sera la cadena de texto en donde escribiremos las instrucciones SQL; esta instrucción sera ejecuta con el objeto Conec y DDL

Y por ultimo el objeto Buscar, se encargara de buscar y almacenar los datos obtenidos en las consultas.


Operaciones Básicas con la Base de Datos
Supongamos que tenemos una base de datos ya creada, con un tabla llamada "tabla" y con los siguientes campos y caracteristicas:

n             -  integer          -     autoincrement
nombre   -  varchar(45)
direccion -  varchar(45)
telefono   -  varchar(45)


Para facilitar la comprensión y puesta en practica de este tutorial, les recomiendo diseñar un formulario con estas características y usar los nombres sugeridos para los controles:

Los tipos de controles presentados en la imagen son:


TextBox: txBusqueda, txNombre, txDireccion, txTelefono 
Button: btGuardar, btActual, btEliminar, btNuevo
ListBox: ltListado

Bien, lo primero sera programar el evento Form_Load, lo que queremos aquí es que cada vez que el formulario cargue, muestre en el ListBox los nombres de los registros existentes.

En el evento Load del Formulario:
ltListado.Items.Clear()
        Try
            Peticion = "select * from tabla"
            Buscar = Conec.Consulta(Peticion)
            While Buscar.Read
                ltListado.Items.Add(Buscar.GetValue(1).ToString)
            End While
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

Analicemos el código linea a linea:
Usamos una estructura Try...Catch para controlar los errores que puedan producirce, luego asignamos a la variable Buscar el resultado de ejecutar la consulta escrita en la variable Peticion usando el objeto Conec.
Abrimos un ciclo repetitivo While que tendrá tantas interaciones como resultados se consigan en la consulta, es decir, si la consulta devuelve 10 registros, el ciclo se hará 10 veces.  Dentro de este ciclo vamos a ir adicionando los resultados al listbox, pero, aquí notaran algo raro, que no vemos el nombre del campo que queremos mostrar, y es porque para obtener un valor especifico de una consulta, usaremos el indice del campo, para nuestro ejemplo seria así:
n = 0
nombre = 1
direccion = 2
telefono = 3

Entonces, "Buscar.GetValue(indice).ToString" sera la estructura que usaremos para obtener el valor de un campo cualquiera en una consulta.

Insertar Datos
El siguiente, seria el código para guardar en la base de datos los valores escritos en los textboxes:
'VALIDAR NOMBRE
        Peticion = "select * from tinv where nom='" & txNomBRE.Text & "'"
        Buscar = Conec.Consulta(Peticion)
        While Buscar.Read
            MsgBox ("Ya existe un registro con el nombre" & txNombre.Text)
            Exit Sub
        End While
'INSERTAR DATOS
        Peticion = "insert into tabla values(null, '" & txNombre.Text & "','" & txDireccion.Text & "','" & txTelefono.Text & "')"
        Conec.DDL(Peticion)

Veamos esto paso a paso; Primero hago una consulta, para evitar guardar 2 veces un registro con un mismo nombre (para efectos prácticos no se usaría el nombre de una persona como Clave de una tabla) Si la consulta encuentra algún registro con el nombre que intentamos guardar, nos avisara mediante un mesaje y se interrumpira el procedimiento, de lo contrario, procedemos a insertar los datos en la tabla.

Importante: Los datos deben insertarse en el mismo orden en que se encuentran los campos en la tabla, como el primer campo de nuestra tabla ejemplo (campo "n") es un AutoIncrement no asignamos un valor como tal, sino que "nos saltamos" su asignacion usando la palabra "Null", luego, siguiendo el orden de la tabla insertamos: Nombre, Direccion y Telefono y ejecutamos la instruccion en Conec.DDL(Peticion)

Consulta de Registros
Para realizar consultas usaremos los datos (nombres) que contenga el listbox del ejemplo, es decir, que el usuario con solo hacer un clic en un nombre, se cargaran los datos correspondientes a ese nombre en los textboxes; mas adelante usaremos otro método de búsqueda para filtrar los resultados o datos cargados en el listbox.
Vamos al evento Click del ListBox y:
Peticion = "select * from tabla where nombre='" & ltListado.Text & "'"
Buscar = Conec.Consulta(Peticion)        
        While Buscar.Read            
            txNombre.Text = Buscar.GetValue(1).ToString
            txDireccion.Text = Buscar.GetValue(2).ToString
            txTelefono.Text = Buscar.GetValue(3).ToString
        End While  

Actualizacion o Edicion de Registros
Para editar, previamente debemos realizar una consulta. Con esta sencilla instrucción cambiamos los datos del registro activo por los asignados en los respectivos controles:
Peticion = "update tabla set direccion='" & txDireccion.Text & "',telefono='" & txTelefono.Text & "' where nombre='" & txNombre.Text & "'"
Conec.DDL(Peticion)
Simplemente hacemos una asignación campo a campo, algo a destacar de esta instruccion es que no estamos obligados a actualizar o editar todos los campos, sino unicamente los que deseemos.

Eliminar un Registro
Al igual que para editar, es necesario hacer una consulta antes de eliminar un registro, el código seria así:
If (MsgBox("¿Realmente desea borrar este registro?", vbYesNo + vbQuestion, "Advertencia") = vbYes) Then
            Peticion = "delete from tabla where nombre='" & txNombre.Text & "'"
            Conec.DDL(Peticion)
End If

Usamos un MsgBox de Si/No para que el usuario confirme si realmente desea eliminar el registro, si la respuesta es "Si" se ejecutaran las respectivas instrucciones SQL

Nuevo Registro
En MySQL o mas espeficicamente para estos usos del MySQL no es necesario crear un nuevo registro en blanco antes de insertar datos (en otros tipos de enlace a datos como DataBindings o DataTableAdapter si es necesario) Por esta razon, en el boton "Nuevo" simplemente colocaremos instrucciones para "dejar en blanco" el formulario estableciendo las propiedades Text de los controles a =""







1 comentario:

  1. Sabes tengo algunos problemas con partes del código me encantaría si me puedes ayudar un poco

    ResponderEliminar