Microsoft SQL Server 2005 Compact Edition Access Database Synchronizer disponible

Como complemento a la nueva versión de SQL CE (la base de datos compacta pensada para usar principalmente en dispositivos Windows Mobile), han liberado recientemente una herramienta que puede resultar muy interesante en ciertos casos.


Como la mayoría que haya usado SQL CE sabrá, SQL CE se puede sincronizar con bases de datos SQL Server. La base de datos SQL CE se conecta con el servidor SQL Server vía HTTP y permite sincronizar su contenido con el servidor.


Según se publica en el blog de SQL CE, esta nueva herramienta permite realizar una sincronización similar pero con bases de datos Access. Esto permite que, por ejemplo, dispongamos de una aplicación móvil con SQL CE y, al conectar el dispositivo móvil al PC, la base de datos del dispositivo se sincronice con una base de datos Access en nuestro PC.


Esta sincronización se realiza con las siguientes características:



  • La conversión de tipos de datos entre SQL CE y Access se realiza en el momento de hacer la sincronización.

  • Es necesaria una conexión de ActiveSync para que la sincronización se produzca.

  • No es necesario instalar nada en el dispositivo. Simplemente hay que instalar software en el PC.

  • La sincronización se basa en RDA (RDA es uno de los métodos de sincronización disponibles; en SQL Server se cuenta con RDA y Merge).

  • Una aplicación existente en una PDA se puede hacer que sincroniza con SQL Server o Access simplemente cambiando los parámetros de sincronización, pero no es necesario modificar nada más.

  • No existe resolución de conflictos.

 


Aún no la he usado mucho, pero tengo en mente un par de casos donde me podría resultar útil, ya veremos…


Si la queréis probar está disponible aquí.

Visual Studio 2005 Service Pack 1 Update para Windows Vista ya disponible

Si sois como yo y ya usáis Windows Vista como sistema principal, habréis visto que, incluso después de instalar el Service Pack 1 de Visual Studio 2005, éste se sigue quejando al arrancar de no ser compatible con el S.O. Hasta ayer existía un parche en beta que ya han liberado completamente y que podéis descargar e instalar.


Es necesario que antes de instalar este parche hayáis instalado el Service Pack 1 de Visual Studio.

SQL Server Compact Edition (SQL CE) ya disponible

Coincidiendo con el lanzamiento de Visual Studio 2005 Service Pack 1, Microsoft ha liberado SQL Server Compact Edition (antes SQL Server Everywhere) cuya principal novedad, como ya comenté anteriormente, es la posibilidad de disponer de bases de datos SQL CE (archivos con extensión .sdf) tanto en el PC como en dispositivos móviles (Pocket PCs, SmartPhones, …) con una base de código común. Esto abre un interesante abanico de posibilidades y nuevos escenarios que hasta ahora no eran posibles.

Además de SQL CE, se han liberado las herramientas de desarrollo correspondientes que faciliten el desarrollo de estas soluciones.

Control .NET para animar el UI al realizar operaciones asíncronas

Cada vez es más común realizar operaciones asíncronas, gracias en parte a la llegada de la Web, donde no podemos bloquear una aplicación simplemente porque esté haciendo una operación de red que no sabemos el tiempo que va a tardar en concluir, como una llamada a un servicio Web. Cuando realizamos una aplicación de este estilo, hay que ‘mantener al usuario entretenido’ de alguna forma, para que sepa que la operación está teniendo lugar y que la aplicación no se ha quedado ‘colgada’, idealmente dando la posibilidad de cancelar la tarea.


Una manera de indicar que se está realizando una operación de este estilo que me gustó hace tiempo fue la que implementa la ventana de inicio de sesión de SQL Server Management Studio, donde se ve una pequeña barra que muestra un gradiente de colores animado mientras se está validando al usuario.



Este UI es muy poco intrusivo y muestra claramente la intención. De hecho, en Outlook 2007 se ha copiado y se puede ver encima del panel de lectura de un mensaje cuando Outlook tarda en abrir el mensaje por cualquier motivo.


