.NET Tutorial 23. Base de datos (Parte II). Access, SQL Server y MySQL: Ejemplo práctico

Sabida la teoría es hora de pasar a la práctica. Atención, que vienen curvas!!! 😉

Hoy veremos como realizar una aplicación que podrá manejar ya bien sea una base de datos de Microsoft Access, conectarse con un SQL Server o incluso conectarse con un servidor de MySQL.

Además veremos cómo será posible "montar" un servidor de "SQL" en nuestra propia casa, aunque tengamos una dirección IP dinámica.

Pues bien, lo primero es lo primero. Cuando ejecutamos este tutorial tendremos varias posibilidades:


(pantalla de login con SQLServer)


(pantalla de login con MySQL)


(utilizar una base de datos de Access)

Una vez seleccionada la tipología, (en caso de SQLServer o MySQL se crea la base de datos de forma automática si ésta no existe) se muestra la siguiente pantalla:

Las "base de datos" es este tutorial consta únicamente de dos tablas:

  • Juegos
  • Categorias

Pulsando con el botón derecho del ratón sobre el listview de la pantalla anterior:

Si pulsáis en la cabecera de la lista podréis ordenar de forma ascendente o descendente la lista por aquel concepto.

La gestión de la tabla de categoría se realiza desde aquí:

Pulsando en el botón Categorías:

 

Lo "bueno" del asunto es que nos da igual si la base de datos es de Access,  si estamos conectados con un SQLServer o con un servidor de MySQL. La gestión de las tablas de "Juegos" y de "Categorías" es exáctamente igual independientemente de la tipología seleccionada.

Esto tiene que quedar muy claro, todos los "INSERTS", "SELECT", "UPDATE" y "DELETES" que vimos en el tutorial anterior serán los mismos, sea cual sea la tipología de base de datos seleccionada.

La gestión de las bases de datos la realiza el módulo ModADOcommon.vb (versión 1.2)

 

Utilizando ModADOcommon

Aquí podemos ver todos los miembros de este módulo:

Cómo ya sabréis, los miembros que tienen un "candado" son privados, mientras que el resto son miembros Públicos.

Lo primero que deberíamos hacer es usar un objeto de tipo sBDDStruct.

El módulo posee un objeto público de este tipo: MiBaseDeDatos
(de todos modos, vosotros podréis crear todos los objetos de tipo sBDDStruct que querráis, únicamente se ha creado el objeto MiBaseDeDatos por comodidad)

MiBaseDeDatos, en función de la tipología de la base de datos se inicializa de una formo u otra. Por ejemplo, para una base de datos de Access, se inicializaría así:

With MiBaseDeDatos
.TipoAcesso = eTipoBDD.OleDB
   With .SettingsOleDB
      .Nombre = NOMBRE_BASEDATOS & ".mdb"
      .Password = ""
      .Ruta = ""
   End With
End With

Para SQLServer, sería algo como esto:

With MiBaseDeDatos
.TipoAcesso = eTipoBDD.SQLClient
   With .SettingsSQLClient
      If cboAutenticacion.Text.EndsWith("sql server") Then
         .Autenticacion = sSQLServerAutenticacion.SQLServer
         With .CredencialesInicioSesion
            .InicioSesion = TxtInicioSesion.Text.Trim
            .Contraseña = TxtPassword.Text.Trim
         End With
      Else
         .Autenticacion = sSQLServerAutenticacion.Windows
      End If
      .Servidor = cboServidores.Text
      .NombreCatalogo = NOMBRE_BASEDATOS
   End With
End With

Esto que a priori puede parece "complicado" no lo es tanto, ya que ModADOcommon está completamente ENUMerado, por lo que a la que empieces a escribir With MiBaseDeDatos y luego escribas un punto ( . ) verás ya todos los posibles miembros de MiBaseDeDatos.

Los métodos más comunes serán estos 3:

Function CargarDataSet ( ) As DataSet

Esta función devolverá un DataSet con los datos de la consulta que se ha realizado.

Por ejemplo:

Dim ds As DataSet
Dim miSQL As String =  "SELECT nombre FROM CATEGORIAS"

ds = CargarDataSet(miSQL, MiBaseDeDatos)

En ds tendremos el DataSet de la consulta "miSQL".

Los DataSets siempre se "recorren" igual:

If ds.Tables(0).Rows.Count > 0 Then
   For i = 0 To ds.Tables(0).Rows.Count – 1
      xxxx = ds.Tables(0).Rows(i).Item("nombre")
   Next
End If

En xxxx tendremos el valor del campo "nombre" para aquel registro dentro del DataSet.

 

Function BDDExecuteReader ( ) As String

Este función devuelve un string o "nothing"  como respuesta a una instrucción SELECT.

Por ejemplo:

Dim s As String = ""
Dim miSQL As String"SELECT codigo FROM categorias WHERE nombre=’FPS’"

s = BDDExecuteReader(miSQL, MiBaseDeDatos)

