Mostrando las entradas con la etiqueta dbms. Mostrar todas las entradas
Mostrando las entradas con la etiqueta dbms. Mostrar todas las entradas

sábado, 30 de mayo de 2009

Leer un Oracle REF CURSOR en ASP.NET

En ocasiones me ha resultado más conveniente que la aplicación web obtenga los datos consultando un procedimiento almacenado que devuelve un Ref Cursor en Oracle. Lo anterior debido a que en caso de ser necesario realizar algún cambio en la consulta, por ejemplo cambiar algunas condiciones en el select ó realizar alguna corrección.

De esta manera nos evitamos tener que modificar el código fuente y tener que dejarlo nuevamente en el servidor web. Además, podemos tomar el código del procedimiento almacenado y ejecutarlo en nuestras herramientas de desarrollo, SqlDeveloper en mi caso, para verificar resultados sin tener que pasar por todas las páginas involucradas en la aplicación web.

Recientemente me enfrenté al problema de que en ASP.NET surgían errores al tratar de obtener los valores desde un Ref Cursor.

Para el ejemplo, tenemos declarado el siguiente procedimiento Oracle:

PROCEDURE GET_TEST(cData OUT CursorType, XTRA OUT VARCHAR2)
IS
BEGIN
xtra := 'AE';

OPEN
cDATA FOR
SELECT
*
FROM DUAL;
END;



A continuación el código en ASP.NET (recortado, claro)

Dim DbCn as OracleConnection

' Codigo de asignación de propiedades para la conexion

' Codigo de apertura de conexion
DbCn.Open
Dim Cmd As OracleCommand = DbCn.CreateCommand
Cmd.CommandText
= "GET_TEST" ' Nombre del procedimiento almacenado
Cmd.CommandType = Data.CommandType.StoredProcedure

' Adición de los parámetros, en este caso uno de tipo RefCursor y el otro de tipo Varchar2
Cmd.Parameters.Add("pRET", OracleDbType.RefCursor).Direction = Data.ParameterDirection.Output
Cmd.Parameters.Add(
"PX", OracleDbType.Varchar2).Direction = Data.ParameterDirection.Output
Cmd.Parameters(
"PX").Size = 20

Cmd.ExecuteNonQuery()

' Obtención de los valores devueltos
Dim XX As String = Cmd.Parameters("PX").Value.ToString
Dim RC As Oracle.DataAccess.Types.OracleRefCursor = Cmd.Parameters("pRET").Value
Dim Da As New OracleDataAdapter
Dim dt As New System.Data.DataTable
Da.Fill(dt, RC)

' Eliminamos los objetos
RC.Dispose()
Da.Dispose()
DbCn.Close()

Me.GridView1.DataSource = dt
Me.GridView1.DataBind()


Quedan por hacer algunos comentarios:
  • Para algunos tipos de parámetro es necesario indicar la longitud del dato, tal es el caso de los Varchar2, en este caso, si al parámetro no se le indica un Size (20 en el ejemplo) entonces ocurrirá un error que indicará que la variable no es lo suficientemente grande como para almacenar el valor retornado.
  • Al objeto OracleCommand es necesario indicarle que el tipo de comando es "StoredProcedure" y entonces en el CommandText pondremos el nombre del procedimiento SIN parámetros ya que los parámetros los añadiremos después.
  • Los parámetros deberán ser añadidos en el orden en que aparecen en la declaración del stored procedure.
  • Luego de ejecutar el objeto comando con ExecuteNonQuery, obtendremos el valor del parámetro correspondiente a un OracleRefCursor y lo asignaremos a una variable de ese tipo, todo esto para después llenar un DataTable (ó DataSet) a través de un OracleDataAdapter ya que éste puede llenar la DataTable a través del objeto OracleRefCursor.
  • Luego de lo anterior ya podremos utilizar nuestro DataTable puesto que ya contendrá la información cargada.
  • Es posible leer de procedimientos que retornen más de un OracleRefCursor.
Espero que el presente post les haya sido de utilidad. Cualquier comentario, sugerencia o duda allí tienen el espacio de comentarios para expresarse =)

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.