Siguiendo esta idea, cree un control hace tiempo para un proyecto, mostrando una barra animada mientras se está accediendo a un servicio Web. Os dejo aquí la implementación que realizé. Consiste en un control que expone tres propiedades ForeColor, MiddleColor y BackColor. El control crea un gradiente entre los tres colores en toda su superficie, quedando estéticamente bien cuando el tamaño del control es alargado y estrecho. Luego expone dos métodos, Animate y StopAnimation que lo animan. La animación realizada hace que el gradiente ‘rebote’ de lado a lado de la barra horizontal.


Adjunto al control un proyecto de prueba donde se puede ver enseguida lo que hace. No lo he portado aún a .NET Compact Framework, pero no creo que sea difícil si alguien lo quiere hacer.


Espero que resulte interesante.

¿Un lector RSS para Pocket PC gracias a Outlook 2007? ¡¡¡Casi!!!

Como ya sabréis, Outlook 2007 dispone de un lector de RSS integrado que permite descargar ‘feeds’ rss que aparecen en una carpeta dentro del buzón, como podéis ver en la imagen, como si fuesen mensajes de correo.



Da la casualidad de que si se sincroniza un Pocket PC con el correo de Outlook 2007, se le puede indicar al Pocket PC que sincronice esas carpetas también, disponiendo así de un lector de RRS offline bastante interesante ya que podríamos llevarlos las noticias para leer por ejemplo en el metro, como se puede ver en esta imagen.



Pero existe una gran pega y es que la mayoría de los feeds RSS que encontraremos muestran HTML en las publicaciones, y, desgraciadamente, el lector de correo de Windows Mobile es incapaz hasta el momento de leer correo HTML con lo que hace prácticamente inviable su uso ya que, como se puede ver en esta otra imágen, se muestra el texto con un formato que, si contiene links como en este caso, hace bastante difícil su lectura.



Esperemos que en las nuevas versiones de Windows Mobile se incluya la posibilidad de leer correo HTML para que esto se convierta en una realidad. De todas formas, si dispones de feeds RSS que publiquen contenido en texto plano, esta es una buena opción para llevártelas donde sea.

Día de lanzamientos de Microsoft

Hasta el momento hoy se han anunciado varios lanzamientos que pueden resultaros interesantes.

Por un lado, ya está disponible el redistribuible de .NET Framework 3.0, incluyendo novedades como WPF (Windows Presentation Foundation, ó Avalon), WCF (Windows Communication Foundation, ó Indigo) y WWF (Windows Workflow Foundation).

Por otro lado, también está disponible la RC1 de SQL Server Compact Edition (aunque al instalarla aparece aún como SQL Server Everywhere).

Además, Office 2007 ya es RTM (versión final) y se ha anunciado en las subscripciones MSDN que todos los subscriptores tendrán disponibles tanto Office 2007 como Windows Vista para descargar en un plazo de 7 días después del anuncio, así que habrá que estar al tanto.

Finalmente, hoy empieza el TechEd en Barcelona (donde hay varias presentaciones sobre Windows CE 6.0 que se lanzó la semana pasada), con lo que probablemente se producirán más anuncios interesantes a lo largo de los próximos días; pondremos la antena a ver qué se cuece.

De SQL Server CE a SQL Mobile a SQL Everywhere a SQL Compact Edition (SQL CE)

Así es, la versión compacta de SQL Server vuelve a cambiar de nombre, al parecer para quedarse con SQL Compact Edition. Tenéis todos los detalles en el blog de Steve Lasker.

Al parecer, estará disponible en pocas semanas la versión 3.1, cuya ventaja principal es la de poder usarse en cualquier entorno, incluido Windows 2000. Ya están planificadas también las demás versiones con cambios en el motor de sincronización y la posibilidad de adaptarse a más situaciones.

Otra forma (mejor) de obtener la versión del sistema operativo usando .NET Compact Framework

Si habéis leído mi post anterior probablemente habréis comprobado mi tendencia a usar en muchas ocasiones el camino más largo para llegar a un sitio dado.

Como era de esperar, esto también funciona en .NET Compact Framework:

 

System.Environment.OSVersion.Version

(un poco más facil que lo anterior ¿no?)

 

Esta propiedad devuelve un objeto de tipo Version que tiene sobrescrito el método ToString para obtener el string de versión habitual (x.x.xxxx); aunque también da acceso a los diferentes componentes de la versión.