s puede que sea "nothing" si no existe ninguna categoría donde el nombre sea FPS o bien, en s tendremos el valor del campo codigo donde el nombre de la categoria sea FPS.

 

Sub BDDExecuteNonQuery ( )

Este procedimiento se utilizará para ejecutar las consultas de tipo INSERT, UPDATE o DELETE

Por ejemplo:

Dim miSQL As String =  "INSERT INTO categorias (nombre) VALUES (‘FPS’)"

BDDExecuteNonQuery(miSQL, MiBaseDeDatos)

Pues como hemos visto, básicamente, con estos 3 métodos podremos controlar nuestras bases de datos.

Cómo véis, en todos estos métodos se pasa como argumento un objeto de tipo sBDDStruct, en los ejemplos anteriores era MiBaseDeDatos.
Si MiBaseDeDatos es de .Tipo = Access, aquel BDDExecuteNonQuery realizará en "INSERT" en una base de datos de Access, mientras que si es de .Tipo = SQLServer, realizará el "INSERT" en una base de datos de SQLServer.

Sin embargo, nosotros sólo hemos escrito:

BDDExecuteNonQuery(miSQL, MiBaseDeDatos)

Ya se encarga la propia función de usar unos "métodos internos" para "INSERTAR" en Access, SQLServer o incluso en MySQL.

En ModADOcommon tendremos también otros métodos bastante útiles:

GuardarQuerysEnLog = True

Con esa instrucción conseguiremos que se genere un fichero "log" (el nombre esta en NombreFicheroQuerys) con todas las sentencias de tipo "INSERT", "UPDATE" y "DELETE"

IniciarTransaccion (ByVal BDD As sBDDStruct)

Este método inicia una operacion de transacción. A groso modo las transacciones en SQL se utilizan para asegurar que una serie de sentencias SQL se han ejecutado TODAS correctamente. En caso de error, se "deshacen" automáticamente las sentencias SQL que estaban dentro de la transacción.

Function FormatoFecha ( ) As String

Esta función devolverá un string con el formato correcto para insertar una fecha en un campo "fecha" de la base de datos

Function FormatoBoolean ( ) As Object

Esta función devolverá un "object" con el formato correcto para insertar un valor booleano en un campo "booleano" de la base de datos

Function Comillas ( ) As String

Esta función devuelve un string formateado correctamente, eliminando las comillas simples en caso de que estas existan. Cuando necesitemos usar un campo "string" en cualquier consulta (ya sea SELECT, INSERT, UPDATE o DELETE) es recomendable usar la función Comillas para evitar sorpresas con textos con comillas (típico por ejemplo en nombres franceses o ingleses)

 

 

Utilizando SQL Server Management Studio Express

Cuando iniciamos este tutorial, si nos conectamos con un servidor SQLServer, lo primero que se mira es si la base de datos existe en dicho servidor (con MySQL ocurre lo mismo)

En caso de que la base de datos no exista en el servidor, se crea.

¿Cómo?

Si os fijáis, en la carpeta donde está el ejecutable hay dos ficheros:

CreateDataBase.sql
CreateTablas.sql

Estos dos ficheros no son mas que "sentencias" SQL (mas o menos largas) que crean la base de datos para este tutorial y sus correspondientes tablas.

Podéis abrirlos con el bloc de notas si queréis.

Estos dos ficheros, no están hechos "a mano". Los ha generado el Management Studio Express. (ver Tutorial 10 para mas info acerca del Management Studio Express)

Una vez que hemos creado (a "mano") nuestra base de datos desde el Management Studio Express, realizamos lo siguiente:

Al hacer esto, se crea una nueva consulta con toda la "sentencia" SQL para generar la base de datos.

Simplemente, la copiamos y la pegamos en el bloc de notas y la guardamos como CreateDataBase.sql.

Para la generación de las tablas, hacemos algo similar:

Esto nos abrirá un asistente que nos generára una "sentencia" SQL (mas o menos larga, depende de vuestra base de datos) para la generación de las tablas de aquella base de datos.

Si ahora miráis el código del tutorial 23, veréis que en el formulario FrmMain hay un método llamado CrearBaseDeDatos

Dicho método crea las bases de datos y sus correspondientes tablas en un SQLServer o en un MySQL si la base de datos no existe.

(Nota: Con MySQL se hace algo parecido con sus herramientas propias)

Aprovechando que estamos en el Management Studio Express vamos a ver cómo realizar "consultas" de forma "visual":

Para ello pulsamos aquí:

En la ventana de la consulta que aparecerá a nuestra derecha, pulsamos con el botón derecho del ratón y seleccionamos Diseñar consulta en el editor… o bien pulsamos en el icono de la barra de herramientas:

Nos aparecera un asistente y seleccionaremos las tablas que queremos incluir en nuestra consulta.

Finalmente tendremos algo como esto:


(haz click  para agrandar la imagen)

Desde esta pantalla, podemos "jugar" y modificar nuestra consulta de forma "visual"

Al pulsar el botón Aceptar, veremos que tenemos nuestra consulta:


(haz click para agrandar la imagen)

