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 =)

Colorear Código Fuente para HTML

En ocasiones necesitamos colorear código fuente, ya sea para mostrarlo en un documento ó para ponerlo en un blog (como en mi caso). Buscando por ahí, hace ya varios años encontré una página que quiero compartir con ustedes ya que me ha resultado de bastante utilidad: CodeColorizer

La herramienta anterior tiene las ventajas de que soporta los lenguajes modernos como el VB.NET y C# y la única desventaja que le veo por el momento es que es una aplicación que debes bajarla y descomprimirla en tu computadora, esto es desventaja si eres como yo una persona que prefiere las aplicaciones web.

En ese caso podrías utilizar Chami Colorizer que si bien se ha quedado algo fuera de moda, ya que no soporta VB.NET, tiene la ventaja de que al ser aplicación web no necesita instalar nada localmente.

En ella podemos introducir nuestro código fuente en una caja de texto y obtener como resultado ese mismo código pero con colores de manera que podamos desplegarlo de una manera más estética y entendible como a continuación:

CodeColorizer:

Dim RC2 As Oracle.DataAccess.Types.OracleRefCursor = Cmd.Parameters("pRET2").Value
Dim Da2 As New OracleDataAdapter
Dim dt2 As New System.Data.DataTable
Da2.Fill(dt2, RC2)



Chami Colorizer:

    Dim RC2 As Oracle.DataAccess.Types.OracleRefCursor = Cmd.Parameters("pRET2").Value
Dim Da2 As New OracleDataAdapter
Dim dt2 As New System.Data.DataTable
Da2.Fill(dt2, RC2)


martes, 5 de mayo de 2009

Icon Sets, Diseño Web

En ocasiones al estar realizando algún programa nos encontramos ante la necesidad de utilizar íconos que nos ayuden a ilustrar correctamente el concepto del botón/menú/opción. Lo principal es que sea muy descriptivo y que llame la atención.

La parte gráfica de la aplicación es muy importante, recordemos que "de la vista nace el amor" y esto es válido también para los programas que realizamos he visto en varias ocasiones a lo largo de mi vida profesional, software que si bien no son una solución realmente buena han ganado el la venta debido a una excelente presentación gráfica.

Pero en fin, sin más preámbulos, aquí presento una lista de "Icon Sets" gratuitos para utilizar en nuestros programas.

Patrones para Fondo:

Si ustedes conocen alguna otra con Icon Sets gratuitos, Patrones, Plantillas, etc. favor de indicarla en los comentarios para añadirla a la lista.