Como bonus, podéis examinar un poco más la clase Environment y veréis que podéis obtener lo siguiente:

  • Versión del runtime de .NET en ejecución – System.Environment.Version
  • Directorios especiales (necesarios para acceder a los directorios en caso de que se ejecute la aplicación en equipos con diferentes idiomas, ej. "Startup" vs "Inicio") – Enum System.Environment.SpecialFolder, usado con la función System.Environment.GetFolderPath
  • Tiempo que lleva el equipo encendido – System.Environment.TickCount

 

Recordatorio final: Antes de hacer nada, mirar si ya está implementado, antes de hacer nada, mirar si ya está implementado, antes de hacer nada, mirar si ya está implementado, antes de hacer nada, mirar si ya está implementado, antes de hacer nada, mirar si ya está implementado, antes de hacer nada, mirar si ya está implementado.

Una forma de obtener la versión del sistema operativo usando .NET Compact Framework

A veces es necesario saber la versión del sistema operativo sobre la que está ejecutándose una aplicación .NET para tomar alguna deción sencilla. El ejemplo más claro que me he encontrado recientemente es el de usar la función Bitmap.Save en .NET Compact Framework para guardar un Bitmap a disco. Si se lee la documentación de esta función, se indica que se le puede pasar un parámetro de tipo ImageFormat (un enum) diciéndole el tipo de imagen a guardar. Entre los diferentes valores del enum se dispone de PNG por ejemplo. Pero si se intenta guardar un bitmap usando el formato PNG en un dispositivo Windows Mobile 2003 (cuya base de sistema operativo es Windows CE 4.2) obtendremos una excepción en tiempo de ejecución (NotSupportedException) ya que en Windows CE 4.2 GDI no dispone de la posibilidad de tratar PNGs. En cambio, si se ejecuta ese código en un dispositivo Windows Mobile 2005, basado en Windows CE 5.0, funcionará sin problemas.

Para evitar estos problemas basta con que detectemos la versión del sistema operativo para escoger un formato de imagen u otro dependiendo del tipo de dispositivo que sea.

Una forma de obtener rápidamente la versión del sistema operativo es mediante la función GetVersionEx del API de Windows. Su declaración sería similar a lo siguiente:

[DllImport("coredll.dll")]
public static extern int GetVersionEx(byte[] lpVersionInfo);

Si se busca la documentación de esta función, como parámetro se pide una estructura de tipo OSVERSIONINFO. En este caso (como en muchos otros en los que el API requiere estructuras) resulta casi más fácil pasarle a la función como parámetro un array de bytes que luego la función rellenará. Lo que necesitamos saber, eso si, es el tamaño del array a pasar, que se puede ver en la documentación (sumando los tamaños de los campos de la estructura). Luego, cuando la función rellene el array, se podrá leer fácilmente su contenido usando la clase BitConverter, lo que facilita mucho las declaraciones de p/invoke, ya que no hay que traducir las estructuras a .NET. Esta misma técnica está usada en el ejemplo de Ping para Compact Framework que podéis encontrar aquí.

Teniendo en cuenta esto, el código para obtener la versión será entonces algo parecido a:

byte[] lpVersionInfo = new byte[138];

int resp = GetVersionEx(lpVersionInfo);
if (resp == 1)
{
Int32 dwMajorVersion = BitConverter.ToInt32(lpVersionInfo, 4);
Int32 dwMinorVersion = BitConverter.ToInt32(lpVersionInfo, 8);
Int32 dwBuildNumber = BitConverter.ToInt32(lpVersionInfo, 12);
Int32 dwPlatformId = BitConverter.ToInt32(lpVersionInfo, 16);

}

Para un equipo con Windows Mobile 2003 el valor de dwMajorVersion será 4 y el de dwMinorVersion será mayor o igual a 2 (Windows CE 4.2). En el caso de un equipo Windows Mobile 2005 la versión será mayor o igual a 5.0.

Siguiendo el ejemplo anterior, la función Bitmap.Save pasándo como parámetro un formato de tipo PNG, funcionará sólo para equipos con dwMajorVersion >= 5.