Acceso a datos desde WP7 a tablas MySQL
La verdad es que este tema me ha generado bastantes dolores de cabeza y la auséncia de información en Internet me ha llevado a resumiros el procedimiento que he seguido. Espero que os sea de ayuda. Empezamos:
Bien, el primer concepto que debemos tener en cuenta es que no se puede acceder directamente desde vuestra aplicación de WP7 a las tablas MySQL, o eso es lo que he deducido después de buscar información. Necesitaremos crear un servicio WCF que resumiendo torpemente, es la aplicación puente que utilizaremos para acceder a datos externos alojados en la nube. En esta aplicación implementaremos todas las funciones necesárias para recoger o insertar y las llamaremos más tarde desde nuestra aplicación WP7.
El primer paso será crear un proyecto tipo WCF Service Application. Seguidamente descargaremos el Connector MySQL para .NET desde aquí. Después de instalar el fichero descargado tendremos que añadir la referencia a nuestra aplicación WCF de la DLL MySql.Data.dll que se encuentra en mi caso en la ruta C:\Program Files\MySQL\MySQL Connector Net 6.2.4\Assemblies\.
Ahora ya podemos añadir las referencias a la librería en el fichero Service1.svc.cs.
using System.Data;
using System.Data.Sql;
using System.Data.OleDb;
using MySql.Data.MySqlClient;Ahora imeplementaré una función que devolverá un valor de la Base de Datos MySQL recibiendo como parámetro un filtro.
namespace WcfService1
{
public class Service1 : IService1
{
MySqlConnection myConn;
string a;
public string GetData(int value)
{
myConn = new MySqlConnection("user id=usuario; password=contraseña; database=basededatos; server=ipservidor");
myConn.Open();
string[] myList = new string[10];
string strSQL = "SELECT * FROM EMPRESAS WHERE ID_EMPRESA="+value;
MySqlCommand mysqlCmd = new MySqlCommand(strSQL, myConn);
MySqlDataReader mysqlReader = mysqlCmd.ExecuteReader();
int i = 0;
while (mysqlReader.Read())
{
if (mysqlReader.GetString(1).ToString() != null)
{
a = mysqlReader.GetString(1).ToString();
//myList = mysqlReader.GetString(0).ToString();
}
else
{
a = null;
}
i++;
}
myConn.Close();
return string.Format(a);
}
}
}Esta función devuelve el nombre de una empresa pasándole como parámetro su ID. Es una función chorras pero me sirve para el propósito de este post.
Lo siguiente que haremos será vincular el servicio WCF a una aplicación WP7.
Desde nuestro proyecto WCF si hacemos click derecho encima del proyecto tenemos la opción View in Browser (Ver en navegador), aceptamos y se nos abrirá una página web, copiamos la dirección al clipboard.
Creamos un proyecto tipo Windows Phone Application y iremos a Add Service Reference, solo deberemos pegar la dirección web que habíamos copiado anteriormente y ya tendremos vinculado nuestro servicio web.
Como ejemplo he añadido a la aplicación un boón y una área de texto. En el evento click del boón le pasaremos un parámetro id de empresa al web service y el nombre de empresa que devuelve lo pondremos en el campo de texto de la aplicación móvil.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using WindowsPhoneApplication4.ServiceReference1;
namespace WindowsPhoneApplication4
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Service1Client client = new Service1Client();
client.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(client_GetDataCompleted);
client.GetDataAsync(5, client);
}
void client_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
Service1Client client = e.UserState as Service1Client;
client.GetDataCompleted -= client_GetDataCompleted;
if (e.Error != null)
{
//TODO: Gestionar el error
return;
}
string getDataResult = e.Result;
//getDataResult = "You entered: 5";
textBox1.Text = e.Result;
}
}
}Ya solo queda probar nuestra aplicación. Así de cutre y así de complicado se me ha hecho encontrar este método. Espero haberos sido de ayuda.
**** Actualización 08/04/11 ****
Se ha añadido el código de la aplicación de test de este capítulo. Podréis observar que lo he variado un poco pero es prácticamente el mismo. Además se han añadido algunas capturas de pantalla nuevas para hacer más comprensible el método.
Archivo: MySQLConnection-1.0.zip (Versión 1.0)
**** Actualización 10/05/11 ****
Consulta que devuelve más de un valor
En esta segunda revisión del ejemplo se han añadido las funciones para capturar múltiples valores de un registro de la Base de Datos MySQL. En este ejemplo os muestro como quedaría la función en nuestro servicio WCF.
public List<Models.Empresa> DatosEmpresa2(int idEmpresa)
{
List<Models.Empresa> ListaEmpresas = new List<Models.Empresa>();
myConn = new MySqlConnection(Models.Config.ConnectionString);
myConn.Open();
string Sql = "SELECT * FROM EMPRESAS WHERE ID_EMPRESA=" + idEmpresa;
MySqlCommand mysqlCmd = new MySqlCommand(Sql, myConn);
MySqlDataReader mysqlReader = mysqlCmd.ExecuteReader();
//int i = 0;
while (mysqlReader.Read())
{
if (mysqlReader.GetString(1).ToString() != null)
{
Models.Empresa Item = new Models.Empresa();
Item.Id = Convert.ToInt32(mysqlReader.GetString("ID_EMPRESA").ToString());
Item.Nombre = mysqlReader.GetString("NOMBRE").ToString();
Item.Actividad = mysqlReader.GetString("ACTIVIDAD").ToString();
Item.Contacto = mysqlReader.GetString("CONTACTO").ToString();
Item.Zona = mysqlReader.GetString("ZONA").ToString();
ListaEmpresas.Add(Item);
}
//i++;
}
myConn.Close();
return ListaEmpresas;
}Archivo: MySQLConnection-2.0.zip (Versión 2.0)
**** Actualización 20/05/11 ****
Consulta de inserción (INSERT)
Aprovecho para colgar una función de inserción en la Base de Datos. Es una función de ejemplo muy simple pero quizá os pueda servir para vuestros propósitos.
public void InsertItem(string Nombre, string Actividad, string Contacto)
{
myConn = new MySqlConnection(Models.Config.ConnectionString);
myConn.Open();
String Sql = "INSERT INTO EMPRESAS (NOMBRE, ACTIVIDAD, CONTACTO) VALUES ( " +
"'" + Nombre + "', '" + Actividad + "', '" + Contacto + "')";
MySqlCommand mysqlCmd = new MySqlCommand(Sql, myConn);
mysqlCmd.ExecuteNonQuery();
}Y este sería el código de la aplicación WP7 que llama a la función de insertar. Está testeado y a mi personalmente me ha funcionado. Es un código muy simple, mediante el evento de un botón se inserta en la BBDD MySQL el valor de 3 campos de texto.
private void InsertButton_Click(object sender, RoutedEventArgs e)
{
Service1Client client = new Service1Client();
client.InsertItemAsync(textBox3.Text, textBox4.Text, textBox5.Text);
}Actualizo el fichero con el código testeado.
Archivo: MySQLConnection-3.0.zip
PD: El proyecto WCF no podréis crearlo sin la plantilla del proyecto instalada y la mala notícia es que no viene con Windows Phone Toolkit. Necesitaréis descargarla o tener el Visual Studio completo.
28 Comments
Leave a comment
Mi Manual de Windows Phone
Ultimos Posts
- Windows Phone Developer Tools 7.1 Beta
- Cambia el tema del emulador de Windows Phone
- Algunos tutoriales de Windows Phone 7 (Parte 3)
- Grabador de voz en Windows Phone
- Cambiar teclado de TextBox en WP7
- Sobre el diseño Metro para programadores de WP7
- Base de datos XML en Windows Phone 7
- Windows Phone 7 Isolated Storage Explorer
- Almacenamiento local de datos en Windows Phone
- Uso del control Popup en WP7
Windows Phone
Nuestras lecturas
- Q&A: Britt Atack, 44, school athletic director
Windows Phone Blog - What’s On Your Desk?
Blankenblog - Guia de estilo para desarrollo de interfaces web
Libre y extremo











