jueves, julio 07, 2011

NETCF: Conectar con un servidor SQL Server remoto

En este blog he publicado varios posts relacionados con los problemas que se presentan a la hora de conectar una aplicacion de Windows Mobile con un servidor SQL Server mediante la red WiFi.

Ahora quisiera anadir uno mas para la lista. Resulta que en muchas redes, debido a alguna configuracion que desconozco, WM es incapaz de resolver un nombre de host, es decir, que si intentamos conectarnos con una cadena como esta:

Server=AdminServer;uid=sa;pwd=sasa;Database=SysData;

WM deberia ser capaz de resolver el nombre AdminServer y obtener su IP real. Como decia, esto no siempre es posible y, cuando WM no puede resolver el nombre, el resultado es el muy conocido error SQL Server Not Found.

Seguramente hay varias formas de resolver esto. En mi caso, opte por intentar resolver el nombre del server y, de ser necesario, solicitar al usuario el IP de dicho server. Con ambos datos, creo una entrada en el archivo Hosts del Windows Mobile a fin de asegurarme que siempre podra resolver el nombre del server, independientemente de la configuracion de la red.

Para hacer esto, necesitamos dos cosas:

a) Dado un nombre de host, como obtener su direccion IP:
using System.Net;
private string resolveHost(string host)
{
  string hostIP = string.Empty;
  try
  {
      IPHostEntry IPHost = Dns.GetHostEntry(host);
      hostIP = IPHost.AddressList[0].ToString();
  }
  catch (System.Net.WebException webEx)
  {
       MessageBox,Show(webEx.Message);
  }
  catch (System.Exception othEx)
  {
       MessageBox.Show(othEx.Message);
  }

  return hostIP;
}

b) Habiendo obtenido el IP, bien sea por resolucion del host o porque el usuario lo indico, procedemos a crear una entrada en el archivo Hosts (que en WindowsMobile se maneja a nivel del Registry):
using Microsoft.Win32;

string hostName = "AdminServer";
string hostIP = "192.168.2.2";
string regKeyName = "HKEY_LOCAL_MACHINE\\Comm\\Tcpip\\Hosts\\" + hostName;
byte[] regKeyValue = System.Net.IPAddress.Parse(hostIP).GetAddressBytes();
Registry.SetValue(regKeyName, "ipaddr", regKeyValue, RegistryValueKind.Binary);


Otro As bajo la manga a la hora de resolver este problema tan molesto.


1 comentario:

Juan Pablo Iparraguirre Iparraguirre dijo...

Hola, es muy interesante leer tus articulos. la razón del comentario es que estoy interesado en adquirir tu clase para impresión en impresoras matriciales DOSPrint 4, espero tener algun alcance. Mi correo es iparraguirre89@hotmail.com.
Te agradecería mucho alguna respuesta.
Saludos.

Juan Pablo Iparraguirre.