sábado, julio 31, 2010

Operaciones CRUD con SQL Mobile y ADO.NET en Windows Mobile

Hola a tod@s, hoy quiero explicarles como utilizar ADO.NET en Windows Mobile contra una base de datos SQL Mobile.

Este artículo va a ser un poco largo, pero quiero responder aquí muchas de las preguntas que me hacen en los foros donde participo: ¿Cómo creo una base de datos SQL Mobile, cómo inserto registros en esa base de datos, como elimino registros de esa base de datos, como edito o modifico la información, como muestro la información en una grilla?

 

A muchos les parecerá mucho mas fácil trabajar con el control enlazado a datos de Windows Mobile BindingSource, pero considero que no se tiene todo el control que uno debe tener con los datos con este control. Sin embargo como dice un refrán aquí en Colombia “Entre gustos no hay disgustos…”, los que desean hacerlo lo utilizan y cuando una consulta hay que cambiarla se enfrentan a inconvenientes para poder crearla como se necesita.

Estos son mis puntos de vista y todos pensamos y hacemos las cosas diferentes, así que no tomen esto como una regla en sus desarrollos.

 

Este artículo va a tratar de utilizar todas las funciones necesarias de ADO.NET para Windows Mobile a partir del código.

 

Definición Estructura Tabla

Bueno, entonces empecemos con este tema, lo primero que vamos a hacer es definir una estructura de una tabla a la cual vamos a aplicar las operaciones del CRUD (Create, Remove, Update, Display) por sus siglas en inglés.

Nuestra tabla es una tabla de contactos personales la cual va a contener las siguientes columnas:

  • Id, entero, auto numérico y llave de la tabla
  • Nombre, nvarchar de 150 caracteres de longitud
  • Direccion, NVarchar de 150 caracteres de longitud
  • Telefono, NVarchar de 10 caracteres de longitud
  • Celular, Nvarchar de 10 caracteres de longitud

Habiendo definido nuestra tabla o nuestras tablas, vamos a recordar como crear por código la base de datos en la PDA, y luego como aplicar los diferentes métodos de ADO.NET para el manejo de los datos.

 

Creación del Proyecto a desarrollar

Empecemos, abrimos nuestro ambiente de desarrollo Visual Studio 2008, para esto y seleccionamos crear un nuevo proyecto:

image

No muestra la pantalla de seleccionar el tipo de proyecto a crear:

image

En esta pantalla seleccionamos el lenguaje sobre el cual vamos a trabajar, también el tipo de proyecto a desarrollar, como vemos en la imagen seleccionamos Smart Device, que es el tipo de proyecto para Windows Mobile.

Además le asignamos un nombre al proyecto, pueden observar en la imagen que en las plantillas solo aparece una como “Proyecto de Smart Device”, en el siguiente paso vamos a seleccionar ya el tipo de proyecto dentro de esta plantilla.


Al presionar el botón Aceptar nos muestra la siguiente pantalla :

image

En la parte superior y esto solo es a partir de Visual Studio 2008, nos permite seleccionar la plataforma de destino ( Platform Target)  y la versión del .NET Compact Framework para el cual vamos a desarrollar.

Luego de haber seleccionado estos datos vamos seleccionar el tipo de aplicación a desarrollar, como vamos a crear una aplicación para windows mobile, debemos seleccionar la plantilla de Aplicación de Dispositivo.

image
De acuerdo a los diferentes SDK de Windows Mobile instalados en nuestro PC de desarrollo, esta lista puede tener las opciones que aparecen o menos, en mi caso tengo instalados los SDK de Windows Mobile versión 2003, 5 y 6 Professional y Standard (antes llamado smart phone).

Vamos a seleccionar la plataforma Windows Mobile 6 Profesional SDK.

image

Para el caso de la versión del CF.NET sobre la cual vamos a desarrollar, vamos a seleccionar la versión 3.5, y le damos clic al botón de Aceptar de esta pantalla para que nos abra nuestro ambiente de desarrollo y el formulario para empezar a desarrollar nuestra aplicación.

image

Como podemos apreciar en la imagen el formulario creado por default en su parte superior derecha tiene una equis “X”, esto significa que se va a minimizar el formulario al presionarla, no se va a cerrar la aplicación como deseamos, para esto vamos a ir al panel de propiedades y vamos a cambiar la propiedad MinimizeBox a False.

image
Con esto nuestro formulario muestra un botón de OK, que si permite cerrar la aplicación cuando hagamos clic sobre el.

image

Después de haber configurado nuestro formulario, lo primero que debemos hacer es adicionar a nuestra solución la referencia al espacio de nombres que maneja las bases de datos SQL Mobile, por defecto esta referencia no viene en los proyectos.

image 

Para adicionar la referencia hacemos clic derecho sobre “References” y nos muestra la lista de todos los assemblies que podemos utilizar en nuestro desarollo.

image

Y ubicamos en la lista System.Data.SqlServerCe, lo seleccionamos y presionamos el botón de Aceptar de la ventana:

image

Con esto este Espacio de nombre ya queda incluido en las referencias:

image

Hacemos doble clic sobre el formulario para que se abra la ventana de código en el evento load de la forma, aquí vamos a verificar que exista la base de datos .sdf, que es la extensión de los archivos de SQL Mobile.

Para esto necesitamos incluir el using de System.IO al principio de la clase que maneja el formulario, para poder hacer uso de la función que verifica si un archivo existe o no en el sistema de archivos de Windows Mobile.

Además necesitamos los using de System.Configuration y System.Reflection, para obtener la ruta en la cual se encuentra el ejecutable de la aplciación y verificar que el archivo .sdf se encuentre en esa misma ruta.

Por ultimo necesitamos el using de System.Data.SqlServerCe, para poder tener acceso al proveedor de datos y realizar las operaciones necesarias sobre la base de datos.

 

Verificar si el archivo .sdf existe

 


 

using System.IO; 
using System.Configuration;
using System.Reflection;
using System.Data.SqlServerCe;


namespace CRUDWMCS
{
public partial class Form1 : Form
{
// Obtengo por Reflexion la ruta completa del archivo .exe
String nombreExe = Assembly.GetExecutingAssembly().GetName().CodeBase;
String ruta = String.Empty;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
// Obtengo la ruta del archivo .exe
ruta = nombreExe.Substring(0, nombreExe.LastIndexOf(
@"\") + 1);
if (!File.Exists(ruta + "
DemoBD.sdf
"))
{
// Instancio SqlCeENgine para crear la base de datos .sdf
SqlCeEngine engine = new SqlCeEngine("
Data Source= " + ruta + "DemoBD.sdf;"););

}
}
}
}





Luego  de obtener la ruta del archivo .exe, en la variable ruta de tipo String, pregunto si el archivo no existe, haciendo uso de File.Exist, si esta condición es verdadera procedemos a crear la base de datos.

 



 



Crear la base de datos:



Creamos el archivo de base de datos con estas instrucciones:






// Instancio SqlCeENgine para crear la base de datos .sdf 
SqlCeEngine engine = new SqlCeEngine("Data Source= " + ruta + "DemoBD.sdf;"););
engine.CreateDatabase();
engine.Dispose();



 




Luego procedemos a crear la tabla que vamos a necesitar, para esto utilizando ADO.NET, abrimos una conexión a la base de datos, creamos un comando para ejecutar la instrucción de creación de la tabla en la base de datos y por ultimo cerramos la conexión a la base de datos.

 



A continuación como queda el código del evento Load de la forma en la cual se crea la base de datos y la tabla a utilizar:



 






private void Form1_Load(object sender, EventArgs e) 
{
// Obtengo la ruta del archivo .exe
ruta = nombreExe.Substring(0, nombreExe.LastIndexOf(
@"\") + 1);
if (!File.Exists(ruta + "
DemoBD.sdf
"))
{
// Instancio SqlCeEngine para crear la base de datos .sdf
SqlCeEngine engine = new SqlCeEngine("
Data Source= " + ruta + "DemoBD.sdf;
");
engine.CreateDatabase();
engine.Dispose();

// Instancio la conexion a la base de datos
SqlCeConnection conn = new SqlCeConnection();
StringBuilder sbQuery = new StringBuilder();
SqlCeCommand cmd = new SqlCeCommand();
try
{
// Indico la cadena de conexion a utilizar para abrir la base de datos SQL Mobile
conn.ConnectionString = "
Data Source= " + ruta + "DemoBD.sdf;
";
// Abro la conexion a la base de datos
conn.Open();

// Creo la sentencia SQL a utilizar
sbQuery.Append("
CREATE TABLE Contactos(
");
sbQuery.Append("
Id int IDENTITY(1,1) NOT NULL
");
sbQuery.Append("
,Nombre nvarchar(150) NOT NULL
");
sbQuery.Append("
,Direccion nvarchar(150) NOT NULL
");
sbQuery.Append("
,Telefono nvarchar(10) NOT NULL
");
sbQuery.Append("
,Celular nvarchar(10) NOT NULL
");
sbQuery.Append("
, CONSTRAINT CONTACTOS_PK PRIMARY KEY
");
sbQuery.Append("
(
");
sbQuery.Append("
Id
");
sbQuery.Append("
)
");
sbQuery.Append("
)
");

// Configuro el objeto commando para ejecutar la sentencia SQL
cmd.CommandText = sbQuery.ToString();
// Asigno la conexion al objeto commando
cmd.Connection = conn;
// Ejecuto la instruccion
cmd.ExecuteNonQuery();

conn.Close();
conn.Dispose();
}
catch (SqlCeException sqlEx)
{
MessageBox.Show("
Ha ocurrido una excepción:\r\n" + sqlEx.Message, "Abriendo Base de Datos");
return;
}
}
}






Si ejecutamos nuestra aplicación hasta este momento vamos a observar en el directorio el archivo de la base de datos.



image image



imageimage



En las imágenes anteriores podemos observar que la base de datos se creo de manera correcta al igual que la tabla.



Recapitulando un poco:



Para crear la base de datos: se necesita el objeto SqlCeEngine de ADO.NET para SQL Mobile.



Para crear la tabla por código: Se necesita:




  • un objeto SqlCeConnection que establece y abre la conexión con la base de datos SQL Mobile.


  • un objeto SqlCeCommand que permite ejecutar las sentencias SQL contra la base de datos utilizando el objeto SqlCeConnection creado en el paso anterior.



Ahora que ya tenemos la base de datos con su tabla creada, vamos a crear una opción en el menú para adicionar registros a nuestra tabla, para esto vamos a adicionar al menú la opción Adicionar y vamos a crear un panel para la captura de los datos.



image



Además vamos a adicionar un Panel que nos servirá para simular una ventana con los datos a capturar.



image


Dentro del panel vamos a colocar controles label y controles TextBox que nos permitan capturar los datos de diferentes datos de la tabla. Nuestro panel de captura va a quedar de al siguiente manera:



image



En el evento click del botón grabar vamos a colocar toda la lógica de la grabación de los datos, a continuación el código del botón:



Adicionar Registro






// Grabar los datos en la tabla 
private void btnGrabar_Click(object sender, EventArgs e)
{
SqlCeConnection conn = new SqlCeConnection();
StringBuilder sbQuery = new StringBuilder();
SqlCeCommand cmd = new SqlCeCommand();

try
{
// Indico la cadena de conexion a utilizar para abrir la base de datos SQL Mobile
conn.ConnectionString = "Data Source= " + ruta + "DemoBD.sdf;";
// Abro la conexion a la base de datos
conn.Open();

// Creo la sentencia SQL a utilizar
sbQuery.Append("INSERT INTO Contactos ( ");
sbQuery.Append(" Nombre ");
sbQuery.Append(" ,Direccion ");
sbQuery.Append(" ,Telefono ");
sbQuery.Append(" ,Celular ");
sbQuery.Append(" ) VALUES ( ");
sbQuery.Append(" '" + txtNombre.Text + "'");
sbQuery.Append(" ,'" + txtDireccion.Text + "'");
sbQuery.Append(" ,'" + txtTelefono.Text + "'");
sbQuery.Append(" ,'" + txtCelular.Text + "'");
sbQuery.Append(" ) ");

// Configuro el objeto commando para ejecutar la sentencia SQL
cmd.CommandText = sbQuery.ToString();
// Asigno la conexion al objeto commando
cmd.Connection = conn;
// Ejecuto la instruccion
cmd.ExecuteNonQuery();

LimpiarCampos();
}
catch (SqlCeException sqlEx)
{
MessageBox.Show("Ha ocurrido una excepción:\r\n" + sqlEx.Message, "Grabando Datos");
}
finally
{
conn.Close();
conn.Dispose();
}
}







En este código utilizamos los objeto SqlCeConnection para establecer al conexión con la base de datos, SqlCeCommand para ejecutar la instrucción INSERT en la tabla y adicionar los datos del contacto, como siempre todo esto debe estar dentro de un bloque try… catch para capturar las excepciones si llega a ocurrir alguna al momento de ejecutar el comando.





El método LimpiarCampos() lo que hace es limpiar los controles textbox utilizados.



 



Editar o Modificar Datos





Para la edición de los datos, vamos a crear un nuevo Panel y dentro colocar los controles necesarios para poder realizar estas modificaciones al registro, además un campo para pedir el ID del registro y traer los datos y editarlos.



La pantalla de edición queda de esta manera:



image




Buscar un Contacto



El botón buscar ejecuta una sentencia SELECT contra la tabla de Contactos para ubicar el ID digitado, si no lo encuentra muestra un mensaje indicando esta situación, si lo encuentra rellena los controles con los valores obtenidos de la base de datos.



Para realizar esta operación, abrimos la conexión ala base de datos a través de SqlCeConnect, y utilizando un SqlCeCommand ejecutamos una sentencia contra la base de datos, como esta sentencia a diferencia de las anteriores si devuelve un resultado, que será el registro que estamos buscando, utilizamos el método ExecuteReader del objeto Comando para esta operación.



En nuestro programa declaramos una variable de tipo IDataReader para que pueda recibir los datos y procesarlos de acuerdo a nuestras necesidades.



Una vez tenemos los datos en el DataReader los leemos y llenamos los controles textbox con sus correspondientes valores.



A continuación el código del botón Buscar:






        // Boton Buscar un registro de acuerdo al id
private void btnBuscar_Click(object sender, EventArgs e)
{
SqlCeConnection conn = new SqlCeConnection();
StringBuilder sbQuery = new StringBuilder();
SqlCeCommand cmd = new SqlCeCommand();
IDataReader dr;

try
{
// Indico la cadena de conexion a utilizar para abrir la base de datos SQL Mobile
conn.ConnectionString = "Data Source= " + ruta + "DemoBD.sdf;";
// Abro la conexion a la base de datos
conn.Open();

// Creo la sentencia SQL a utilizar
sbQuery.Append("SELECT Id ");
sbQuery.Append(" ,Nombre " );
sbQuery.Append(" ,Direccion ");
sbQuery.Append(" ,Telefono " );
sbQuery.Append(" ,Celular " );
sbQuery.Append("FROM Contactos ");
sbQuery.Append(" WHERE ID = " + txtID.Text);

// Configuro el objeto commando para ejecutar la sentencia SQL
cmd.CommandText = sbQuery.ToString();
// Asigno la conexion al objeto commando
cmd.Connection = conn;
// Ejecuto la instruccion
dr = cmd.ExecuteReader();

while (dr.Read())
{
txtEditNombre.Text = dr["Nombre"].ToString();
txtEditDireccion.Text = dr["Direccion"].ToString();
txtEditTelefono.Text = dr["Telefono"].ToString();
txtEditCelular.Text = dr["Celular"].ToString();
}
// Cierro el DataReader
dr.Close();

if(txtEditNombre.Text == String.Empty)
MessageBox.Show("Registro no Existe, Verifique.", "Editar Contactos");
}
catch (SqlCeException sqlEx)
{
MessageBox.Show("Ha ocurrido una excepción:\r\n" + sqlEx.Message, "Grabando Datos");
}
finally
{
// Cierro la conexion
conn.Close();
conn.Dispose();
}
}









Ahora que ya podemos ubicar o buscar un registro dentro de nuestra tabla de contactos, podemos cambiar los diferentes datos del registro y grabar las modificaciones, para esto vamos a codificar el botón grabar del panel de Edición de los datos.



A continuación el código para grabar los datos modificados:







        // Boton grabar los cambios en el registro
private void btnEditGrabar_Click(object sender, EventArgs e)
{
SqlCeConnection conn = new SqlCeConnection();
StringBuilder sbQuery = new StringBuilder();
SqlCeCommand cmd = new SqlCeCommand();

try
{
// Indico la cadena de conexion a utilizar para abrir la base de datos SQL Mobile
conn.ConnectionString = "Data Source= " + ruta + "DemoBD.sdf;";
// Abro la conexion a la base de datos
conn.Open();

// Creo la sentencia SQL a utilizar
sbQuery.Append("UPDATE Contactos SET ");
sbQuery.Append(" Nombre " + "= '" + txtNombre.Text + "'");
sbQuery.Append(" ,Direccion " + "= '" + txtDireccion.Text + "'");
sbQuery.Append(" ,Telefono " + "= '" + txtTelefono.Text + "'");
sbQuery.Append(" ,Celular " + "= '" + txtCelular.Text + "'");
sbQuery.Append(" WHERE ID = " + txtID.Text);

// Configuro el objeto commando para ejecutar la sentencia SQL
cmd.CommandText = sbQuery.ToString();
// Asigno la conexion al objeto commando
cmd.Connection = conn;
// Ejecuto la instruccion
cmd.ExecuteNonQuery();

LimpiarCamposEdit();

MessageBox.Show("Registro Editado de manera Correcta", "Editar Contactos");
}
catch (SqlCeException sqlEx)
{
MessageBox.Show("Ha ocurrido una excepción:\r\n" + sqlEx.Message, "Grabando Datos");
}
finally
{
conn.Close();
conn.Dispose();
}
}







Como podemos apreciar en el código anterior, armamos un sentencia SQL UPDATE para modificar los datos de nuestra tabla, aquí una de las´partes más importantes es el WHERE, tengan muy presente que si hacemos una sentencia UPDATE sin un WHERE se aplicaran los cambios a todos los registros de la tabla, por esto es muy importante esta sentencia en un UPDATE.



 



Eliminar Registros de la Tabla



Para eliminar los registros, vamos al menú y creamos una nueva opción de Eliminar, esta opción va a llamar nuevamente al panel de edición, pues todo nos sirve,  el botón de buscar, la rutina que rellena los controles con al información guardada en la base de datos, el botón de cancelar o salir, únicamente vamos a crear un código que si se llama desde al opción Eliminar el texto del botón grabar cambia a “Eliminar” y se realizará la acción de eliminar el registro.



Al eliminar vamos a verificar que el campo de Nombre no este vacío, esto nos garantizará que no ocurra un error al intentar eliminar un registro sin verificarlo. A continuación el código de eliminar:






 else
{
// VERIFICO QUE HAYA CONSULTADO A ALGUIEN
if (txtEditNombre.Text == String.Empty)
{
MessageBox.Show("No ha Seleccionado un Contacto para eliminar", "Eliminando Contactos");
return;
}

// Eliminar el registro de la Tabla de Contactos
try
{
// Indico la cadena de conexion a utilizar para abrir la base de datos SQL Mobile
conn.ConnectionString = "Data Source= " + ruta + "DemoBD.sdf;";
// Abro la conexion a la base de datos
conn.Open();

// Creo la sentencia SQL a utilizar
sbQuery.Append("DELETE FROM Contactos ");
sbQuery.Append(" WHERE ID = " + txtID.Text);

// Configuro el objeto commando para ejecutar la sentencia SQL
cmd.CommandText = sbQuery.ToString();
// Asigno la conexion al objeto commando
cmd.Connection = conn;
// Ejecuto la instruccion
cmd.ExecuteNonQuery();

LimpiarCamposEdit();

MessageBox.Show("Registro Eliminado de manera Correcta", "Eliminar Contactos");
}
catch (SqlCeException sqlEx)
{
MessageBox.Show("Ha ocurrido una excepción:\r\n" + sqlEx.Message, "Eliminando Datos");
}
finally
{
conn.Close();
conn.Dispose();
}
}







Como se puede apreciar es el else del botón de Editar, pues recuerden que estamos utilizando la misma forma que en editar.









 



Desplegar Datos en una Grilla



Por último vamos a crear una nueva opción en el menú que nos permita listar todos los registros de la tabla para colocarlos dentro de un control ListView, que de acuerdo a las pruebas que yo he realizado es mucho mas rápido en Windows Mobile que un control datagrid, aquí nuevamente, les digo si necesita o prefieren utilizar un control datagrid lo pueden utilizar pues este si puede ser enlazado a datos (Bindable), esto queire decir que cuenta con una propiedad DataSource, mientras que el control ListView, no cuenta con esta propiedad.



 



Para esto vamos a agregar un nuevo panel al formulario llamado panDisplay y cuya propiedad Visible la vamos a colocar a false igual que los otros, al cual le vamos a asociar un control ListView.



El control ListView lo vamos a configurar para que muestre una lista pues este control puede comportarse para mostrar los mismos datos de diferentes maneras. Para hacer esto, vamos a cambiar la propiedad View del control al valor Details, al hacer esto, aparece una barra de títulos en el control.



También vamos a ubicar la propiedad FullRowSelect y la vamos a colocar a True.



El siguiente paso es configurar las diferentes columnas que va a mostrar el control, para esto vamos a ir a la propiedad Columns, como lo muestra la siguiente imagen:



image



Esto nos muestra una ventana para configurar las diferentes columnas que queremos tenga nuestro control.



image





Utilizamos el botón Agregar para adicionar las columnas que queremos muestre nuestro control ListView.




image


Como se puede apreciar en la imagen, por cada columna podemos cambiar las propiedades que aparecen a la derecha, las propiedades más importantes a cambiar son: Text, que indica el texto de esa columna dentro del control, y Width, que indica el ancho que va a tener esa columna para mostrar los datos, también podremos controlar el alineamiento que va a tener esa columna, por defecto será a la izquierda.



Nuestro formulario se verá de al siguiente forma:



image


Agregamos un botón de Cerrar para cerrar esta pantalla y regresar a la pantalla principal.



El código del ítem del menú que llama esta opción es el siguiente:







        // Menu Mostrar la lista de Contactos en Grilla
private void menuItem6_Click(object sender, EventArgs e)
{
panDisplay.Location = new Point(3, 3);
panDisplay.Visible = true;
CargarDatosGrilla();
}







El método CargarDatosGrilla, se encarga de llenar el control ListView con los datos que existan en la tabla de contactos.




A continuación el código para llenar el ListView con los datos de la tabla











        /// <summary>
/// Metodo que carga los datos de Contactos en al Grilla
/// </summary>
private void CargarDatosGrilla()
{
SqlCeConnection conn = new SqlCeConnection();
StringBuilder sbQuery = new StringBuilder();
SqlCeCommand cmd = new SqlCeCommand();
IDataReader dr;

try
{
// Indico la cadena de conexion a utilizar para abrir la base de datos SQL Mobile
conn.ConnectionString = "Data Source= " + ruta + "DemoBD.sdf;";
// Abro la conexion a la base de datos
conn.Open();

// Creo la sentencia SQL a utilizar
sbQuery.Append("SELECT Id ");
sbQuery.Append(" ,Nombre ");
sbQuery.Append(" ,Direccion ");
sbQuery.Append(" ,Telefono ");
sbQuery.Append(" ,Celular ");
sbQuery.Append("FROM Contactos ");
// Configuro el objeto commando para ejecutar la sentencia SQL
cmd.CommandText = sbQuery.ToString();
// Asigno la conexion al objeto commando
cmd.Connection = conn;
// Ejecuto la instruccion
dr = cmd.ExecuteReader();
// Declaro un objeto ListViewItem, para cargar lso registros en el Control ListView
ListViewItem lvItem = new ListViewItem();

// Limpio el control Listview, antes de empezar a llenarlo
listView1.Items.Clear();
// recorro el dataReader para leer todos los registros
while (dr.Read())
{
// Inicializo el Control
lvItem = new ListViewItem();
// Lleno los datos de la fila del control
lvItem.Text = dr["Id"].ToString();
lvItem.SubItems.Add( dr["Nombre"].ToString());
lvItem.SubItems.Add( dr["Direccion"].ToString());
lvItem.SubItems.Add( dr["Telefono"].ToString());
lvItem.SubItems.Add( dr["Celular"].ToString());

// Agrego la fila al control
listView1.Items.Add(lvItem);
}
// Cierro el DataReader
dr.Close();

}
catch (SqlCeException sqlEx)
{
MessageBox.Show("Ha ocurrido una excepción:\r\n" + sqlEx.Message, "Grabando Datos");
}
finally
{
// Cierro la conexion
conn.Close();
conn.Dispose();
}
}







Bueno espero que con este artículo se aclaren muchas dudas al respecto de como hacer o utilizar ADO.NET en Windows Mobile con el Compact Framewok .NET.



 



En un próximo artículo explicare como utilizar la arquitectura de N-Capas en aplicaciones para Windows Mobile.



Saludos y que lo disfruten!!!

viernes, junio 11, 2010

viernes, abril 23, 2010

[Evento] SIlverLight 4 en acción, lo nuevo!

Hola a todos! El próximo lunes 26 de Abril  nos acompañara Rodrigo Diaz Concha, MVP en SilverLight de México, para darnos un charla sobre las nuevas características de SilverLight 4 y algunos tips.

image

Registrese aqui: http://www.bogotadotnet.org/conferencias/registro.aspx

Hasta la próxima!

martes, diciembre 29, 2009

[Anuncio] Respuesta de Microsoft a Chrome OS

Buenos dias a tod@s, hoy me encuentro con esta noticia de un nuevo sistema operativo que competirá con Chrome de Google y que estará basado en Windows Embbeded CE.

Aqui esta el link de noticiasdot.com con la noticia:

http://www.noticiasdot.com/wp2/2009/12/28/bingos-la-alternativa-de-microsoft-a-chrome-os-de-google/

 

miércoles, noviembre 25, 2009

[TIP SQL] ¿Como obtener el último ID de una Tabla en SQL Server?

 

Hola!!!

Este es un tip que utilizo mucho cuando necesito saber el ultimo ID generado en una tabla con un campo Autonumerico.

Despues del INSERT lanzo la siguiente instruccion :

"SELECT IDENT_CURRENT('" & TableName & "')"

En TableName debe ir el nombre de la tabla de la base de datos encerrado entre comillas sencillas.

 

martes, noviembre 10, 2009

[Noticia] Mono Tools for Visual Studio

 

Hola a tod@s!

Excelentes noticias de parte de Miguel de Icaza y del equipo de MONO!, acaba de sacar Mono Tools for Visual Studio.

Muy interesante las aplicaciones que muestra! hay que probarlas!

Felicitaciones al equipo de MONO!!!

Aqui esta el enlace al blog de Miguel de Icaza:

http://tirania.org/blog/archive/2009/Nov-10.html

lunes, noviembre 09, 2009

[EVENTO]Tu imaginación y tus ideas ponen el mundo digital en movimiento y lo transforman todos los días

 

Hola a tod@s

En nombre propio y de la comunidad de desarrolladores BogotaDotNET, los invito a este evento de Microsoft a los residentes en Bogotá.

Se llevara acabo el próximo Jueves 12 de Noviembre en el Hotel Cosmos – Calle 100 No. 21A-41 Bogotá, Colombia

Los esperamos!!!

 

image

viernes, octubre 09, 2009

[Nota] Orgulloso de pertenecer al Equipo de 3Metas

Hola a todos los que leen este blog.

En esta oportunidad solo quiero compartirles de una manera muy rápida y sencilla el orgullo de pertenecer a una compañia que a pesar de ser bastante nueva en el mercado ha demostrado y trabajado mucho por hacer un excelente trabajo en todos los proyectos en los cuales estamos involucrados.

Me siento orgulloso de contar y de participar en un equipo de trabajo como el que tenemos, en el cual todos dan el 300% y mucho más de lo esperado.

Todo lo anterior por la nominación de una de nuestras campañas como mejor sitio de internet en el 2009.

Aquí hay mas información al respecto:

3Metas News: Nominados como mejor sitio de internet en Colombia en 2009 (http://bit.ly/zMbPB)

 

Felicitaciones a todo el Equipo de 3Metas!!!!

 

viernes, septiembre 04, 2009

[Agradecimiento] SilverLight como Plataforma de Desarrollo

En nombre propio y en nombre de todos los que conformamos el Core y los líderes de la comunidad BogotaDotNET, agradecemos a todos los asistentes a esta interesante charla.

Además nuestro mayor agradecimiento a Rodrigo Díaz Concha por su amable colaboración para esta conferencia y en compartir con todos nosotros sus conocimientos sobre el tema.

Algunas fotos del Evento:

DSC01347 DSC01351 DSC01362 DSC01358 DSC01357 DSC01376

 

El equipo de dirección de la comunidad junto con Rodrigo:

DSC01377 DSC01378

miércoles, septiembre 02, 2009

Instalación de Servicios WCF en Servidor IIS 7

 

Hola a todos!!

En estos días he estado trabajando con servicios WCF, en mi caso los servicios están hospedados (Hosted) en IIS / en una aplicación ASP.NET, para lograr esto existe en ASP:NET un control o servicio WCF cuya extensión es .svc.

Al crear estos archivos y publicar el sitio ASP.NET para tener la disponibilidad de los servicios a través de IIS 7 me encontré con algunos inconvenientes los cuales los resolví aplicando los siguientes pasos.

1. Se crea un sitio web en IIS, se le asigna un puerto específico, en el caso de  este ejemplo es el puerto 81 el que utilizan los servicios WCF. Sin embargo podemos escoger cualquier puerto y verificar que este puerto este abierto en el firewall si los servicios van a estar expuestos a internet.

2. Se copian los archivos publicados de la solución de los servicios en una carpeta específica, que es la misma que se ha definido al momento de crear el sitio web en el IIS.

3. Nos aseguramos que el namespace ServiceModel este activo y registrado en nuestro servidor IIS, para ello abrimos la consola de comandos en modo administrador y ejecutamos el siguiente comando: "%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r –y

4. La ejecución de este comando nos muestra unos resultados como aparece en la siguiente figura:clip_image002

5. Abrimos IIS 7 y seleccionamos el sitio correcto. Se revisan los Handler Mappings como se ve en la figura:

6. clip_image004

7. Doble clic sobre Handler Mapping, aparece la siguiente pantalla:

8. clip_image006

9. En esta pantalla revisar si existen las entradas para la definición de los *.svc, ya que en nuestro caso los Hosting de los servicios WCF son en IIS con ASP.NET.

10. Para crear estos handlers hacemos clic derecho sobre la lista, nos muestra el siguiente menú: clip_image008

11. Seleccionamos la primera opción Add Managed Handler…, nos muestra la pantalla en la cual colocamos los datos a ingresar: clip_image010

12. Los valores a colocar para Request path: *.svc, Type: System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Name: svc-Integrated. Las restricciones las dejamos por default. Este es el primer registro. Debemos colocar otros 2 registros.

13. Los valores a colocar para Request path: *.svc, Type: %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll, Name: svc-ISAPI-2.0. Las restricciones las dejamos por default. Este es el segundo registro.

14. Los valores a colocar para Request path: *.svc, Type: %SystemRoot%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll, Name: svc-ISAPI-2.0-64. Las restricciones las dejamos por default. Este es el tercer registro si es para un servidor de 64 bits en donde ejecutamos nuestro IIS.

15. Luego verificamos si nuestros servicios quedaron funcionando de manera correcta, en la pantalla siguiente: clip_image012

16. Seleccionamos un servicio, como el que se muestra en la figura, clic derecho y en el menú que aparece le damos Browse, lo cual nos abre una ventana del explorador de internet para verificar si nuestro servicio está funcionando de manera correcta.

17. El explorador de internet nos debe mostrar una pantalla como la siguiente: indicando que el servicio está funcionando correctamente.clip_image014

18. El siguiente paso es corregir en el web.config del sitio ASP.NET que hospeda los servicios WCF, las cadenas de conexión a las bases de datos que utilizamos para que nuestros servicios puedan funcionar de manera correcta.

En nuestro caso verificamos la sección ConnectionStrings del web.config y colocamos los valores correctos: <connectionStrings>

<add name="ConnectNETDB" connectionString="Data Source=ralvarado;Initial Catalog=MibaseI;User ID=dbusr_FFII;Password=pqr2; Timeout=999999" providerName="System.Data.SqlClient" />

<add name="ConnectNETDBII" connectionString="Data Source=ralvarado;Initial Catalog=FunzaNetII;User ID=dbusr_FFII;Password=pqr2; Timeout=999999" providerName="System.Data.SqlClient" />

<add name="FaseIIConnectNETDB" connectionString="Data Source=ralvarado;Initial Catalog=FunzaNetII;User ID=dbusr_FFII;Password=pqr2; Timeout=999999" providerName="System.Data.SqlClient" />

</connectionStrings>

19. El siguiente paso es ir a la solución que consume los servicios que estamos exponiendo en el IIS en nuestra solución ASP.NET a través de los archivos *.svc y colocar la dirección correcta de cada uno de los servicios en el app.config si es una aplicación Windows, o en el web.config si es una aplicación web.

Verificamos y cambiamos el endpoint de los Servicios WCF que estemos exponiendo en nuestra aplicación : <endpoint address="http://ralvarado:81/ServicioDemo1.svc"

binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServicioDemo1"

contract="ServicioDemo1Client.IServicioDemo1"

name="WSHttpBinding_IServicioDemo1">

<identity>

<dns value="localhost" />

</identity>

</endpoint>

20. Como podemos observar en el tag address=http://ralvarado:81/ServicioDemo1.svc, hemos cambiado a ralvarado:81 que es el nombre del servidor y el puerto por donde definimos en el sitio que se va a exponer los servicios WCF.

21. Probar nuestra aplicación que consume los servicios para comprobar que todo esté funcionando como debe ser.

22. En nuestra aplicación que consume los servicios debemos también modificar el web.config para colocar la dirección correcta de los servicios publicados..

 

Bueno espero que esto los ayude al momento de publicar los servicios WCF, que como dice un gran amigo “Servicios WCF 1 Hora de desarrollo 3 Horas Configurando”.

Hasta la próxima!!!

Un Abrazo!

martes, septiembre 01, 2009

[Curso]PROGRAMANDO A FONDO CON C#

 

Una de las personas que sabe mucho sobre el tema, es MVP de Microsoft y con auspicio de la comunidad BogotaDotNET esta preparando este curso.

Para mas información http://www.bogotadotnet.org/Cursos/Programando-a-fondo-con-C-.aspx

lunes, agosto 31, 2009

[Evento]Silverlight como plataforma de Desarrollo

¡¡¡..ENTRADA GRATUITA...!!!

clip_image002

En esta ocasión les tenemos una conferencia dictada por un Microsoft MVP de ASP.Net el Señor. Rodrigo Díaz Concha quien es experto en desarrollo con Silverlight.

clip_image004

Silverlight es una tecnología relativamente nueva en el mundo de las Aplicaciones Enriquecidas para Internet, la cual nos permite extender la funcionalidad de nuestras aplicaciones Web a través de un componente ligero, multi-plataforma y multi-navegador.

En esta sesión podrás conocer cuáles son las características de la última versión de Silverlight que la hacen una excelente opción para construir este tipo de aplicaciones. Ven y conoce qué es Silverlight y cómo lo puedes utilizar como plataforma de desarrollo para aplicativos Web modernos.

Fecha: Miércoles 2 de septiembre a las 18:30 (-5 GMT)

Lugar: Auditorio Fundación Universitaria CAFAM

AK 68 N° 90-88 CAFAM Floresta, Bogotá - Colombia

¡¡¡..ENTRADA GRATUITA...!!!

clip_image005

Los Espero !!!!

lunes, junio 22, 2009

Cómo conectarse a un Servidor SQL desde el Emulador de Windows Mobile

Hola, nuevamente escribiendo … hoy haciendo referencia a un problema muy común entre los desarrolladores de Windows Mobile / Windows CE.

Al momento del desarrollo de una aplicación Windows Mobile que se comunique directamente a una base de datos de SQL Server.

Esto es básicamente configuración, luego ya vendría el tema de analizar y corregir la cadena de conexión utilizada a la base de datos.

Bueno empecemos….

Tenemos una aplicación Windows Mobile que se conecta de manera directa a un Servidor de bases de datos SQL Server, estamos probando desde el emulador pues no tenemos físicamente la PDA para realizar pruebas a través  de la red inalámbrica.

Aclaración: Estos pasos funcionan tanto en VS2005 como en VS2008.

Lo primero que debemos hacer es activar una herramienta que se llama “Device Emulator Manager”, esta herramienta nos permite administrar las diferentes conexiones tanto físicas como emuladores que dispongamos en nuestro entorno de desarrollo.

Esta herramienta la encontramos en el menú Tools de nuestro ambiente de desarrollo.

image

En la imagen se puede apreciar que tengo abierto un proyecto y que voy al menú Tools, y aquí selecciono el ítem Device Emulator Manager.

Aparece una ventana con la lista de los diferentes emuladores y /o dispositivos que tenga instalados en mi ambiente de desarrollo:

image

Seleccionamos el emulador a utilizar para nuestra aplicación, en este caso yo utilizo el emulador ”Windows Mobile 6 Professional Emulator”.

Selecciono el menú Actions , y aparece el siguiente menú:

image

De este menú selecciono la opción Connect la cual si no esta abierto el emulador lo abre para establecer la conexión con el.

Al abrir y conectarse al emulador esta ventana cambia y nuestro emulador aparecerá con un icono en la parte izquierda como aparece en la siguiente imagen:

image

Se preguntaran lo siguiente: ¿Si ya he abierto mi emulador ?, entonces simplemente al iniciar el Device Emulator Manager se actualizara la conexión.

En nuestra barra de tareas de Windows, podemos apreciar que el “Device Emulator Manager” se encuentra en ejecución, pues nos muestra el siguiente icono en la barra de tareas:

image

Bueno una vez que ya nuestro emulador se encuentre conectado, nos falta 1 solo paso para poder conectarlo a la red y poder tener acceso a nuestro servidor de base de datos que se encuentra ubicado en nuestro PC de desarrollo o en algún otro PC de la red en la cual nos encontramos.

Para lograr esto, hacemos clic derecho sobre el nombre del emulador conectado, esta acción nos muestra un menú contextual como el siguiente:

image

Lo que debemos hacer aquí es seleccionar la opción “Cradle” con lo cual incluimos el emulador dentro de la red y ya podremos establecer la conexión con el servidor de SQL que necesitamos.

image

Al hacer clic en “Cradle” , la imagen del emulador conectado cambia y lanza en mi caso Windows Mobile Device Center, pues mi ambiente es Windows Vista, si estuvieran trabajando sobre Windows XP, se lanzaría el programa ActiveSync. Esto lo apreciamos en la imagen anterior.

En mi caso la pantalla de Windows Moble Device Center aparece como cuando tengo conectado un dispositivo físico en el PC:

image

Esto es lo que nos permite tener acceso al servidor de base de datos desde el emulador.

En este ejemplo tengo una base de datos SQL 2008 en mi servidor que es mi portátil, y estoy llamando a una aplicación que es la que observan en la imagen siguiente mostrando los datos de la tabla de contactos.

A continuación la pantalla de SQL Management Studio con la información de la tabla y sus registros

image

La imagen de la aplicacion que se ejecuta en el emulador en donde carga los datos de la tabla de contactos desde el servidor SQL Server 2008 de mi portátil: 

image 

Esta misma técnica funciona para probar los web services que vamos a consumir desde una aplicación Windows Mobile.

Espero que con esto se aclaren la manera de poder probar desde el emulador estas dos cosas que antes era muy complicado de hacerlo si no teníamos a la mano un dispositivo físico.

Hasta la próxima!!!

sábado, junio 06, 2009

[Anuncio:] Windows Mobile 6.5 Developer Toolkit (DTK) disponible para descargar.

Hola !

Este nuevo set de herramientas para desarrollo no es un SDK, trae un nuevo set en la API que permite a los desarrolladores tomar ventajas del nuevo framework  para gestión de “touch” de la pantalla.


Debe ser utilizado en conjunto con Visual Studio 2008 y el Windows Mobile 6 SDK.

En cuanto a los emuladores les puedo adelantar que la versión Standard de Windows Mobile 6.5 Developer Toolkit soporta pantallas QVGA, mientras que la versión Professional soporta resoluciones para: QVGA, WQVGA, VGA y WVGA.

Para bajar el instalador de este SDK, pueden hacerlo desde la pagina de descarga de Microsoft: Sitio oficial de Microsoft se puede descargar en los siguientes idiomas: Español, Ingles, Alemán, Italiano, Francés.

 

Etiquetas de Technorati: ,,