Hola, estoy siguiendo tu ejemplo ya que quiero conectar con una db de MySQL y no hay manera. ¿Podrías colgar el proyecto de este capítulo?
Muchas gracias y felicidades por el blog.
Hola Alberto, he colgado el código de la aplicación WCF y la de Windows Phone. Espero haberte sido de ayuda y que con el código puedas solucionarlo.
Saludos!
Muchas gracias espero que me sirva para lo que deseo hacer.
Hola amigo, me pareciio de mucho interes tu tema y lo he practicado ya muchas veces probando tu ejemplo y realizando varias modificaciones.
me surgen agunas preguntas ajala puedas respondermelas para seguir avanzando en este ejemplo.
1. el “i++” en el bucle que funcion cumple.
2. veo que tienes en comentario, algo que yo tembien estoi tratando de hacer y he tenido varios problemas si ya solucionastes actualiza el mini tuto.
quiero decir que por ejemplo tenemos en una tabla varios campos en un registro actualmente con el ejemplo actual solo podemos mostrar un campo.
por ejemplo: tabla empresas.
idEmpresas, nombreEmpresa, Dirección, Telefono.
pero con la consulta del ejemplo solo podemos mostrar 1 solo campo, como hariamos para devolver todos los datos a la aplicacion WP7.
y ke lo podemas por ejemplo:
textBox1.Text = e.Result; // nombre empresa
textBox2.Text = e.Result;// direccion empresa
textBox3.Text = e.Result;// telefono empresa
si sabes algo mas o menos acerca de como realizar esto te agradeceria mucho.
seguimos en contacto, mientras busco por mi lao pocibles soluciones.
yonis gomez.
colombia.
Hola Yonis, te respondo a tus preguntas:
1. El i++ en el bucle realmente no sirve para nada en el ejemplo que he colgado. La variable i estaba pensada por si se quiere devolver más de un registro, un dataset, por ejemplo. En nuestro caso como tenemos el código mysqlReader.GetString(1).ToString(), solo devolvemos el primer registro que encuentre. En resumen, que no sirve para nada, debería haberlo comentado.
2. He implementado una versión 2.0 del ejemplo donde utilizo una función que devuelve varios valores de un registro. Para recoger los valores he creado una lista de clase Empresa, he tenido que crear una clase muy simple. He actualizado tambien el post con la función nueva. Te puedes descargar el ejemplo y probarla.
Espero haberte sido de ayuda. ¡Saludos!
Ok, muchas gracias, bajando nuevo codigo para analizar y probar.
yo le habia hecho “trampa” al codigo en el WCF,
para solucionar el problema hise lo siguiente:
//en el WCF, declare varias variables, a, b, c, d, etc.
if (mysqlReader.GetString(1).ToString() != null)
{
a = mysqlReader.GetString(1).ToString();
b = mysqlReader.GetString(2).ToString();
c = mysqlReader.GetString(3).ToString();
d = mysqlReader.GetString(4).ToString();
//myList = mysqlReader.GetString(0).ToString();
}
// despues concateni todas las variables separadas por ;, en una sola
string todo = (a+”;”+b+”;”c+”;”d);
y retorno “todo”
muy rustico xD, pero funciona.
en el WP7 aplicacion, utilice funciones de manipulacion de cadenas para separar todas las variables separadas por “;” cada una la muestro en un Textbox diferente.
bueno como mencione arriba boy a probar tu nuevo codigo nuevo
Hola pablo, ya probe la version 2, funciona y epresa bien la idea original que se quiria dar en principio del acceso a datos desde WP7 a bases de datos.
Mas tarde colgo pantallasos de otros usos que se les pueda dar a este ejemplo que posteastes.
voy a ver si se puede mover la base de datos del localhost a un servidor web,a un hosting gratuito, en teoria deberia funcionar igual.
tambien comentare mas adelante haber si se puede ademas con otras consultas, variar con un Insert, Update y delete.
para fines pedagogicos este ejemplo mola. invito a demas usuarios de la villa a buscarles otros usos.
seguimos en contacto, si tienen propuesta acerca del tema no duden en postear, me estoy interesando mucho en el tema, y quiero aprobechar el impulso como todos ya sabemos se encuentra muy poco hacerca de programacion en WP7.
chaiiiito…
Hola Yonis,
primero darte las gracias por tu interés sobre el tema. Es cierto que no se encuentra muy fácilmente información sobre WP7 en Internet, y menos en español. El tema de acceso a MySQL desde WP7 me parece muy interesante debido a que muchas personas ya tienen sus BBDD montadas y les interesa no tener que migrarlas ni hacer inventos raros con sus datos.
Siguiendo tus consejos, he añadido al final del post una simple función de inserción. Es muy simple, pero es suficiente para entender el propósito.
En cuanto a la migración de la BBDD de localhost a un hosting externo, no tendrás ningún problema. Yo tengo un hosting externo y de hecho, el ejemplo está hecho con el. Simplemente tendrás que poner la IP del hosting en la dirección del servidor, el usuario y el password.
Gracias por el interés en el tema. Espero enterarme de tus avances.
Hola pablo, una consulta, he quedado barado no he probado muy bien el ejemplo de insertar en la BD.
Mi inquietud es que recojo los datos de 3 testbox y los guardo en variables pero no se que codigo colocar en el evento click de boton insertar.
mira lo que hise:
private void btnInsertar_Click(object sender, RoutedEventArgs e)
{
int id;
string nombre, telefono;
id = Convert.ToInt32(txtDato.Text);
nombre = Convert.ToString(txtNombre .Text);
telefono = Convert.ToString(txtTelefono.Text);
// Desde aqui para avajo que coloco, pues trato de colocarlo como la de los ejemplos anteriores y me manda muchos errores despues de corregir y corregir nada.
}
Hola Yonis,
he actualizado el fichero del proyecto con el código completo. Espero que te sirva. Tambien he actualizado el post. Si tienes problemas para que funcione lo comentamos si quieres.
Saludos!
Hola Pablo,
ya despues de estear por dodos los lados tu ejemplo, vemos la funcionalidad y lo versatil se se puede llegar a ser sin tener como conectar directamente aplicaciones desde wp7.
quisiera saber si existe la pocibilidad de ya teneiendo la base de datos en el servidor y funcionando bien al igual que en el local hots.
El punto es que si se puede de alguna manera probar la aplicacioin ya en el telefono pues todo lo vengo haciendo en el emulador, quiero probarlo ya en el mismo telefono, como haria en este caso.
si es que se generan algun instalador, setud, exe, o no se, como ariamos para montarlo a la plataforma real para ver que tal funca hay.
claro montarlo al movil sin pasar por ahora por el Marketplace.
muchas gracias.
Hola pablo, excelente informacion hace rato que buscaba esto, quiero hacer lo mismo pero consumiendo desde silverlight, tengo una consulta tal vez algo basica, pero estoy empantanado ahi, tengo un server Linux Unbuntu v 10 con MySQL 5 conectado a internet a traves de la IP publica de un cliente, ¿seria correcto hacer una pagina ASP con un servicio WCF como el de tu ejemplo que acceda a este server y luego una aplicacion silverlight que consuma este servicio? ¿Desde el punto de vista de la seguridad es correcto? Gracias
Hola Yonis,
la verdad es que yo, como tu, tambien uso únicamente el emulador de Windows Phone Toolkit. Estoy a la espera de recibir un dispositivo móvil para poder testear las aplicaciones que he realizado en este tiempo.
He encontrado un link interesante:
http://blogs.msdn.com/b/oaviles/archive/2010/12/07/registra-y-desbloquea-tu-windows-phone-7-para-probar-aplicaciones-o-juegos.aspx
Ya me dirás si te ha servido. Cuando reciba el móvil y pueda hacer mis pruebas te comentaré como lo he desbloqueado. Aunque creo que para darse de alta como desarrollador en la AppHub es obligatorio pagar una cuota.
Hola Gustavo,
si no he entendido mal lo que quieres es utilizar un servicio WCF con tu aplicación web en ASP. Para hacer esto no hay ningún problema ya que son compatibles. Desde el punto de la seguridad tampoco hay que preocuparse, de hecho, el funcionamiento es el mismo que utilizando una aplicación móvil.
El servicio WCF debería ser el mismo ya que no depende de la aplicación cliente que utilices. Sobre como implementar la aplicación ASP para recoger los datos del servicio no te puedo ayudar ya que no sé demasiado de ASP, siempre he sido más de PHP.
Saludos y muchas gracias por el comentario.
mmm, ok voy a estar pendiente, por que leyendo por hay solo se ve que desbloqueando el movil y cosas asi que parecen ser no tan seguras o legales.
esperar haber si sale otra manera.
Muchas gracias por esta información, ha sido de gran ayuda en mi proyecto, que tiene como propósito relizar una aplicación WP7 que pueda consultar DB en Mysql… hasta ahora estoy comenzando a aprender sobre la programación con visual, entonces los ejemplos descargables han sido de gran ayuda.
Hola pablo,
Esta ves vengo con otro inconveniente que se me presenta al practicar el ejemplo, 2 problemitas son al final y en orden de importancia son:
1. Se me presenta un error cuando el dato buscado no esta en la base de datos me cierra el programa, solo me funciona con datos existentes.
¿Como haria para, mostrar un mensaje cuando el registro no existe en la BD?
2. El otro problemita es buscar cadenas de carateres (tipos String), como un nombre por ejemplo, solo me funciona con INT, y aunque canvie los tipos de datos a string en todas las partes donde me mostraba error todavia sigue sin funcionar con tipos string.
Espero tu ayuda para continuar con el desarrollo de este post y practicando, antes de pasar a WP7 mango que dicen que ya trae motor de base de datos.
Espero tu pronta actualizacion del post….
Hola Yonis,
intentaré responder a tus preguntas.
1) El problema es que cuando preguntas por un registro que no existe a la Base de Datos el programa no está preparado para resolverlo, tienes razón. Como puedes observar el programa no está ni mucho menos optimizado. Para poder salvar este obstáculo bastaría con implementar un pequeño control en la función antes de devolver los datos. Por ejemplo:
if (a == null) a = “”;
Donde a será el valor a devolver. Le estamos diciendo que si devuelve un NULL, es decir, no existe valor, deberá devolver algo que el programa sepa interpretar, en este caso un string vacío, “”.
En el proyecto de Windows Phone puedes poner un simple control y si la función te devulve “” muestras un mensaje de “No hay datos”.
PD: Intentaré analizar tu segundo problema y contestarte lo antes posible. Saludos.
Nada, esta difícil codificarlo para consultar string, la función public string GetData(int value) tampoco ayuda mucho es muy restringido esto.
espero que Pablo ya le haya encontrado solución a esta falla.
Hola Pablo, haber si lo publicas en vb.net
Esta muy claro todo, gracias.
Quiero imprimir el resultado de la SQL en un listbox, como puedo implementar?
Soy nuevo con .net
A principio tengo así:
Service1Client cliente = new Service1Client();
cliente.PuntuacionCompleted += new EventHandler(cliente_PuntuacionCompleted);
void cliente_PuntuacionCompleted(object sender, PuntuacionCompletedEventArgs e)
{
listBox.DataContext= ?;
}
gracias
Ya me funciona:
Service1Client cliente = new Service1Client();
cliente.PuntuacionCompleted += new EventHandler(cliente_PuntuacionCompleted);
cliente.PuntuacionAsync();
void cliente_PuntuacionCompleted(object sender, PuntuacionCompletedEventArgs e)
{
listBox.ItemsSource = e.Result;
}
gracias
Al probar en el dispositivo me da fallo porque esta buscando en localhost, como puedo solucionar esto?
Mi base de datos esta en internet, el servicio tiene que esta tambien?
O hay que agregar el proyecto service en el proyecto de wp7?
Gracias
Estimado,
Tú tienes la conexión de Windows Phone 7 a MYSQL pero en visual.net???
Saludos
Buenas, muchas gracias por el tutorial me sirvió bastante ya que no se encuentra nada de info por Internet, pero estoy realizando una app para WP y la conexión y búsqueda que se hace en este tutorial es usando SQL embebido, me gustaría saber como hacer para hacer la misma conexión a la base de datos externa haciendo persistencia de objetos, para así tener las 3 capas de la aplicación definidas.
Muchísimas gracias.
Hola, estos mismos pasos se aplican para un proyecto de WPF en visual studio? las mismas librerias, biblioteca WCF? Gracias.. espero pronta respuesta
Excelente articulo!!. Ahora mi proyecto es una aplicacion en WP7 y trabajar con una BD dentro del telefono.
Mi problema mayor es que creo el WCF pero al intentar utilizarlo me sale un error “Key not found exception” y no puedo sincronizar datos con mi BD externa (Mysql, windows server 2003).
Gracias por la ayuda