NET 2003
Por John Paul Cook
Conozca los procesos bsicos y esenciales para crear una aplicacin .NET en base de datos de
Oracle.
ltima actualizacin: septiembre de 2008
Con la creciente popularidad del entorno .NET de Microsoft, muchos desarrolladores desean obtener
informacin sobre las mejores maneras de integrar las aplicaciones .NET con Oracleno solo en trminos de
conectividad bsica, sino tambin con relacin al desarrollo efectivo y eficiente de la aplicacin utilizando
Visual Studio.NET (VS.NET).
En este artculo, explicar los procesos bsicos y esenciales para crear una aplicacin .NET ejecutada en una
base de datos Oracle, que incluyen:
Cmo incorporar referencias de proyectos para soportar Oracle Class Libraries en su proyecto .NET
Cmo crear cadenas de conexin para Oracle Database
Cmo trabajar con objetos Connection, Command y DataReader
Tendr la oportunidad de aplicar lo que ha aprendido en tres laboratorios prcticos, con distintos grados de
dificultad, desde los relativamente fciles hasta los ms complejos.
Para obtener informacin, conocer los laboratorios y saber cmo proteger sus aplicaciones, lea mi artculo
" Proteccin de las Aplicaciones .NET en la Base de Datos de Oracle". (Tambin consulte OTN .NET
Developer Center y lea los artculos tcnicos que abarcan una amplia gama de temas relacionados con el
ciclo de vida de la aplicacin .NET en Oracle)
Recuerde que Oracle Developer Tools para Visual Studio, que puede descargarse desde el sitio OTN, ofrece
un mdulo Visual Studio que hace que el desarrollo de las aplicaciones .NET en Oracle sea mucho ms fcil e
intuitivo. Ese tema escapa a nuestro alcance, no obstante puede obtener ms informacin en Oracle
Developer Tools para Visual Studio Product Center.
Sentencias VB.NET/C#
Luego de incorporar referencias, lo comn es agregar sentencias VB.NET Imports, sentencias C# using, o
sentencias J# import. Tcnicamente estas sentencias no son requeridas, pero nos permiten referirnos a los
objetos de la base de datos sin utilizar nombres largos o totalmente detallados.
Por convencin, estas sentencias aparecen cerca o en la parte superior del archivo de cdigos, antes del
namespace o declaracin de clase.
Imports Oracle.DataAccess.Client ' VB.NET
using Oracle.DataAccess.Client;
// C#
Manejo de Errores
Cuando ocurre un error, las aplicaciones .NET deben manejar este error correctamente y mantener al usuario
informado a travs de un mensaje.
El manejo de errores estructurados de tipo Try-Catch-Finally es parte de los lenguajes .NET. Aqu vemos un
ejemplo relativamente minimalista que utiliza la sintaxis Try-Catch-Finally:
Un error ORA-12545 es bastante significativo para un Oracle DBA o desarrollador, pero no para el usuario
final. Una mejor solucin es agregar una sentencia Catch adicional para capturar los errores de base de datos
ms comunes y proporcionar mensajes comprensibles para el usuario.
Catch ex As OracleException ' catches only Oracle errors
Select Case ex.Number
Case 1
MessageBox.Show("Error attempting to insert duplicate data.")
Case 12545
MessageBox.Show("The database is unavailable.")
Case Else
MessageBox.Show("Database error: " + ex.Message.ToString())
End Select
Catch ex As Exception ' catches any error
MessageBox.Show(ex.Message.ToString())
catch (OracleException ex) // solo captura los errores de Oracle
{
switch (ex.Number)
{
case 1:
MessageBox.Show("Error attempting to insert duplicate data.");
break;
case 12545:
MessageBox.Show("The database is unavailable.");
break;
default:
MessageBox.Show("Database error: " + ex.Message.ToString());
break;
}
}
catch (Exception ex) // captura cualquier error
{
MessageBox.Show(ex.Message.ToString());
}
Observe las dos sentencias Catch en el cdigo de muestra de arriba. Si no hay ningn error de Oracle para
capturar, la primera sentencia Catch se saltea, dejando que cualquier otro tipo de error que no sea de Oracle
sea capturado por la segunda sentenciaCatch. Las sentencias Catch deben ordenarse en el cdigo de la
ms especfica a la ms general. Luego de implementar el cdigo de manejo fcil de excepciones, aparece el
mensaje de error ORA-12545 como se muestra a continuacin:
Hasta el momento nuestros ejemplos han mostrado cmo recuperar un valor nico. OracleDataReader puede
recuperar los valores de mltiples columnas y mltiples filas. Primero analicemos la consulta de mltiples
columnas, y una fila nica:
select deptno, dname, loc from dept where deptno = 10
Para obtener los valores de las columnas, se pueden utilizar nombres de columnas o valores ordinales de
base cero. Los valores ordinales son relativos al orden de la consulta. As, el valor de la columna LOC puede
obtenerse en Visual Basic utilizando
dr.Item(2) o dr.Item("loc").
Aqu vemos un fragmento del cdigo que concatena las columnas DNAME y LOC de la consulta anterior:
Label1.Text = "The" + dr.Item("dname") +"department is in" +dr.Item("loc")'VB
label1.Text = "The" + dr["dname"].ToString() + "department is in" +
dr["loc"].ToString(); // C#
Ahora, considere una consulta que emite mltiples filas:
select deptno, dname, loc from dept
Para procesar mltiples filas emitidas desde OracleDataReader, se requiere algn tipo de construccin de
loop. Adems, siempre es mejor un control que pueda desplegar mltiples filas. OracleDataReader es un
cursor de solo lectura y de desplazamiento solo hacia adelante, por lo tanto no puede compararse a un control
totalmente deslizable o adaptable como un control Windows Forms DataGrid. OracleDataReader es
compatible con el control ListBox, tal como lo demuestra el siguiente fragmento de cdigo:
.
While dr.Read() ' Visual Basic
ListBox1.Items.Add("The"+dr.Item("dname")+"department is in"+dr.Item("loc"))
End While
while (dr.Read()) // C#
{
listBox1.Items.Add("The"+dr["dname"].ToString()+"department is in" +
dr["loc"].ToString());
}
Lab 3 (Recuperacin de Mltiples Columnas y Filas con OracleDataReader) destaca algunos de estos
conceptos.
Resumen
Este artculo ha presentado el proceso que debe seguirse para acceder a las bases de datos de Oracle
utilizando los lenguajes de programacin VS.NET. Ahora tendr la capacidad de conectarse a la base de
datos y recuperar mltiples filas y columnas.
Agregue el cdigo para recuperar los datos de la base de datos de Oracle y desplegar los resultados
en el formulario. Coloque el cdigo en un controlador de eventos click para button. La forma ms sencilla de
comenzar con esta tarea es haciendo doble click con el botn ya que crear un stub para el controlador de
eventos.
Agregue las sentencias VB.NET Imports antes de la declaracin Public Class o las sentencias C#
using antes de la declaracin del namespace.
Imports System.Data
' VB.NET
Imports Oracle.DataAccess.Client ' ODP.NET Oracle managed provider
using System.Data;
// C#
using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider
10.
Agregue la versin VB.NET del controlador de eventos click entre las sentencias Private Sub y End
Sub (asegrese de reemplazar OTNSRVR con el nombre de host de su servidor):
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Modifique su cdigo para evitar cualquier error cuando se ingrese un DEPTNO invlido. Recuerde
que el mtodo ExecuteReader en verdad devuelve un objeto. Reemplace la lnea que contiene dr.Read con
las siguientes sentencias.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
}
Pruebe la aplicacin ingresando un DEPTNO que no existe. Ahora la aplicacin ya no se cierra.
Ingrese la letra A en vez de un nmero y haga click en button. La aplicacin se cierra. Claramente, nuestra
Aunque podra discutirse que la aplicacin no debera permitir al usuario realizar inputs invlidos que pudieran
causar errores, en ltima instancia la aplicacin debe tener un slido controlador de errores incorporado. No
todos los errores pueden prevenirse, por lo tanto debe implementarse un controlador de errores.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.