Conectar a MySQL con MonoDevelop
En esta ocasión vamos a entrar en un tema que a
muchos seguramente les debe de interesar bastante: como realizar una
conexión a una Base de Datos en MySQL desde una
aplicación desarrollada con MonoDevelop usando MySql Connector.
Adicionalmente a la
conexión con la base de datos, la aplicación
escribirá el resultado de una consulta SQL dentro de un
widget "Gtk.TextView".Para realizar la conexión a MySQL vamos a usar el MySql Connector/.Net que podemos descargar desde la página de MySQL, recomiendo bajar el archivo tipo "mysql-connector-net-version-noinstall.zip", el cual contiene la librería ensamblada del conector.
Una vez descargado el archivo es necesario instalar la librería en el GAC (Global Assembly Cache) para que sea accesible desde el Framework, en mi caso descomprimi "mysql-connector-net-1.0.8-RC-noinstall.zip" y copié el directorio "mysqlclient/bin/net-1.1/release" y su contenido a "/home/nexus/Projects/mysql-connector-net" el cual tiene los siguientes archivos:
$ ls -alF
drwxr-xr-x 2 nexus nexus 4096 2007-01-07 00:19 ./
drwxr-xr-x 12 nexus nexus 4096 2007-01-07 00:20 ../
-rw-r--r-- 1 nexus nexus 208896 2006-10-19 16:29 MySql.Data.dll
-rw-r--r-- 1 nexus nexus 159744 2006-10-19 16:29 MySql.Data.Tests.dll
-rw-r--r-- 1 nexus nexus 270615 2006-10-19 16:29 MySql.Data.xml
Para instalarlo en el GAC solo me fue necesario hacer lo siguiente (como root):
$ cd /home/nexus/Projects/mysql-connector-net
$ gacutil -i MySql.Data.dll
MySql.Data installed into the gac (/usr/lib/mono/gac)
Ahora es necesario crear una base de datos en MySQL y un usuario asociado a su acceso. Debido a que hay cantidad impresionante de información allá afuera sobre MySQL obviaré la instalación y detalles de creación de bases de datos y usuarios.
Debemos crear una base de datos llamada "prueba" con la siguiente tabla:
-- -- Estructura de tabla para la tabla `usuarios` -- DROP TABLE IF EXISTS `usuarios`; CREATE TABLE `usuarios` ( `id` int(11) NOT NULL auto_increment, `nombre` varchar(150) collate latin1_spanish_ci NOT NULL, `apellidos` varchar(200) collate latin1_spanish_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci COMMENT='Tabla de Usuarios' AUTO_INCREMENT=3 ; -- -- Volcar la base de datos para la tabla `usuarios` -- INSERT INTO `usuarios` VALUES (1, 'Alejandro', 'Garcia'); INSERT INTO `usuarios` VALUES (2, 'Carlos', 'Lopez');
y agregamos un nuevo usuario llamado "mono" con contraseña "develop" que tenga acceso total a la base de datos "prueba".
Ahora es momento de crear nuestro nuevo proyecto Gtk#, como siempre desde el menú "Archivo" en la opción "Nuevo Proyecto...". (Estoy usando la versión 0.12 de MonoDevelop para el desarrollo de este ejemplo)
Lo primero que debemos hacer es agregar las referencias apropiadas para el uso del MySQL Connector/.NET, y se logra dando un click derecho sobre la linea de "Referencias" en la ventana de "Solución" y pulsamos sobre "Editar Referencias"
Despues vamos a la pestaña "Paquetes", donde debemos encontrar y activar la referencia "System.Data".
Por último vamos a la pestaña "Ensamblado .Net", donde seleccionamos el archivo "MySql.Data.dll" y pulsamos sobre el botón "Añadir". Esto es así debido a que MonoDevelop no soporta los ensambles referenciados por GAC como paquetes. El mismo Lluis Sanchez nos lo confirma en la lista de correos.
Para poder verificar los resultados de la consulta agregaremos un "Gtk.TextView" en nuestro MainWindow.
Gtk.TextView
Nombre del widget: "textviewResultado"
Editable: deshabilitado
El cual debe quedar simplemente así:
No hay que olvidar que debemos pulsar sobre el botón "Bind to Field" para poder usarlo desde el código.
Ahora solo nos resta escribir el código que realizará la conexión y consulta sobre la Base de Datos, la cual quedará de la siguiente manera:
using System; using Gtk; // Se agregan las referencias necesarias para conectar a la DB using System.Data; using MySql.Data.MySqlClient; public class MainWindow: Gtk.Window { protected Gtk.TextView textviewResultado; public MainWindow (): base ("") { Stetic.Gui.Build (this, typeof(MainWindow)); // Cadena de Conexion a la DB string connectionString = "Server=localhost;" + "Database=prueba;" + "User ID=mono;" + "Password=develop;" + "Pooling=false"; // Query para extraer la informacion de la tabla string myQuery = "SELECT id, nombre, apellidos FROM usuarios;"; // Se crea el objeto de conexion MySqlConnection myConnection = new MySqlConnection(connectionString); try { // Abre la conexion myConnection.Open(); // Crea el objeto de ejecucion del query MySqlCommand myCommand = new MySqlCommand(myQuery, myConnection); // Ejecuta el query MySqlDataReader myReader = myCommand.ExecuteReader(); // Lee cada uno de los registros devueltos while (myReader.Read()) { // Escribe en el textview textviewResultado.Buffer.Text += myReader["nombre"].ToString() + " " + myReader["apellidos"].ToString() + "\n"; Console.WriteLine("ID: " + myReader["id"].ToString()); } // Se cierra el reader myReader.Close(); // Se cierra la conexion con la DB myConnection.Close(); } catch(Exception myError) { // En caso de algun error lo veremos en la consola de depuracion Console.WriteLine(myError.ToString()); } } protected void OnDeleteEvent (object sender, DeleteEventArgs a) { Application.Quit (); a.RetVal = true; } }
Espero que este artículo sea de utilidad. Saludos.
El proyecto y código relacionado de este artículo están disponibles en el siguiente archivo.
| Adjunto | Tamaño |
|---|---|
| ConectarMySQL.tar.gz | 5.03 KB |
| tabla_usuarios.sql.gz | 374 bytes |
![]() |
Segui tus mismos pasos y me da el mismo error al compilar Agregue la .dll al GAC asi: Y me da este resultdo: alejandro@Linux:~$ gacutil -l |grep MySql MySql.Data, Version=5.0.8.1, Culture=neutral, PublicKeyToken=c5687fc88969c44d
El problema no se cual es tambien referencio en el proyecto En opciones del proyecto -> opciones del runtime esta el 1.1 y si lo cambio a 2.0 no me tira el error anterior, pero ahora me sale que no se encuentra en mi carpteta debug el .exe a generar, como q no lo compila (o crea) y dice esto en la ventana Traza de construccion: Construyendo proyecto: pipi Configuración: Debug
Generating stetic code...
Realizando compilación principal...
/bin/sh: /usr/bin/gmcs: not found
Construcción finalizada -- 0 errores, 0 advertencias
---------------------- Hecho ---------------------
Construcción satisfactoria.
Y en la ventana Traza de la aplicacion esto:
Cannot open assembly /home/alejandro/Desktop/pipi/bin/Debug/pipi.exe
Te pego el codigo fuente, realmente nose que es lo q falta, tengo ubnutu 7.04, monodev 0.12 y mysql 5.0 con el netconector 5.0
using System;
using Gtk;
using System.Data;
using MySql.Data.MySqlClient;
public class MainWindow: Gtk.Window
{
protected Gtk.Entry entry3;
protected Gtk.TreeView tree;
protected Gtk.ListStore provincias;
public MainWindow (): base ("dfsdsdsdsdf")
{
Stetic.Gui.Build (this, typeof(MainWindow));
}
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}
protected virtual void OnCmdSalirClicked(object sender, System.EventArgs e)
{
Application.Quit();
}
protected virtual void OnCmdSaludarClicked(object sender, System.EventArgs e)
{
string conec =
"Server=localhost;" +
"Database=Mono;" +
"User ID=root;" +
"Password=;" +
"Pooling=false";
IDbConnection con = new MySqlConnection(conec);
con.Open();
IDbCommand cmd = con.CreateCommand();
string sql = "select id, descripcion from Lista";
cmd.CommandText =sql;
IDataReader reader = cmd.ExecuteReader();
provincias = new Gtk.ListStore(typeof(string),typeof(string));
tree.AppendColumn("Codigo",new Gtk.CellRendererText(),"text",0);
tree.AppendColumn("Localidad",new Gtk.CellRendererText(),"text",1);
while (reader.Read())
{
provincias.AppendValues((string)reader["id"],(string) reader["descripcion"]);
}
tree.Model =provincias;
reader.Close();
reader=null;
cmd.Dispose();
cmd = null;
con.Close();
con=null;
}
} |
![]() |
En las opciones del proyecto asi me ha dado resultado compilando pero la verdad no se, aun apenas si se abrir una conexion :) (en proceso de lectura por el momento) |
![]() |
a mi me sale siguiente error: Unable to connect to any of the specified MySQL hosts. alguine sabe a que se debe????? agradeceria mucho su ayuda |
![]() |
Que tal, No encuentro el boton "bind to field", por ahi lei que a partir de la version 0.13 se elimina la necesidad de hacer Bind to field, porque se usan ya clases parciales. Yo estoy usando la version 1.0, en modo grafico no me jala, pero me jalo la conexion en cli. Saludos |
![]() |
Efectivamente, "bind to field" ya no se usa, las llamadas a los widgets se hacen directamente por medio del nombre que le asignaste al mismo. Ahora con un poco más de tiempo, me gustaría actualizar mis artículos para MonoDevelop 1.0. Saludos |
![]() |
Ya me jalo, tuve que hacer unas modificaciones, aqui pongo mi codigo para aquellos que no les jala, Lo que añadi lo pongo en negritas. Saludos. // MainWindow.cs created with MonoDevelop
// User: lira at 3:14 AM 6/9/2008
//
// To change standard headers go to Edit->Preferences->Coding->Standard Headers
//
using System;
using Gtk;
using System.Data;
using MySql.Data.MySqlClient;
public partial class MainWindow: Gtk.Window
{
protected Gtk.TextView textviewResultados;
public MainWindow (): base (Gtk.WindowType.Toplevel)
{
// Stetic.Gui.Build (this, typeof(MainWindow));
Build ();
// Cadena de Conexion a la DB
string connectionString =
"Server=localhost;" +
"Database=test;" +
"User ID=mono;" +
"Password=develop;" +
"Pooling=false";
// Query para extraer la informacion de la tabla
string myQuery = "SELECT id, nombre, apellidos FROM usuarios;";
// Se crea el objeto de conexion
MySqlConnection myConnection = new MySqlConnection(connectionString);
try
{
// Abre la conexion
myConnection.Open();
// Crea el objeto de ejecucion del query
MySqlCommand myCommand = new MySqlCommand(myQuery, myConnection);
// Ejecuta el query
MySqlDataReader myReader = myCommand.ExecuteReader();
// Lee cada uno de los registros devueltos
while (myReader.Read())
{
// Escribe en el textview
textviewResultado.Buffer.Text += myReader["nombre"].ToString() + " " + myReader["apellidos"].ToString() + "\n";
Console.WriteLine("ID: " + myReader["id"].ToString());
}
// Se cierra el reader
myReader.Close();
// Se cierra la conexion con la DB
myConnection.Close();
}
catch(Exception myError)
{
// En caso de algun error lo veremos en la consola de depuracion
Console.WriteLine(myError.ToString());
}
}
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}
}
Para los que usan Ubuntu Hardy tienen que poner un parche, pongo comando que use: sudo apt-get install libmono-i18n2.0-cil Espero les funcione. |
![]() |
Hola, he estado viendo y probando los anteriores tutos sobre monodevelop y la verdad estan buenisimos, todo me ha salido, claro que no he seguido todo al pie de la letra xq todo esta hecho con la version 0.11 y yo tengo la 1.0. El unico problema que he tenido es con esto de conectar a bases de datos, podrias explicarlo mejor? como serian los pasos con la actual version? se prodria hacer con PostgreSQL? estaria bueno q des aunque sea una pequeña explicacion de como instalar y configurar la base de datos, ya sea mysql o PostgreSQL. Muchas gracias y felicitaciones por el buen material que publicaste PD://aguante bleach!!!!!! Saionara |
![]() |
Hola, me parece muy buena la idea, se que existen 800 mil tutoriales sobre como instalar y configurar MySQL y PostgreSQL, pero creo que uno más no debería de ser ningún problema, así que trataré de en breve crear esos dos artículos. Por otro lado también tengo intención de actualizar todos los artículos de MonoDevelop a la versión 1.0 y escribir otros... lo que pasa es que no he tenido casi nada de tiempo, tengo 3 articulos atrasados (ahora 5) y no he podido avanzar mucho. Bueno, gracias por visitarme y dejar tus comentarios, con personas como tu dan ganas de seguir escribiendo. Saludos |
![]() |
me cree una cuenta xq sino no me daba cuenta cuando respondias, te agradezco la rapida respuesta, acabo de terminar de leer el tuto sobre archivos de texto y te deje un comentario y un de dudas. PD: espero que no te moleste pero voy a empezar a poner tus articulos sobre mono en mi foro, obviamente con el correspondiente enlace a esta pagina para que todos sepan de donde sale. |
![]() |
Me parece estupendo, no hay ningún problema mientras exista un link hacia aquí, de hecho te propongo que intercambiemos links. Ya agregué tu link a mi bloque de colaboradores. Saludos |
![]() |
Me parece buena idea, voy a agregar tu sitio como pagina amiga, aunque mi sitio como te dije esta en fase betha, recien la proxima semana comenzare a dejarlo bonito. Un saludo y no puedo dejar de felicitarte x la calidad de tus tutos http://www.linuxssoul.com.ar |
![]() |
Foros como este son los que insentivan a investigar, estuve recorriendo por varios otros y creo que este es uno de los mejorcitos si no es el mejor, me parece muy bien que de apoco se agreguen mas para guiar a los que recien estamos empesando, muy chas felicidades a los creadores de este foro y a los que colaboran con los comentarios, me parece bien que migres tus ejemplos a nuevas versiones, lo hiciste con Mysql, cuando lo haces con Postgres, y si trataras de separarlo en MVC seria maravilloso. |
![]() |
Ola a todos en primer lugar quiero felicitar al autor de estos tutoriales que sin duda son de lo mejorcito en cuando a desarrollo en mono en segundo lugar quiero mostrar un intento de conexion con postgre que he realizado bajo monodevelop 1.0 y en ubuntu 8.04 Este es el codigo : using System;
using Gtk;
using System.Data;//añadir el system data
using Npgsql;//añadir Npgsql
public partial class MainWindow: Gtk.Window
{
string connectionString =
"Server=localhost;" +
"Database=prueba;" +
"User ID=root;" +
"Password=---;";
IDbConnection dbcon;
Linea problemática -->> dbcon = new NpgsqlConnection(connectionString);
dbcon.Open();
IDbCommand dbcmd = dbcon.CreateCommand();
string sql =
"SELECT * " +
"FROM public.login";
dbcmd.CommandText = sql;
IDataReader reader = dbcmd.ExecuteReader();
while(reader.Read()) {
string FirstName = reader.GetString(reader.GetOrdinal("firstname"));
string LastName = reader.GetString(reader.GetOrdinal("lastname"));
Console.WriteLine("Name: " +
FirstName + " " + LastName);
}
// clean up
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
dbcon.Close();
dbcon = null;
}
public MainWindow (): base (Gtk.WindowType.Toplevel)
{
Build ();
}
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}
}
Bien como podeis ver la linea en mi caso 19 me pone un fallo error:CS8025 he estado buscando y en algunos lugares ponia k para que no diese ese fallo abia que añadir dos dll Npgsql.dll y Mono.Security.dll pues bien las he añadido bajandolas de aquí http://pgfoundry.org/frs/?group_id=1000140 como existen un monton de versiones no supe cual escojer (nota: a lo mejor el fallo se debe a eso :S ) las añadi de la misma forma que se explica en el tuto de mysql de arriba y nada el fallo persiste . |
![]() |
Pues no te puedo ayudar mucho ya que no he hecho pruebas con PostgreSQL, pero te puedo mencionar que de la página de los DLL's depende que este usando. Si usas el framework 1.1 de .NET/Mono tendrás que bajar "Npgsql1.0.1-bin-mono-1.1.zip". Si usas el framework 2.0 tendrás que bajar el "Npgsql1.0.1-bin-mono-2.0.zip" Sobre lo del error la verdad no tengo mucha idea, intentaré probar tu código. Saludos |
![]() |
Bueno antes de nada gracias por la ayuda he intentando conectarme con las dos dll pero nada no se si es que no las pilla bien o algo por k el problema esta por estas lineas : IDbConnection dbcon; dbcon = new NpgsqlConnection(connectionString); dbcon.Open(); IDbCommand dbcmd = dbcon.CreateCommand(); No se si es que no pilla la dll o algo pero yo miro en el bin/debug y allí están :S . Además me gustaría preguntarte si en los próximos artículos podrías dedicar una sección a la conexión con postgresql ya que es una de las bd gratuitas mas potentes que hay para tema de consultas ,yo me encuentro intentando hacer un proyecto con ella pero me quede estancado por este motivo y claro xD un programa que sea de altas bajas y modificaciones sin poder conectarse a la bd da un poco la risa . Bueno y saludo y gracias por la ayuda |
![]() |
Dándole seguimiento a tu problema, y intentaste instalarlo al "GAC"?, lo puedes hacer de la siguiente forma: gacutil -i Npgsql.dll Y por otra parte, puedes revisar si te da el error en la linea IDbCommand dbcmd = dbcon.CreateCommand(); Coméntala y corre de nuevo pero únicamente con : dbcon.Open(); dbcon.Close(); A ver si el problema es por ahi. Saludos |
![]() |
Si lo he instalado en el gac pero sigue igual el problema te envio varias screen con diferentes sitios comentados http://img65.imageshack.us/my.php?image=pantallazopr5.png como puedes ver en las referencias las dos dll estan introducidas mono y npgsql pero me sigue dando fallos por esas zonas de ai . Un saludo |
![]() |
Oye, viendo tu código me salta mucho ala vista la linea: IDbConnection dbcon; dbcon = new NpgsqlConnection(connectionString); ¿No debería ser algo mas o menos así?: NpgsqlConnection dbcon = new NpgsqlConnection(connectionString); Digo, solo son ideas, aún no hago ninguna prueba en forma. Saludos |
![]() |
La verdad eso ya lo tenia probado lo probe de nuevo y dice k ya esta declarado :S |
![]() |
Jejeje, pero debes comentar la linea: //IDbConnection dbcon; Y si funciona, no se te olvide hacer lo propio con: IDbCommand dbcmd = dbcon.CreateCommand(); Por algo así: NpgsqlCommand command = new NpgsqlCommand("select * from tabla", dbcon);Te recomiendo leer la Documentación de Npgsql Saludos |
![]() |
Finalmente lo logre con la documentacion de la pagina k me pasastes gracias Aqui el nuevo codigo xD: using System;
using Gtk;
using System.Data;
using Npgsql;
public partial class MainWindow: Gtk.Window
{
public MainWindow (): base (Gtk.WindowType.Toplevel)
{
Build ();
NpgsqlConnection conn = new NpgsqlConnection("Server=localhost;User Id=administrador;Password=---;Database=prueba;");
conn.Open();
NpgsqlCommand command = new NpgsqlCommand( "SELECT * FROM public.login", conn);
int i ;
try
{
NpgsqlDataReader dr = command.ExecuteReader();
while(dr.Read())
{
for (i=0;i |
![]() |
hola. veo que hay una excepcion, y me gustaria saber que sigue despues ya que veo un ciclo mientras y luego un ciclo para. |
![]() |
Me gustaria saber que debo tener instalado en windows para poder ejecutar los .exe creados con monodevelop y saber si es necesario volver a compilar los codigos de nuevo en windows o simplemente con instalar algo ya me funcionan . Un saludo |
![]() |
Vale googleando un poco he encontrado que el fallo se debe a la version de gtk sharp empleada la 2.12 la cual no "existe" todavia en windows para poder ejecutar un program se tiene que emplear una version anterior no obstante en el monodevelop 1.0 me trae solamente la version 2.12 y para poder instalar la 2.10 me ha resultado completamente imposible .... http://img68.imageshack.us/my.php?image=monobk3.jpg Un saludo |
![]() |
Yo creo que solo hay que esperarse un poco de tiempo a que compilen esa versión. Creo que invertir demasiado esfuerzo en encontrar una solución ahorita sería desperdiciar tiempo y además sería una solución mediática hasta que se tengan los binarios oficiales. Saludoa |
![]() |
TE SALUDOS NEXUS. HE CORRIDO TU PROGRAMA Y ME MARCA 0 ERRORES PERO NO ME DESPLIEGA LOS REGISTROS DE LA TABLA.. EN LA VENTANA DE TRZA DE LA APLICACON ME MARCA Exception in Gtk# callback delegate ME PODRIAS DECIR MAS OMENOS ???? |





He añadido System.Data y MySQL.Data (version 5.0) Tengo Ubuntu 7.04 y MonoDevelop 0.12 (el que ha instalado por defecto) Podeis echarme una mano?? GRACIAS