domingo, 12 de octubre de 2008

Procedimientos almacenados en Firebird

Todo gestor de base de datos que se precie ofrece a los usuarios la posibilidad de programar procedimientos almacenados. Firebird no podía ser menos, así que en este artículo veremos cómo crear dichos procedimientos y cómo llamarlos desde nuestra aplicación .Net.

Creación

Veamos un pequeño ejemplo de procedimiento y después pasaremos a comentarlo línea por línea.

CREATE PROCEDURE FILL_MOVIE ( PARAM1 INTEGER )
AS
DECLARE VARIABLE VAL INTEGER;DECLARE VARIABLE CNT INTEGER;
begin
DELETE FROM MOVIE;
val = 0;
val = GEN_ID (GEN_MOVIE_ID, val - GEN_ID (GEN_MOVIE_ID,0) );


Cnt = 1;
WHILE (Cnt <= 3) DO BEGIN INSERT INTO MOVIE (TITLE, DIRECTOR,YEAR) values('Trainspotting','Danny Boyle', '1996'); Cnt = Cnt + 1; END suspend; end


Este pequeño procedimiento lo que hace es insertar tres veces la película Trainspotting en nuestra base de datos.

En la primera línea del procedimiento estamos creando el mismo, indicándole su nombre y si tiene parámetros, tanto de entrada cómo de salida, el nombre y el tipo de los mismos. En la siguiente línea, y siempre entre el AS y el BEGIN ponemos la declaración de las variables que se utilizaran en el procedimiento. Esta declaración se realiza mediante las palabras reservadas DECLARE VARIABLE seguidas del nombre de la variable y su tipo.

Ya en el cuerpo del procedimiento, lo primero que se hace és borrar el contenido de la tabla MOVIES y resetear el generador de identificadores asociado a la tabla. Cómo no existe ninguna función para establecer directamente el valor de este generador, deberemos llamarlo pasándole como incremento su valor actual en negativo.

Una vez hecho esto, pasamos a realizar un bucle utilizando un WHILE donde haremos el INSERT y actualizaremos el valor de la variable CNT.


Llamada desde .Net

Una vez tenemos hecho el procedimiento, es hora de poder llamarlo desde nuestra aplicación .Net. Para hacer esto nos ayudaremos de la libreria para acceder a Firebird desde .Net. Desde nuestras clases de acceso a datos, deberemos crear una nueva función enargada de llamar a un procedimiento remoto. Esta función será prácticamente igual a la que tengamos para ejecutar un ExecuteNonQuery, con la salvedad que antes de hacer la llamada, deberemos establecer el tipo de comando a StoredProcedure.

private int ExecuteStoredProcedure(string pNameStoredProcedure, bool pIgnoreError)
{
try
{
using (FbConnection connection = new FbConnection(Connection.ConnectionString))
{
int result = 0;
connection.Open();
FbTransaction transaction = connection.BeginTransaction( IsolationLevel.ReadUncommitted);
if (transaction != null)
{
FbCommand command = new FbCommand(pNameStoredProcedure, transaction.Connection, transaction);
command.CommandType = CommandType.StoredProcedure;
result = command.ExecuteNonQuery();
transaction.Commit();
}

connection.Close();
return result;
}
}
catch (Exception e)
{
Tracer.WriteLine("ExecuteStoredProcedure : '" + pNameStoredProcedure + "'. Missatge: " + e.Message);
return -1;
}
}


return 0;
}

Y hasta aquí este pequeño tutorial. Espero que os sea útil. Para cualquier duda, nos leemos en los comentarios!

No hay comentarios: