Buscar este blog

Quien soy

Madrid, Madrid, Spain

C# ( C Sharp) y MySQL - Conexión

Hace unos dias se presento en Madrid el Visual Studio 2010, por las caracteristicas que lo describen se ve que es la bomba. No lo he probado (ganas no me faltan) porque mi pc es un poco lento para lo que te pide este entorno.
En vista de esto y por problemas de instalacion de SQL Server (conflicto con el SQL Server que trae VisualStudio 2008) decidí apostar por MySql. Que con PHP y Java se comporta de mil maravillas.

Asi que lo primero es la conexion y es de lo que va este post. Un dolor de cabeza menos porque lo acabo de resolver.

Esta es la historia:

Tengo una maquina virtual XP con productos free, sin nada de microsoft, es decir: Netbeans, MySQL, Open Office y Xampp. Esta la utilizo para Java y PHP. Como en MySql tengo ocho bases de datos de distintos proyectos, por ahorrar tiempo y evitar mezclar tecnologias se me ocurrio reutilizar el motor.

Lo primero que se necesita es el conector de MyS. para .Net hay varias versiones... Yo como siempre me bajo la última asi sea beta y despues pete por todos lados, me gusta porque asi aprendo (manias mias). El conector esta aqui es un archivo .zip que no necesita instalación.

Para su utilizacion se debe agregar el archivo "mysql.data" en tu carpeta "references" de tu proyecto (el resto de archivos no son necesarios). Hecho esto, en un archivo de clase "conexion.cs" importas con using el espacio a utilizar. (using MySql.Data.MySqlClient);

A continuacion viene el codigo que va dentro de la clase:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//Espacio MYSQL
using MySql.Data.MySqlClient;

namespace nsPrincipal.modBaseDatos.Clases
{
class CBaseDatos
{
//Acostumbro poner una variable mensaje en todas mis clases
//con el objetivo de una depuracion manual.
private string sMensaje = "";

//CONSTRUCTOR al crear el objeto este utiliza la clase ConstBD
//que es estatica y solo guarda los parametros de conexion
//servidor: 192.168.1.103 (la maquina virtual)
//Usuario: root
//Clave: 12345
//BaseDatos: bd_elchalan
public CBaseDatos()
{
try
{
//Creo mi cadena de conexion
string sCadenaConx = "Server="+ConstBD.sServidor+
";Uid="+ConstBD.sUsuario+
";Pwd="+ConstBD.sClave+
";Database="+ConstBD.sBaseDatos;

//Construyo mi objeto usando la cadena
MySqlConnection oMySqlConn = new MySqlConnection(sCadenaConx);
//Abro la conexion
oMySqlConn.Open();
//Mensaje orgasmico xD
this.sMensaje="Conexión realizada con éxito!";

}
catch (MySqlException sE)
{
this.sMensaje = "ERROR: " + sE.ToString();
}
}

//GETS Y SETS
public string Mensaje
{
get { return this.sMensaje; }
}
}
}
Todo relativamente correcto, porque cuando asociaba la creacion de este objeto en un evento click de un boton saltaba el siguiente error:

MySql.Data.MySqlClient.MySqlException: Host is not allowed to connect to this MySQL server
at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
at MySql.Data.MySqlClient.NativeDriver.Open()
at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
at MySql.Data.MySqlClient.MySqlPool.GetConnection()
at MySql.Data.MySqlClient.MySqlConnection.Open()

Como siempre aplico Murphy, esto era de esperar.
Buscando errores en la pagina de MySql, conseguí algo que me pudo ayudar esto.

En un principio creia que era problemas de permisos pero en la lan virtual no en la base de datos. que tengo montada. No era eso porque visualstudio a travez del panel servidores podia agregar a este equipo sin problemas.

Capa fisica ok!!. Por lo que leí en ese foro el tema tenia que ver con los permisos del usuario 'root', yo creaía que este tenia absolutamente todos los privilegios incluyendo aquel que permitia la gestion remota de una base de datos, pero no es asi, este ultimo privilegio viene desactivado por razones de seguridad. Es decir solo funciona en local. Ejemplo: Si tuviera mi VisualStudio y el MySql en la misma maquina virtual funcionaria sin problemas porque trabajaria como root@localhost.

Como no era el caso, indagando en este foro un tal "titanoboa" explica el porque del error y como se soluciona. Asi que le hice caso y con la siguiente sentencia le asigne el nuevo privilegio al "root"
SQL:
//Creo un usuario identico, pero remoto
CREATE USER 'root'@'%' IDENTIFIED BY PASSWORD
'*4ACFE3202A5FF5CF467898FC58AAB1D615029441';

//Como la tabla usuario esta formada por columnas de privilegios se usa
//* .*
GRANT ALL PRIVILEGES ON * . * TO 'root'@'%'
IDENTIFIED BY PASSWORD '*4ACFE3202A5FF5CF467898FC58AAB1D615029441'
WITH GRANT OPTION
MAX_QUERIES_PER_HOUR 0 //El 0 hace que el limite varie al maximo realizado
MAX_CONNECTIONS_PER_HOUR 0
MAX_UPDATES_PER_HOUR 0
MAX_USER_CONNECTIONS 0;

Hecho todo esto, al ejecutar mi formulario salio el mensaje deseado
Conexión realizada con éxito!

Otro enlace de interes:
http://www.xtec.es/~acastan/textos/Administracion%20de%20MySQL.html

FIN.