domingo, 9 de noviembre de 2008

Añadir Minutos a TimeStamp en Firebird

Me encontraba moviéndole un poco al Firebird y resultó que necesito añadir X cantidad de minutos a la información contenida por una columna de tipo TimeStamp. Lo lógico era utilizar la unidad 1/3600 para obtener el decimal correspondiente a los minutos (como en cualquier otro DMBS), sin embargo, los intentos fueron infructosos ya que la operación no se ejecutaba correctamente.

Casi desesperado, recordé que debía poner ".0" a los números para que los tomara como decimales y no como enteros. Al realizar lo anterior me encontré que aunque las divisiones las realizaba correctas, solo funcionaban hasta cierta cantidad de decimales. Posteriormente encontré que por lo menos para las fechas, debía escribir el número resultado de la división para encontrar el valor decimal de los minutos en lugar de realizar la división dentro de la consulta, de manera que si quiero añadir 5 minutos a la fecha actual debo utilizar un query como el que aparece a continuación y en el que podrán ver el resultado de utilizar los dos métodos:

select current_timestamp,
current_timestamp+(1.0/3600.0)*5.0 as incorrecto,
current_timestamp+(0.0006944445*5.0) as correcto
from rdb$database;



La versión de Firebird que estoy utilizando es la 2.0 y es donde el query funciona como lo indico, es decir, que falla al realizar la división. Sin embargo, leo por allí que en la versión 2.1 ya han añadido funciones para trabajar más fácilmente con las fechas así como otro montón de funciones básicas que francamente me extraña que no hubieran sido añadidas anteriormente. Algunas de ellas las comentan en el Blog de Johny Suárez.

Las versiones 2.1 de Firebird (embedded, ADO.NET y Server) las pueden encontrar en el sitio de Firebird/IbPhoenix.

Debo comentar que tras haberlas instalado, y reiniciado mi computadora =) la base de datos y el query han funcionado sin problema. Podrían probar con este

select current_timestamp,
current_timestamp+(1.0/3600.0)*5.0 as incorrecto,
current_timestamp+(0.0006944445*5.0) as correcto,
dateadd(SECOND,5,current_timestamp) as mas_correcto
from rdb$database;

Espero que este pequeño post les sirva para ahorrarse dolores de cabeza: recuerden utilizar las versiones más actuales, checar diferencias entre versiones, y si van a realizar un cambio en una base de datos en producción pues hay que tomar las precauciones de necesarias antes de realizar el cambio tales como crear una copia de respaldo de nuestros datos y configuración.

sábado, 1 de noviembre de 2008

Firebird, DBMS con capacidad Embedded

Para una aplicación que estoy por comenzar a desarrollar, necesito algún DMBS (database management system) relacional con procedimientos almacenados y que no tenga limitaciones en su versión gratuita (como algunos que establecen un máximo de 2 ó 4 GB de capacidad), y que además fuera posible utilizarlo “embebido”, esto es, que para utilizarlo no fuera necesario instalar nada en la computadora del usuario final.

Hablemos pues un poco acerca de Firebird, sus inicios y porqué lo elegí. Recordé que en mis años mozos por allá del año 2001 utilizaba Delphi + Interbase 6 (Lenguaje de Programación + DBMS, ambos de Borland), cuando interbase era OpenSource. No recuerdo en qué año pero Borland decidió cerrar la rama OpenSource de Interbase y con ello Interbase volvió a ser un DBMS propietario.

Tras el cierre del proyecto OpenSource Interbase por parte Borland, hubo personas que decidieron continuar con la rama de desarrollo y pusieron manos a la obra, retomaron los fuentes, establecieron un punto de inicio y el proyecto fue renombrado como Firebird.

Grandes avances se han realizado desde entonces, éste DBMS OpenSource ya soportaba procedimientos almacenados cuando MySql todavía estaba soñando con ello. Sinceramente considero que a Firebird le ha faltado la promoción que se le ha dado a MySql.

¿Porqué lo necesito embebido?, la respuesta es sencilla, no me puedo poner a decirle a los usuarios que primero tienen que instalar MySql, Oracle Express, Sql Server Express o cualquier otro y luego indicarles como configurarlo, eso podría hacerlo con una empresa, pero al usuario final que no es empresa le resultará tedioso y finalmente será un obstáculo para la adquisición de la aplicación puesto que tendrán temor de “poner algo mal” y que se vaya al traste su Computadora.

En fin, ¿Cómo utilizar Firebird como DBMS embebido?. En realidad es muy sencillo. Por lo menos es muy sencillo en .NET que es el lenguaje voy a utilizar para realizar la aplicación.

Solo es necesario visitar la página del proyecto Firebird en .NET, y allí encontrarás los archivos del servidor, el embedded Server y el DataProvider para .NET así como ejemplos y documentación.

Ahora, solo es necesario bajar los archivos del embedded Server y el DataProvider, copiar al directorio “bin” de tu aplicación los archivos fbembed.dll, icudt30.dll, icuin30.dll y icuuc30.dll que se encuentran todos ellos dentro del archivo que bajaste acerca del embedded Server, poner una referencia al FirebirdSql.Data.Firebird.dll en tu programa de .NET y ¡listo! ya puedes realizar aplicaciones con acceso a base de datos sin que tu usuario final tenga que instalar absolutamente nada acerca de ese DBMS.

Luego de lo explicado en el párrafo anterior ya estás en condiciones de programar en .NET como lo harías hacia cualquier otro DBMS.

Un comentario: en versiones anteriores del embedded Server solo era necesario copiar el fbembed.dll pero en la nueva versión 2.0.1 ya es necesario copiar todos los archivos que indiqué.

Para finalizar debo indicar que es posible utilizar Firebird como un servidor tradicional, esto es, instalar un servidor que correría como un servicio del sistema y al que pueden conectarse múltiples computadoras (Firebird Server).

Si te interesa documentarte acerca de Firebird, el siguiente link te llevará a la página del proyecto. Busca las “Quickstart guide” ya que en ellas encontrarás información básica como sintaxis, instalación y ayuda. Y en el siguiente encontrarás unas CheatSheet acerca de Firebird.