Os explicamos paso a paso como acceder a MySQL con Visual Basic .Net, utilizando el driver MyODBC de MySQL. Este ejemplo Open Source es aplicable para acceso a cualquier motor de base de datos (Oracle, SQL Server, MySQL, etc.) mediante ODBC y Visual Basic .Net. Incluimos el código fuente gratuito de la aplicación AjpdSoft Conexión BD Visual Basic .Net.
- Descarga e instalación de driver ODBC para MySQL.
- Proyecto Visual Studio .Net para acceso a MySQL mediante ODBC.
- Descarga de la aplicación de ejemplo en Visual Basic .Net de Visual Studio .Net.
- Anexo.
Descarga e instalación de driver ODBC para MySQL
En primer lugar descargaremos el driver ODBC de la web http://www.mysql.com/products/connector. Seguidamente lo instalaremos en el equipo o equipos que se conectarán a MySQL: descomprimiremos el fichero mysql-connector-odbc-3.51.16-win32.zip y ejecutaremos setup.exe:
Pulsaremos «Next» para continuar:
Marcaremos «Custom» y pulsaremos «Next» para continuar:
Se instalará «MySQL Connector/ODBC», «MySQL Connector/ODBC Help» y «Utilities», pulsaremos «Next» para continuar:
Pulsaremos «Install» para iniciar la instalación del driver ODBC de MySQL:
Para comprobar que se ha instalado correctamente el driver MyODBC, podremos crearnos uno de ejemplo, desde «Inicio» – «Configuración» – «Panel de control» – «Herramientas administrativas» – «Orígenes de datos ODBC». En la pestaña «DSN de sistema» (si queremos que esté disponible para todos los usuarios del equipo) ó «DSN de usuario» (para que sólo esté disponible para el usuario actual con el que hemos iniciado sesión), pulsaremos en «Agregar»:
Seleccionaremos el origen de datos «MySQL ODBC 3.51 Driver» (o el correspondiente a la versión de MySQL ODBC de que dispongamos), pulsaremos «Finalizar»:
Rellenaremos los datos correspondientes en la pestaña «Login»:
Data Source Name: conexion_vb
Description: Conexión BD Visual Basic .Net
Server: localhost
User: root
Password: contraseña del usuario con el que nos conectaremos
Database: test
Una vez rellenados los datos anteriores pulsaremos «Test» para comprobar que la conexión funciona correctamente:
Si no ha habido problemas mostrará una ventana como esta:
Con el texto: Success; connection was made!
Proyecto Visual Studio .Net para acceso a MySQL mediante ODBC
Tras instalar el driver MyODBC correspondiente (o cualquier otro de cualquier motor de base de datos: Oracle SQL Server, Access, DB2, Informix, etc), abriremos Microsoft Visual Studio, seleccionaremos el menú «Archivo» – «Nuevo proyecto…»:
Nota: si eres usuario registrado (puedes hacerlo gratuitamente aquí) podrás descargar el código fuente completo (Source Code – Open Source) de la aplicación: AjpdSoft Conexión BD Visual Basic .Net.
En «Tipos de proyecto» seleccionaremos «Visual Basic» – «Windows», en «Plantillas» seleccionaremos «Aplicación para Windows»:. En «Nombre» introduciremos el nombre del proyecto, en nuestro caso «AjpdSoft Conexión BD Visual Basic .Net». Pulsaremos «Aceptar» para continuar:
El asistente de creación de nuevo proyecto Visual Studio (Visual Basic) nos creará un proyecto con la siguiente estructura: El proyecto en si (My Project), un diagrama de clase (ClassDiagram1.cd) y un formulario (Form1.vb). Con los siguientes ficheros:
AjpdSoft Conexión BD Visual Basic .Net.vbproj,
ClassDiagram1.cd,
Form1.Designer.vb,
Form1.resx,
Form1.vb.
En nuestro caso hemos decidido cambiar el nombre al fichero del formulario, para ello, desde la ventana de «Explorador de soluciones», pulsamos con el botón derecho del ratón sobre Form1.vb y seleccionamos «Cambiar nombre»:
Pondremos el nombre que queramos dar al fichero del formulario y pulsaremos INTRO:
También cambiaremos el nombre al objeto Formulario, para ello seleccionaremos el formulario en si (el que aparece a la izquierda y en la ventana de «Propiedades», nos situamos en la propiedad «Name» e introducimos en nombre que queramos darle al formulario:
Desde el IDE de desarrollo de Visual Studio .Net, con nuestro formulario abierto, pulsaremos en el menú «Ver» – «Código» (o la tecla F7):
En el código del formulario, antes de la declaración «Public Class…» colocaremos el siguiente código:
Imports System.Data
Imports System.Data.Odbc
Nota: el espacio de nombres System.Data.Odbc es el proveedor de datos de .NET Framework para ODBC. Digamos que es la «librería» donde se encuentran las funciones y procedimientos necesarios para acceso a base de datos mediante ODBC. Por ello es necesario importarlo antes de empezar a trabajar con nuestro proyecto.
A continuación iremos añadiendo los controles necesarios para realizar nuestra aplicación, desde la ventana de «Cuadro de herramientas»:
Añadiremos GroupBox, ComboBox, TextBox, Button, etc. El formulario quedará de la siguiente manera:
Las propiedades que hemos cambiado en los controles han sido las siguientes:
- txtMotor (ComboBox del GroupBox «Datos de conexión»):
- DropDownStyle = DropDownList (para que el usuario sólo pueda seleccionar elementos existentes de la lista).
- Sorted = True (para que los elementos aparezcan ordenados).
- Items = Hemos añadido los siguientes elementos: Estándar,
Microsoft Access, MySQL, Oracle, SQL Server.
- txtSQL (TextBox que aparece en el GroupBox «SQL a ejcutar»):
- Multiline = True (para que el usuario pueda escribir varias líneas de SQL).
- ScrolBars = Vertical (para que aparezcan las barras de desplazamiento verticales).
- lInfo ( Label que aparece en el GroupBox «Datos de conexión»):
- Autosize = False (para establecer un tamaño fijo).
- BorderStyle = FixedSingle (para que aparezca un recuadro en el Label).
- bDesconectar (Button que aparece en el GroupBox «Datos de conexión»):
- Enabled = False (sólo se activará el botón cuando se establezca conexión con la Base de Datos).
El resto de los componentes visuales tendrán las propiedades estándar (por defecto), salvo la propiedad «Name» que, lógicamente, la hemos cambiado en los que utilizaremos para el código fuente.
Como se puede observar la ventana se divide en tres partes:
- Datos de conexión: con el motor, el nombre del origen de datos, el usuario y la contraseña, un botón para conectar con la base de datos y otro para desconectar. Y el Label que indica el estado de la conexión.
- SQL a ejecutar: sentencia SQL que introducirá el usuario y que será ejecutada, con el SQL, y tres botones para ejecutar el SQL, abrir un fichero con alguna sentencia SQL previamente guardada y guardar la sentencia SQL actual en un fichero.
- El cuadro de texto donde se mostrará el resultado de la ejecución de la consulta SQL.
En la parte de «Datos de conexión», en el botón «Conectar», colocaremos el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
Private Sub bConectar_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles bConectar.Click Try If (txtMotor.Text = "Estándar") Then conexionBD = New OdbcConnection("dsn=" & _ txtODBC.Text & ";uid=" & _ txtUsuario.Text & ";pwd=" & _ txtContrasena.Text & ";") End If If (txtMotor.Text = "Microsoft Access") Then conexionBD = New OdbcConnection("dsn=" & _ txtODBC.Text & ";uid=" & _ txtUsuario.Text & ";pwd=" & _ txtContrasena.Text & ";") End If If (txtMotor.Text = "MySQL") Then conexionBD = New OdbcConnection("dsn=" & _ txtODBC.Text & ";uid=" & _ txtUsuario.Text & ";pwd=" & _ txtContrasena.Text & ";") End If If (txtMotor.Text = "Oracle") Then conexionBD = New OdbcConnection("dsn=" & _ txtODBC.Text & ";uid=" & _ txtUsuario.Text & ";pwd=" & _ txtContrasena.Text & ";") End If If (txtMotor.Text = "Sql Server") Then conexionBD = New OdbcConnection("dsn=" & _ txtODBC.Text & ";uid=" & _ txtUsuario.Text & ";pwd=" & _ txtContrasena.Text & ";") End If conexionBD.Open() lInfo.Text = "Conectado correctamente" bDesconectar.Enabled = True Catch ex As OdbcException lInfo.Text = "Error en la conexión" bDesconectar.Enabled = False MsgBox(ex.Message) End Try End Sub |
En este ejemplo no hemos distinguido la cadena de conexión «conexionBD» según el tipo de motor de BD que haya seleccionado el usuario, pues estamos realizando un ejemplo para conexión con MySQL. Para el resto de motores, puede que requieran una cadena de conexión diferente. En principio, las pruebas realizadas demuestran que la conexión estándar (la utilizada en esta aplicación) es suficiente para conectar con Oracle, SQL Server y MySQL.
Declararemos, dentro de «Public Class formMenuPrincipal» la clase «OdbcConnection», de la siguiente forma:
Quedará dentro de «Public Class formMenuPrincipal»:
Public conexionBD As OdbcConnection
De esta forma el objeto conexión será válida (utilizable) para todo el formulario. En nuestro caso hemos utilizado la clase «OdbcConnection» para realizar la conexión con la base de datos. Si el motor de base de datos fuese Microsfot SQL Server podríamos haber utilizado «sqlConnection», para Oracle «oracleConnection».
En el botón «Desconectar» colocaremos el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 |
Private Sub bDesconectar_Click(ByVal sender _ As System.Object, ByVal e As System.EventArgs) _ Handles bDesconectar.Click Try conexionBD.Close() lInfo.Text = "Desconectado correctamente" Catch ex As OdbcException 'silenciosa lInfo.Text = "Desconectado correctamente" End Try End Sub |
De esta forma, si el usuario ha pulsado el botón «Conectar», se desconectará la conexión a la base de datos, en caso contrario, este código daría error porque no se ha creado el objeto «conexionBD». Por ello la propiedad «Enabled» del botón «Desconectar» está a «False», sólo se cambia a «True» en el botón «Conectar», si la conexión se ha establecido correctamente.
En el botón «Guardar» colocaremos el siguiente código Visual Basic .Net:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Private Sub bGuardar_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles bGuardar.Click Dim dlAbrir As New _ System.Windows.Forms.SaveFileDialog dlAbrir.Filter = "Archivos de Texto (*.txt)|*.txt|" & _ "Archivos de SQL (*.sql)|*.sql|" & _ "Todos los archivos (*.*)|*.*" dlAbrir.CheckFileExists = False dlAbrir.OverwritePrompt = True dlAbrir.Title = "Guardar SQL en fichero" dlAbrir.ShowDialog() If dlAbrir.FileName <> "" Then Dim fichero As New _ System.IO.StreamWriter(dlAbrir.FileName) fichero.WriteLine(txtSQL.Text) fichero.Close() End If End Sub |
En el botón «Cargar» colocaremos el siguiente código Visual Basic .Net:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Private Sub bCargar_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles bCargar.Click Dim dlAbrir As New _ System.Windows.Forms.OpenFileDialog dlAbrir.Filter = "Archivos de Texto (*.txt)|*.txt|" & _ "Archivos de SQL (*.sql)|*.sql|" & _ "Todos los archivos (*.*)|*.*" dlAbrir.CheckFileExists = False dlAbrir.Multiselect = False dlAbrir.Title = "Abrir fichero SQL" dlAbrir.ShowDialog() If dlAbrir.FileName <> "" Then Dim fichero As New _ System.IO.StreamReader(dlAbrir.FileName) txtSQL.Text = fichero.ReadToEnd() fichero.Close() End If End Sub |
En el botón «Ejecutar» colocaremos el siguiente código Visual Basic .Net:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Private Sub bEjecutar_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles bEjecutar.Click Try Dim sql As String = txtSQL.Text Dim comandoSQL As OdbcCommand = _ New OdbcCommand(sql, conexionBD) Dim resultadoSQL As OdbcDataReader = _ comandoSQL.ExecuteReader() Dim i As Integer txtResultado.Clear() 'Ponemos una fila con el nombre de los campos For i = 0 To resultadoSQL.FieldCount - 1 If txtResultado.Text <> "" Then txtResultado.Text = txtResultado.Text & _ Chr(9) & resultadoSQL.GetName(i) Else txtResultado.Text = resultadoSQL.GetName(i) End If Next i While resultadoSQL.Read txtResultado.Text = txtResultado.Text & _ Chr(13) & Chr(10) For i = 0 To resultadoSQL.FieldCount - 1 If i = 0 Then txtResultado.Text = txtResultado.Text & _ resultadoSQL(i).ToString Else txtResultado.Text = txtResultado.Text & _ Chr(9) & resultadoSQL(i).ToString End If Next i End While Catch ex As OdbcException MsgBox(ex.Message) End Try End Sub |
Para este procedimiento, que ejecuta la consulta SQL introducida por el usuario y muestra el resultado con los valores de todos los campos separados por tabulador, hemos utilizando un «OdbcDataReader
«: proporciona el modo de lectura de una secuencia de filas de datos de tipo sólo avance de un origen de datos.
En el botón «Guardar Resultado SQL» colocaremos el siguiente código Visual Basic .Net:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Private Sub bGuardarResultado_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles bGuardarResultado.Click Dim dlAbrir As New _ System.Windows.Forms.SaveFileDialog dlAbrir.Filter = "Archivos de texto (*.txt)|*.txt|" & _ "Todos los archivos (*.*)|*.*" dlAbrir.CheckFileExists = False dlAbrir.OverwritePrompt = True dlAbrir.Title = "Guardar resultado ejecución SQL" dlAbrir.ShowDialog() If dlAbrir.FileName <> "" Then Dim fichero As New _ System.IO.StreamWriter(dlAbrir.FileName) fichero.WriteLine(txtResultado.Text) fichero.Close() End If End Sub |
En el botón «Seleccionar todo» colocaremos el siguiente código Visual Basic .Net:
1 2 3 4 5 |
Private Sub bSeleccionarTodo_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles bSeleccionarTodo.Click txtResultado.SelectAll() End Sub |
En el botón «Copiar» colocaremos el siguiente código Visual Basic .Net:
1 2 3 4 5 |
Private Sub bCopiar_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles bCopiar.Click txtResultado.Copy() End Sub |
Descarga de la aplicación de ejemplo en Visual Basic .Net de Visual Studio .Net
A continuación mostramos el enlace para la descarga del proyecto completo de ejemplo usado en este artículo:
ANEXO
Para desarrollar esta aplicación hemos utilizado:
- Microsoft Visual Studio .Net 2005.
- MyODBC 3.51.
- MySQL Server 4.1.
- Microsoft Windows XP SP2.
- AjpdSoft Conexión BD Visual Basic .Net
Para acceso a datos de sólo lectura (consulta de datos) hemos utilizado «OdbcDataReader», si quisiéramos obtener un resultado modificable podremos utilizar «OdbcDataAdapter».
El código fuente completo del formulario principal de la aplicación en Visual Basic .Net:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
Imports System.Data Imports System.Data.Odbc Imports System Imports System.IO Public Class formMenuPrincipal Public conexionBD As OdbcConnection Private Sub bConectar_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles bConectar.Click Try If (txtMotor.Text = "Estándar") Then conexionBD = New OdbcConnection("dsn=" & _ txtODBC.Text & ";uid=" & _ txtUsuario.Text & ";pwd=" & _ txtContrasena.Text & ";") End If If (txtMotor.Text = "Microsoft Access") Then conexionBD = New OdbcConnection("dsn=" & _ txtODBC.Text & ";uid=" & _ txtUsuario.Text & ";pwd=" & _ txtContrasena.Text & ";") End If If (txtMotor.Text = "MySQL") Or (txtMotor.Text = "") Then conexionBD = New OdbcConnection("dsn=" & _ txtODBC.Text & ";uid=" & _ txtUsuario.Text & ";pwd=" & _ txtContrasena.Text & ";") End If If (txtMotor.Text = "Oracle") Then conexionBD = New OdbcConnection("dsn=" & _ txtODBC.Text & ";uid=" & _ txtUsuario.Text & ";pwd=" & _ txtContrasena.Text & ";") End If If (txtMotor.Text = "Sql Server") Then conexionBD = New OdbcConnection("dsn=" & _ txtODBC.Text & ";uid=" & _ txtUsuario.Text & ";pwd=" & _ txtContrasena.Text & ";") End If conexionBD.Open() lInfo.Text = "Conectado correctamente" bDesconectar.Enabled = True bEjecutar.Enabled = True Catch ex As OdbcException lInfo.Text = "Error en la conexión" bDesconectar.Enabled = False bEjecutar.Enabled = False MsgBox(ex.Message) End Try End Sub Private Sub bDesconectar_Click(ByVal sender _ As System.Object, ByVal e As System.EventArgs) _ Handles bDesconectar.Click Try conexionBD.Close() lInfo.Text = "Desconectado correctamente" Catch ex As OdbcException 'silenciosa lInfo.Text = "Desconectado correctamente" End Try End Sub Private Sub bEjecutar_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles bEjecutar.Click Try Dim sql As String = txtSQL.Text Dim comandoSQL As OdbcCommand = _ New OdbcCommand(sql, conexionBD) Dim resultadoSQL As OdbcDataReader = _ comandoSQL.ExecuteReader() Dim i As Integer txtResultado.Clear() For i = 0 To resultadoSQL.FieldCount - 1 If txtResultado.Text <> "" Then txtResultado.Text = txtResultado.Text & _ Chr(9) & resultadoSQL.GetName(i) Else txtResultado.Text = resultadoSQL.GetName(i) End If Next i While resultadoSQL.Read txtResultado.Text = txtResultado.Text & _ Chr(13) & Chr(10) For i = 0 To resultadoSQL.FieldCount - 1 If i = 0 Then txtResultado.Text = txtResultado.Text & _ resultadoSQL(i).ToString Else txtResultado.Text = txtResultado.Text & _ Chr(9) & resultadoSQL(i).ToString End If Next i End While Catch ex As OdbcException MsgBox(ex.Message) End Try End Sub Private Sub bGuardar_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles bGuardar.Click Dim dlAbrir As New _ System.Windows.Forms.SaveFileDialog dlAbrir.Filter = "Archivos de Texto (*.txt)|*.txt|" & _ "Archivos de SQL (*.sql)|*.sql|" & _ "Todos los archivos (*.*)|*.*" dlAbrir.CheckFileExists = False dlAbrir.OverwritePrompt = True dlAbrir.Title = "Guardar SQL en fichero" dlAbrir.ShowDialog() If dlAbrir.FileName <> "" Then Dim fichero As New _ System.IO.StreamWriter(dlAbrir.FileName) fichero.WriteLine(txtSQL.Text) fichero.Close() End If End Sub Private Sub bCargar_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles bCargar.Click Dim dlAbrir As New _ System.Windows.Forms.OpenFileDialog dlAbrir.Filter = "Archivos de Texto (*.txt)|*.txt|" & _ "Archivos de SQL (*.sql)|*.sql|" & _ "Todos los archivos (*.*)|*.*" dlAbrir.CheckFileExists = False dlAbrir.Multiselect = False dlAbrir.Title = "Abrir fichero SQL" dlAbrir.ShowDialog() If dlAbrir.FileName <> "" Then Dim fichero As New _ System.IO.StreamReader(dlAbrir.FileName) txtSQL.Text = fichero.ReadLine fichero.Close() End If End Sub Private Sub bLimpiar_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles bLimpiar.Click txtResultado.Clear() End Sub Private Sub bCopiar_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles bCopiar.Click txtResultado.Copy() End Sub Private Sub bSeleccionarTodo_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles bSeleccionarTodo.Click txtResultado.SelectAll() End Sub Private Sub bGuardarResultado_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles bGuardarResultado.Click Dim dlAbrir As New _ System.Windows.Forms.SaveFileDialog dlAbrir.Filter = "Archivos de texto (*.txt)|*.txt|" & _ "Todos los archivos (*.*)|*.*" dlAbrir.CheckFileExists = False dlAbrir.OverwritePrompt = True dlAbrir.Title = "Guardar resultado ejecución SQL" dlAbrir.ShowDialog() If dlAbrir.FileName <> "" Then Dim fichero As New _ System.IO.StreamWriter(dlAbrir.FileName) fichero.WriteLine(txtResultado.Text) fichero.Close() End If End Sub End Class |