Experimentos con Mono, MonoDevelop y MySQL
Recientemente he tenido que desarrollar una serie de programas para mi tesis relacionados con temas de la Web Semántica, Folksonomías, etc. Hasta ahora había hecho ya unos cuantos en Java con Jena para trabajar con ontologías y algunos experimentos en C# con SharpDevelop con implementaciones de algoritmos de lógica difusa para pattern matching. De cara a ampliar estos últimos y cómo ya dispongo del servidor linux doméstico 100% operativo, me decidí a trasladar el código desarrollado a Linux utilizando Mono. Para ello únicamente tuve que modificar aquellos puntos en los que se trabajaba con bases de datos para cambiar el OleDB que utilizaba para conectar con Access, al conector de MySQL.
Es este post explico los pasos a seguir para instalar el conector de MySQL para .NET en Ubuntu, cómo utilizarlo desde el entorno de desarrollo MonoDevelop, doy un ejemplo de utilización con un pequeño trozo de código de ejemplo, y finalmente doy alguna valoración personal al respecto, relacionada con los experimentos que yo he realizado.
La instalación de este conector no tiene mayor misterio. El primer paso es desacargar el conector, lo cual lo podemos hacer desde la propia página de MySQL, donde hay una sección específica para su descarga.
$ wget http://dev.mysql.com/get/Downloads/Connector-Net/mysql-connector-net-5.0.8.1-noinstall.zip/from/http://mysql.rediris.es/ |
Tras descargar los binarios utilizando el navegador o bien wget, es necesario descomprimir el archivo e instalar en la Global Assembly Cache el ensamblado.
$ unzip mysql-connector-net-5.0.8.1-noinstall.zip $ sudo gacutil -i bin/MySql.Data.dll |
Una vez hecho esto el driver ya está instalado, por lo que ya podemos comenzar a escribir código. Para ello, teniendo en cuenta que utilizo una estación de desarrollo con Ubuntu, he instalado MonoDevelop. Esto puede hacerse desde el menú «Aplicaciones > Añadir y Quitar…», seleccionando «Todas las aplicaciones disponibles» en el desplegable de «Mostrar», y buscando «MonoDevelop», o también desde consola.
$ sudo apt-get install monodevelop |
El conector de MySQL que hemos instalado requiere la utilización de la versión 2.0 del Framework, por lo que deberemos instalar también el compilador de mono correspondiente, si no lo tenemos ya instalado.
$ sudo apt-get mono-gmcs |
Tras esto ya podemos crear un primer programa para comprobar la instalación utilizando MonoDevelop. El primer paso será crear un nuevo proyecto, por ejemplo una aplicación de consola, tal como se muestra en la siguiente imagen.
A continuación hay que configurar en las opciones del proyecto el runtime a la versión 2.0, y añadir como referencia el ensamblado System.Data.
Además debemos añadir también manualmente el ensamblado de MySQL al proyecto. Para ello, dentro del diálogo de Referencias, entraremos en la pestaña de «Ensamblados .NET» y buscaremos el archivo MySql.Data.dll en la ubicación donde hayamos descomprimido inicialmente el conector. Esto es necesario pese a haber añadido el ensamblado al GAC.
Una vez hecho esto ya podemos escribir un ejemplo de prueba, tal como se muestra a continuación.
using System; using System.Data; using MySql.Data.MySqlClient; public class PruebaMySQL { public static void Main(string[] args) { string connectionString = "Server=localhost;Database=test;User ID=root;Password=;Pooling=false;"; MySqlConnection myConnection = new MySqlConnection(connectionString); string myQuery = "SELECT DISTINCT tag FROM tags;" try { myConnection.Open(); MySqlCommand myCommand = new MySqlCommand(myQuery, myConnection); MySqlDataReader myReader = myCommand.ExecuteReader(); while (myReader.Read()) { Console.WriteLine(myReader["tag"].ToString()); } myReader.Close(); myCommand.Dispose(); myConnection.Close(); } catch(Exception myError) { Console.WriteLine(myError.ToString()); } } } } |
Algunas impresiones
La verdad es que mi experiencia realizando los experimentos con Mono y MySQL ha sido un tanto agridulce. Dulce por volver a programar utilizando Mono, que hacía mucho tiempo que no había probado cómo funcionaba, y agria porque me he encontrado con una serie de problemas que no me esperaba.
El primer inconveniente está referido a MonoDevelop, y es la necesidad de añadir la DLL del ensamblado de MySQL, pese a haber añadido el ensamblado al GAC, aunque posiblemente se deba a la versión que instala Ubuntu por defecto. El resto de inconvenientes se refieren al propio conector.
Por un lado los procesos con los que he hecho los experimentos son bastante pesados y me he encontrado con continuos errores de timeout. He tratado de indicar un timeout diferente en el string de conexión, pero esto no es posible. Finalmente he recordado que se puede indicar el el comando (myCommand.CommandTimeout = 100000;
), aunque me parece bastante más flexible dar la opción de indicar este valor en la conexión. Por último, lo que de verdad me ha dado quebraderos de cabeza y no he conseguido resolver, han sido las continuas pérdidas de conexión con la base de datos en procesos largos (varios días) con miles de consultas SQL, e incluso algunas situaciones en los que las aplicaciones se quedaban bloqueadas por el driver. Para las primeras he podido capturar las excepciones y continuar los procesos, pero para las segundas no me ha quedado más remedio que revisar manualmente los procesos de vez en cuando y cortarlos y volver a lanzarlos cuando se bloqueaban.
Resumiendo, es probable que me lo piense bastante antes de volver a utilizar Mono con MySQL para realizar este tipo de experimentos pesados, ya que ha sido una pequeña pesadilla en lo que respecta a la fiabilidad.
Y LUEGO DICES QUE MIS VENTANAS DE INSTALACIÓN DE WIFI SON UN ………JEJEJE
BUEN TRABAJO.
Hola, Gracias por el Aporte, me ayudo de mucho! ahora me gustaria saber si me pueden ayudar a crear una conexion desde monodevelop en .Net, la quiero hacer con codigo de visual Basic usando un Formulario o un boton, quisiera saber como es la cadena de conexion a MySql?
Agradezco Mucho cualquier ayuda que puedan darme!