Ahora simplemente pulsa en el botón ! Ejecutar para ejecutar la consulta:

Si la consulta es correcta, puedes utilizar la "sentencia" SQL dentro de tú codigo de .NET para utilizarla en un "SELECT". Seguro que dicha sentencia no va a fallar, ni tiene errores de "sintaxis".

Puedes hacer algo parecido con cualquier sentencia de tipo "INSERT", "UPDATE" y "DELETE".

Cuando tengas "sentencias" SQL "grandes" es recomendable usar esta técnica, ya que te ahorras mas de dos horas de quebraderos de cabeza mirando por que demonios no "funciona aquella sentencia SQL".

Tal y como comenté en el Tutorial 10, el Management Studio Express es una herramienta tremendamente útil cuando se sabe utilizar.

 

 

Que comience la magia

Posiblemente todo esto está muy bien. Sin embargo lo realmente interesante cuando se tiene un SQLServer o un MySQL (u otro tipo de tipología "server") es poder que otras personas "interactúen" con nuestra base de datos, tanto si viven en Toledo, Cuenca, Sevilla o Seatle.

El mayor problema es que cómo somos de "la cofradía del puño cerrao" ( x-D ) no disponemos de un dirección IP fija. Y claro, esto es un problema.

Pues bien, vamos a ver que con un coste 0, podemos "montar" nuestro propio servidor de base de datos.
Sí, cómo lo oyes, coste 0.

Lo primero que tenemos que hacer es registarnos en www.no-ip.com

No-IP ofrece un servicio gratuito para convertir tu dirección IP dinámica en una "dirección" fija.


(haz click para agrandar la imagen)

una vez registrados, accederemos a Add a Host. Se nos mostrará una pantalla como esta:


(haz click para agrandar la imagen)

El tipo de Host tiene que ser DNS Host (A)

Nos crearemos un nombre para nuestro Host, por ejemplo ollydbg.no-ip.biz

Cuando te registras en No-IP se te descarga un cliente (No-IP DUC):

Este cliente se puede configurar para que se ejecute al iniciar Windows, o incluso mejor, que se ejecute como un "servicio de Windows". Configúralo como quieras.

Cuando se está ejecutando aparece en la barra de tareas:

Y podemos acceder a su configuración siempre que querramos:

Y voilá. con esto ya podremos hacer que desde fuera de nuestra red accedan a nuestra base de datos:

Para SQLServer, en Nombre del servidor usaremos lo siguiente:

ollydbg.no-ip.biz,puerto SQLServer

y para MySQL pues casi igual:

Con esto conseguimos, que aunque nuestra dirección IP sea dinámica (cada vez que enciendes y apagas el router tu dirección IP pública cambia) cómo ahora nos "llamamos" ollydbg.no-ip.biz, nos da igual si nuestra dirección cambia o no 😉

Obviamente, todo esto hay que hacerlo tambien en el firewall de windows, en el firewall del router, configurar el SQLServer para que acepte conexiones del exterior, configurar el puerto del SQLServer, etc.

Además, deberías crear un tipo de usuario que tenga permisos "restringidos", que no tenga acceso a las tablas "master", etc, etc.
(si quieres saber más acerca de todo esto mándame un MP, no te cortes, que no muerdo 😉

 

A fecha de hoy, podemos decir que este tutorial es el más complejo que se ha publicado en este blog (quizás más incluso que el Tutorial 8)

De todos modos, tenéis que tener en cuenta que lo explicado aquí puede ser aprovechado incluso para obtener alguna compensación económica. Existe un amplico mercado para "gestionar" aplicaciones que controlan bases de datos. El cómo, el qué y el dónde es algo que tendréis que sopesar vosotros.

 

Por último comentar algo acerca del código fuente de este tutorial:

Obviamente, si quieres probar localmente conectarte a TU SQLServer o a TU MySQL, tendrás que tener instalados SQLServer y/o MySQL en tu PC.

Además, si quiere "recompilar" el código, necesitaras incluir comoreferencia a tu proyecto la referencia MySQL.Data. Puedes encontar másinformación sobre esto en el archivo leeme.txt que está en la carpeta Dll para Referencia MySQL.Data

Links de interés:

Para SQLServer recomiendo la version SQLServer 2005 Express
El Management Studio Express 2005 lo podéis descargar de aquí.
Para MySQL recomiendo la versión MySQL 5.1 GA
Conectores de MySQL para .NET recomiendo la versión 5.2.7
Para las herramientas "visuales" de MySQL recomiendo las MySQL GUI Tools (que incluyen el MySQL Administrator 1.2, MySQL Query Browser 1.2, y  MySQL Migration Toolkit 1.1)

 

No me cansaré de repetirlo, pero el tema de la gestión de las bases de datos es bastante amplio y complejo, por lo que no os cortéis en comentar cualquier duda que tengáis!!!, el botón de comentar no muerde 😉

 

Saludos.
mov eax,ollydbg; Int 13h 

 

Descargar proyecto .NET Tutorial 23
(460 KB. Visual Studio 2008)