CONEXIONES A BASES DE DATOS
No cabe duda que uno de los mayores atractivos de Visual Basic .NET es su parte visual. Por parte de Microsoft se han cansado de decirnos que utilicemos esas herramientas pero lo cierto es que existe un gran numero de programadores que no son excesivamente amantes de los Wizard y prefieren trabajar con el código que dejar que los asistentes creen conexiones que en ocasiones tienen demasiados aspectos inútiles añadidos.
No obstante las herramientas visuales para crear conexiones con bases de datos en Visual Basic .NET existen y siempre es bueno saber cómo funcionan.
Podemos crear una conexión de bases de datos de forma visual de varias maneras, aunque llegaremos al mismo objetivo. Podríamos decir que son diferentes caminos para ir al mismo lugar.
Abriremos el cuadro de herramientas y seleccionaremos la pestaña Datos dentro de la pestaña podemos observar cuatro objetos conexión: OleDbConnection, SqlConnection, OdbcConnection y OracleConnection.
Para conectar con una base de datos SqlServer u Oracle usaremos los objetos conexión creados para ese cometido, para todas las demás bases usaremos los dos restantes.
Pincharemos sobre el objeto OleDbConnection y lo arrastraremos sobre el formulario donde lo soltaremos, podremos comprobar que se deposita debajo del formulario activo.
A continuación teniendo el objeto conexión seleccionado abriremos la ventana de propiedades y haremos clic sobre la propiedad ConnectionString, de nuevo haremos clic en la fecha que nos muestra y seleccionaremos Nueva conexión, al seleccionar esta opción se mostrara el cuadro de dialogo de Propiedades de vínculos de datos.
En primer lugar seleccionamos el proveedor de la conexión, en este caso Microsoft Jet 4.0 OLE DB Provider ya que vamos a conectar con una base de datos Access.
Pulsaremos el botón Siguiente y pasaremos al apartado Conexión donde buscaremos y seleccionaremos la base de datos Access. Una vez seleccionada y aceptada la base de datos la conexión ya estará terminada, podremos entonces comprobar que se han producido ciertas modificaciones:
- La propiedad ConnectionString del objeto conexión está completa, antes estaba en blanco.
- Si abrimos el explorador de servidores (Ctrl+Alt+S) veremos que se ha creado una nueva conexión a la base de datos de Access que hemos seleccionado.
MYSQL
Siempre que sea posible, en Visual Basic .NET hay que evitar utilizar conexiones ODBC y utilizar en su lugar conexiones vía OLEDB. La conexión ODBC siempre irá más lenta debido a que se crea una capa mas entre la aplicación y la base de datos, pero también es cierto que no existen conexiones OLEDB para todas las bases de datos. Veamos un ejemplo de conexión, con ODBC, desde Visual Basic .NET y una base de datos MySql.
Antes de comenzar a trabajar debemos preparar nuestra maquina
. En primer lugar descargaremos de la Web el driver necesario para la conexión, en este caso precisamos MyODBC-standard-3.51.9-win y procederemos a su instalación haciendo doble clic en el programa de instalación.
Después de la primera pantalla solo tenemos que aceptar los valores que indica y pulsar en siguiente y el driver se instalara sin problemas.
Se debe tener presente que para que este ejemplo funcione debemos tener instalado el gestor de base de datos MySql./p> Una vez instalado el driver MyODBC iremos al panel de control y seleccionaremos el icono de herramientas administrativas. Dentro de esta carpeta encontraremos un enlace a Origen de datos (ODBC) sobre el que haremos doble clic. Pulsaremos sobre la pestaña DNS de sistema y pulsaremos el botón Agregar.
Seleccionaremos el driver que nos interesa como podemos ver en la imagen, y pulsaremos el botón de Finalizar./p>
Al pulsar Finalizar se mostrará el formulario que aparece en la siguiente imagen.
En este formulario deberemos llenar los cuadros de texto. En:
- Data Source Name: Pondremos el nombre que le queremos dar a esta conexión, a este DSN. P.e: Conexión Libros.
- Database Name: Cambiaremos test por el nombre de nuestra base de datos. P.e: Libros.
- Podemos pulsar sobre el botón Test Data Source para comprobar que la conexión es correcta.
- Una vez hecho esto ya podemos pulsar sobre el botón OK para aceptar el nuevo DSN y cerrar el cuadro de diálogo.
A partir de este momento ya podemos trabajar con esta conexión. Abriremos un nuevo proyecto Windows y añadiremos un módulo al que dejaremos el nombre por defecto Module1y en el que incluiremos el siguiente código.
- Module Module1
- Public Conexion As System.Data.odbc.OdbcConnection ‘ variable publica que utilizaremos como ón única
- Sub Main()
- Try
- Conexion = New System.Data.odbc.OdbcConnection(”STMT=;OPTION=3;DSN=Conexion Libros;UID=;SOCKET=;DESC=MySQL ODBC 3.51 Driver DSN;DATABASE=Libros;SERVER=ITESS;PORT=3306″)
- ‘Lo que hemos marcado en rojo es nuestra cadena de conexión. En ella podemos apreciar la
- ‘DSN=Conexión Libros que es el DSN que hemos creado y DATABASE=Libros que el nombre de nuestra base de datos
- ‘Abrimos la conexión para comprobar que funciona
- Conexion.Open ()
- cerramos la conexión
- Conexion.Close()
- ’si se produce algún error al abrir o cerrar la ón saltara al apartado del Casth
- ‘Si todo va bien se mostrara el mensaje que confirma la conexión.
- MsgBox(”Conexion con Base de Datos realizada”)
- Catch e As Exception
- MsgBox(e.ToString, MsgBoxStyle.Critical, “Information del Sistema”)
- End Try
- End Sub
- End Module
A partir de este punto podremos llamar a la conexión siempre que queramos en cualquier formulario de nuestro proyecto.
Una vez realizada la conexión con la base de datos la utilizaremos para comunicarnos y trabajar con esa base de datos. Podemos realizar cuatro tipos de operaciones diferentes: Consultar, Modificar, Insertar y Eliminar datos. Las consultas a una base de datos son básicamente todas iguales solo varia el volumen de la respuesta. Ante una consulta así:
- Dim Sql as String
- Sql="Select Nombre From Clientes"
Es de esperar que el volumen de la respuesta sea bastante grande, es decir que la base de datos devuelva muchos registros. En cambio ante una consulta así:
- Dim Sql as Strip Sql="Select Nombre From Clientes Where IdCliente=1"
Solo obtendremos un registro como respuesta, el nombre del cliente 1. Por lo tanto la forma de tratar ambas consultas la haremos de forma diferente para sacarle algo más de partido a las opciones que nos da Visual Basic.
Veremos en primer lugar el segundo escenario, donde la base de datos nos devolverá un solo registro. Dado que este tipo de consulta se puede repetir mucho dentro de un proyecto podrÃímos crear una Clase que nos sirviera para siempre y en cualquier tipo de proyecto. Se podría incluir dentro de una dll o sencillamente copiar y pegar en otro proyecto.
Para desarrollar esta pequeña clase emplearemos diversos objetos, que pasamos a explicar:
- OleDbCommand: La conexión que usamos en este ejemplo es una conexión via OleDb, por eso usamos este objeto. Si fuera una conexión ODBC utilizaríamos OdbcCommand y si fuera una conexión Sql usaríamos SqlCommand. El objeto OleDbCommand es el comando que nos permitirá pasar a la base de datos una sentencia SQL.
- OleDbCommand tiene una serie de métodos que ejecutan comandos en la base de datos, el que en este momento nos interesa es ExecuteScalar ya que es especialmente adecuado para una consulta que devuelve una única línea.
Nuestra pequeña clase quedará de esta manera:
- Public Class CBuscarValor ’es el nombre de la clase
- Public Shared Sub BuscarValor(ByVal Sql As String, ByVal Variable As TextBox)
- ’es el procedimiento compartido que utilizaremos para encontrar el valor que buscamos.
- ’a este procedimiento le pasamos dos parámetros. La correspondiente sentencia SQL y un
- ’objeto textbox donde recogeremos la respuesta del procedimiento. De la misma manera podríamos
- ’pasarle una variable si eso nos interesa mas.
- ’nos aseguramos que el textbox esta vacio
- Variable.Text = ""
- ’abrimos el gestor de errores.
- Try
- ’abrimos la conexión
- Conexion.Open()
- ’creamos el comando al que pasamos la sentencia SQL y le indicamos que conexión debe utilizar
- ’conexión que como vimos en el artículo Visual Basic: Conexión con bases de datos (2) hemos creado en un modulo aparte.
- ’Al final de la explicación mostraremos otra vez el código para que lo tengais más cómodo.
- Dim Olecmd As OleDbCommand = New OleDbCommand(Sql, Conexion)
- ’ejecutamos el comando en la base de datos y comprobamos que nos devuelve
- ’si devuelve un valor nulo no devolvemos nada
- If IsDBNull(Olecmd.ExecuteScalar()) Then
- Variable.Text = ""
- Else
- ’si devuelve un valor se lo pasamos al textbox
- Variable.Text = Olecmd.ExecuteScalar()
- End If
- Catch err As Exception
- ’en caso de error mostramos que ha sucedido
- MsgBox(err.ToString, MsgBoxStyle.Critical, "Información del Sistema")
- Finally
- ’y pase lo que pase cerramos la conexión
- Conexion.Close()
- End Try
- End Sub
- End Class
Veamos como funcionaria todo esto en un proyecto real. Abrimos un nuevo proyecto de Windows, con un solo formulario cuyo diseño será el siguiente:
Haremos doble clic en el botón y escribiremos el siguiente código:
- Imports System.Data.OleDb ’importamos el espacio con nombres
- Private Sub cmdAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAceptar.Click
- ’creo una cadena de conexión con la constante strProv que está en el module1 a la que concateno
- ’con & la dirección completa de la BD que voy a utilizar
- Conexion.ConnectionString = strProv % "Data Source=C:Pruebas.mdb"
- ’creo la sentencia SQL del valor que quiere recuperar.
- ’quiere el nombre del cliente numero 15 de mi tabla de clientes.
- Dim Sql As String
- Sql = "Select Cliente From Clientes Where IdCliente=" & 15
- ’ahora utilizamos nuestra clase. No es preciso crear una nueva instancia de clase
- ’del tipo: Dim Valor as New CBuscarValor, porque el procedimiento que contiene es
- ’publico y Shared por lo tanto podemos acceder a el directamente.
- CBuscarValor.BuscarValor(Sql, txtPrueba)
- ’Al pulsar el botón del formulario nos mostrara el nombre del cliente solicitado.
- End Sub
- End Class
El código del modulo donde esta la conexión es:
- Imports System.Data.OleDb ’importamos el espacio con nombres
- Module Module1
- Public Conexion As New System.Data.OleDb.OleDbConnection
- Public Const strProv = "Provider=Microsoft.Jet.OLEDB.4.0"
- End Module