Anda di halaman 1dari 19

Construccin de una Aplicacin .NET en Oracle Database para Visual Studio .

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.

Proveedor de Datos .NET


Adems del software bsico de conectividad cliente de Oracle, las aplicaciones .NET requieren el uso de lo
que se conoce comomanaged data provider (proveedor de datos administrado, en donde el trmino
"managed" hace referencia al cdigo administrado por el entorno .NET). El proveedor de datos acta entre el
cdigo de aplicaciones .NET y el software de conectividad cliente de Oracle. En casi todos los casos, el mejor
desempeo se logra utilizando un proveedor optimizado para una plataforma de base de datos especfica en
lugar de un proveedor de datos OLE DB .NET genrico.
Oracle, Microsoft y los proveedores externos, todos ofrecen proveedores de datos .NET optimizados para
Oracle. Oracle y Microsoft ofrecen sus proveedores de datos Oracle de manera gratuita. (El proveedor de
Microsoft para el Entorno .NET 1.1 se encuentra incluido en el entorno, pero requiere la instalacin del
software cliente de Oracle.) En este artculo, utilizaremos el Proveedor de Datos de Oracle para .NET
(ODP.NET), el cual se incluye con Oracle Database o como descarga separada.
ODP.NET brinda acceso de datos ADO.NET estndar, mientras se ofrecen las caractersticas especficas de la
base de datos de Oracle, tales como XML DB, las optimizaciones de desempeo de acceso de datos, y el
grupo de conexin de Real Application Clusters.
Cuando el software cliente de Oracle y ODP.NET se instalan, puede comenzar el desarrollo de aplicaciones
utilizando Visual Studio. Confirmar la conectividad del cliente antes de iniciar el desarrollo es una buena idea.
Si usted puede conectarse a Oracle utilizando el software cliente de Oracle como SQL*Plus en la misma
mquina como Visual Studio, entonces usted sabr que su software cliente de Oracle ha sido correctamente
instalado y configurado.
Si usted es nuevo en Oracle, vea la seccin "Instalacin de Productos.NET" en la Gua de 2 Das de Oracle
Database para Desarrolladores para obtener informacin sobre la instalacin y configuracin de ODP.NET
especficamente, o consulte la Biblioteca de Documentacin de Oracle Database para tener un panorama
general sobre Oracle Database.

Creacin de un Proyecto en Visual Studio.NET


Luego de iniciar VS.NET, lo primero que hay que hacer es crear un proyecto. Puede hacer click en el
botn Nuevo Proyecto o seleccionar File | New | Project... como se muestra a continuacin.

Figura 1: Creacin de un nuevo proyecto en


Visual Studio.NET
Aparece la ventana de dilogo New Project ( Nuevo Proyecto). A la izquierda de la ventana de dilogo, bajo
el ttulo Project Types(Tipo de Proyecto), seleccione el lenguaje de programacin de su preferencia. En
nuestro ejemplo, se ha elegido VB.NET. A la derecha, bajo el ttulo Templates (Plantillas), seleccione la
plantilla del proyecto. Para facilitar las cosas, en este caso se seleccionan las Aplicaciones de Windows.

Figura 2: Utilizacin de la ventana de


dilogo New Project
Seguramente quiera especificar nombres significativos para designar al proyecto (nosotros utilizamos
OraWinApp) y al nombre de la solucin (utilizamos OraSamples). Toda solucin contiene uno o ms
proyectos. Cuando una solucin contiene solamente un proyecto, muchas personas utilizan el mismo nombre
para ambos.
Incorporacin de una Referencia
Debido a que nuestro proyecto debe conectarse a una base de datos de Oracle, es necesario agregar una
referencia a dll que contenga el proveedor de datos de su preferencia. Dentro de Solution Explorer, seleccione
el nodo References (Referencias), haga click derecho y seleccione Add Reference (Agregar Referencias).
De manera alternativa, puede ir a la barra del men y seleccionarProject y luego Add Reference .

Figura 3: Incorporacin de una referencia


Se abre la ventana de dilogo Add Reference.

Figura 4: Seleccin del Proveedor de Datos


ODP.NET Administrado
Seleccione Oracle.DataAccess.dll de la lista, luego haga un click en el botn S elect (Seleccionar), y
finalmente click en el botn OKpara comunicar al proyecto el proveedor de datos ODP.NET.

Figura 5: Solution Explorer luego de


seleccionar el Proveedor Administrado de
Oracle

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#

import Oracle.DataAccess.Client; // J#ODP.NET Oracle managed provider


Si agreg la referencia, Intellisense lo ayudar a completar la incorporacin de una sentencia Imports o using.

Conexin de Cadenas y Objetos


Una cadena de conexin de Oracle es inseparable de la resolucin de nombres de Oracle. Supongamos que
tenamos un alias de base de datos OraDb definido en un archivo tnsnames.ora, de este modo:
OraDb=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521))
)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=ORCL)
)
)
El alias OraDb define la informacin de conexin de la direccin de la base de datos para el cliente. Para
utilizar el OraDb definido en el archivo tnsnames.ora que se muestra arriba, usted debera utilizar la siguiente
sintaxis:
Dim oradb As String="Data Source=OraDb;User Id=scott;Password=tiger;" 'VB.NET
string oradb = "Data Source=OraDb;User Id=scott;Password=tiger;"; // C#
Puede modificar la cadena de conexin para obviar la necesidad del archivo tnsnames.ora. Simplemente
reemplace el nombre del alias con el nombre que se definira en un archivo tnsnames.ora.
' VB.NET
Dim oradb As String = "Data Source=(DESCRIPTION=" _
+ "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" _
+ "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _
+ "User Id=scott;Password=tiger;"
// C#
string oradb = "Data Source=(DESCRIPTION="
+ "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))"
+ "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"
+ "User Id=scott;Password=tiger;";
Como puede observar arriba, el nombre de usuario y la contrasea estn incorporados en la cadena de
conexin en texto limpio. Este es el enfoque ms simple para crear una cadena de conexin. No obstante,
desde una perspectiva de seguridad, el enfoque de texto limpio no es tan aconsejable. En particular, usted
debe comprender que el cdigo de aplicacin.NET compilado es solo apenas ms seguro que los archivos de
cdigo de origen del texto limpio. Descompilar archivos .NET DLL y EXE y ver el contenido del texto limpio
original es muy fcil. (En realidad, la solucin adecuada es la encriptacin, pero ese tema implicara una
digresin para nuestro debate.)
Luego, debe representar un objeto de conexin a partir de la clase de conexin. La cadena de conexin debe
estar relacionada con el objeto de conexin.

Dim conn As New OracleConnection(oradb) ' VB.NET


OracleConnection conn = new OracleConnection(oradb); // C#
Observe que la cadena de conexin se relaciona con el objeto de conexin al ser transferido al constructor del
objeto, el cual se encuentra sobrecargado. La sobrecarga del constructor permite la siguiente sintaxis
alternativa:
Dim conn As New OracleConnection() ' VB.NET
conn.ConnectionString = oradb
OracleConnection conn = new OracleConnection(); // C#
conn.ConnectionString = oradb;
Luego de relacionar una cadena de conexin con un objeto de conexin, utilice el mtodo Open para realizar
la conexin real.
conn.Open() ' VB.NET
conn.Open(); // C#

Ms adelante abarcaremos el manejo de errores.


Objeto Command
El objeto Command se utiliza para especificar el texto de comando SQL ejecutado, ya sea que se trate de una
cadena SQL o un procedimiento almacenado. De manera similar al objeto Connection, debe representarse a
partir de su clase y presenta un constructor sobrecargado. En este ejemplo, ODP.NET realizar la consulta
SQL para obtener el nombre de departamento (DNAME) de la tabla de departamentos (DEPT) en donde el
nmero de departamento (DEPTNO) es 10.
Dim sql As String = "select dname from dept where deptno = 10" ' VB.NET
Dim cmd As New OracleCommand(sql, conn)
cmd.CommandType = CommandType.Text
string sql = "select dname from dept where deptno = 10"; // C#
OracleCommand cmd = new OracleCommand(sql, conn);
cmd.CommandType = CommandType.Text;
Al utilizar sobrecargas distintas, la sintaxis puede ser estructurada de manera ligeramente distinta. El objeto
Command tiene mtodos para ejecutar el texto command. Existen distintos mtodos que son adecuados para
distintos tipos de comandos SQL.

Recuperacin de un Valor Escalar


Recuperar datos de una base de datos puede lograrse a travs de la representacin de un objeto
OracleDataReader y utilizando el mtodo ExecuteReader, que permite obtener un objeto OracleDataReader.
Los datos obtenidos se vuelven accesibles al trasmitir tanto el nombre de columna como el ordinal de base
cero de la columna a OracleDataReader.
Dim dr As OracleDataReader = cmd.ExecuteReader() ' Visual Basic
dr.Read()
Label1.Text=dr.Item("dname") ' recuperar por nombre de columna
Label1.Text=dr.Item(0)'recuperar la primera columna en la lista de seleccin
Label1.Text=dr.GetString(0) ' emitir un tipo de datos.NET
Label1.Text=dr.GetOracleString(0)'emitir un tipo de datos de Oracle
Existen descriptores de acceso (accessors) para emitir tipos de datos .NET nativos y otros para emitir tipos de
datos Oracle nativos, y todos estn disponibles en C#, Visual Basic, o cualquier otro lenguaje .NET. Los
ordinales de base cero pasan al descriptor de acceso para especificar qu columna emitir.
OracleDataReader dr = cmd.ExecuteReader(); // C#
dr.Read();

label1.Text=dr["dname"].ToString();//recuperar C# por nombre de columna


label1.Text=dr.GetString(0).ToString();//emitir un tipo de datos.NET
label1.Text=dr.GetOracleString(0).ToString();//emitir un tipo de datos Oracle
En este ejemplo simplificado, el valor emitido de DNAME es una cadena y se utiliza para establecer el valor
de la propiedad de texto del control Etiqueta, que tambin es una cadena. Pero si en cambio DEPTNO, que
no es una cadena, ha sido recuperado, se producir un desajuste del tipo de datos. El tiempo de ejecucin
.NET intenta implcitamente convertir un tipo de datos a otro cuando los tipos de datos de origen y destino no
coinciden. Algunas veces el tipo de datos es incompatible y la conversin implcita falla, generando una
excepcin. Pero incluso cuando funciona, es an mejor utilizar las conversiones explcitas de los tipos de
datos en vez de la conversin implcita de los tipos de datos.

A continuacin observamos una conversin explcita a nmero entero:


Label1.Text = CStr(dr.Item("deptno"))
' Nmero entero de Visual Basic para la conversin de cadena
C# no es tan inflexible como Visual Basic respecto de las conversiones implcitas. Usted se encontrar
realizando conversiones explcitas:
label1.Text = dr.GetInt16("deptno").ToString(); // C#
Puede explcitamente convertir matrices y valores escalares.
Mtodos Close y Dispose
El mtodo Close o Dispose del objeto de conexin deberan invocarse para cerrar la conexin a la base de
datos cuando dicha conexin ya no es necesaria. El mtodo Dispose invoca al mtodo Close.
conn.Close()
' Visual Basic
conn.Dispose() ' Visual Basic
conn.Close();
// C#
conn.Dispose(); // C#
Alternativamente, C# ofrece una sintaxis especial que permite disponer automticamente de una conexin
cuando sta se encuentra fuera del alcance. La clave using activa esta caracterstica.
using (OracleConnection conn = new OracleConnection(oradb))
{
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "select dname from dept where deptno = 10";
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
dr.Read();
label1.Text = dr.GetString(0);
}
Asimismo, OracleCommand incluye un mtodo Dispose; y OracleDataReader incluye un mtodo Close y
Dispose. Cerrar y disponer de objetos .NET libera recursos del sistema, garantizando un desempeo ms
eficiente de las aplicaciones, lo cual es especialmente importante en condiciones de mucha carga. Usted
puede experimentar algunos de los conceptos aprendidos aqu en Lab 1(Recuperacin de Datos de la Base
de Datos) y en Lab 2 (Incorporacin de Interactividad).

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:

' Visual Basic


Try
conn.Open()
Dim cmd As New OracleCommand
cmd.Connection = conn
cmd.CommandText = "select dname from dept where deptno="+TextBox1.Text
cmd.CommandType = CommandType.Text
If dr.Read() Then
Label1.Text = dr.Item("dname") ' or use dr.Item(0)
End If
Catch ex As Exception ' catches any error
MessageBox.Show(ex.Message.ToString())
Finally
' In a real application, put cleanup code here.
End Try
// C#
try
{
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "select dname from dept where deptno=" + textBox1.Text;
cmd.CommandType = CommandType.Text;
if (dr.Read()) // C#
{
label1.Text = dr["dname"].ToString();
// or use dr.GetOracleString(0).ToString()
}
}
catch (Exception ex) // catches any error
{
MessageBox.Show(ex.Message.ToString());
}
finally
{
// En una aplicacin real, utilice el cdigo cleanup aqu.
}
A pesar de que este enfoque permitir capturar correctamente cualquier error que surja al intentar obtener
datos de la base de datos, no es tan fcil de utilizar por parte del usuario. Por ejemplo, observe el siguiente
mensaje que se despliega cuando la base de datos no est disponible:

Figura 6: Error ORA-12545 capturado y


desplegado ante el usuario.

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:

Figura 7: Mensaje de error comprensible


para el usuario advirtiendo sobre un error
ORA-12545
El bloque de cdigo Finally siempre se ejecuta independientemente de que se produzca un error o no. De
ah proviene el cdigo cleanup. Si no utiliza Using ni using, debera disponer de su conexin y de otros
objetos en el bloque de cdigo Finally.

Recuperacin de Mltiples Valores Utilizando DataReader

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.

Lab 1: Recuperacin de Datos desde la Base de Datos


Comenzamos con el requisito de haber creado un proyecto y haber agregado una referencia como
se muestra anteriormente en este artculo.
Ahora incorporaremos el control button y el control label en el formulario Windows. Asegrese de
dejar espacio arriba de los controles para permitir las incorporaciones que sern realizadas en Lab 2.

Figura 8: Formulario Lab 1 con


controles button y label

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.

Figura 9: Click en el stub del 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.

Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _


+ "(ADDRESS=(PROTOCOL=TCP)(HOST=OSRVR)(PORT=1521)))"
+ "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _
+ "User Id=scott;Password=tiger;"
Dim conn As New OracleConnection(oradb) ' VB.NET
conn.Open()

20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.

Dim cmd As New OracleCommand


cmd.Connection = conn
cmd.CommandText = "select dname from dept where deptno = 10"
cmd.CommandType = CommandType.Text
Dim dr As OracleDataReader = cmd.ExecuteReader()
dr.Read() ' remplace esta sentencia en el prximo lab
Label1.Text = dr.Item("dname") ' or dr.Item(0), remove in next lab
dr.Dispose()
cmd.Dispose()
conn.Dispose()
Agregue el siguiente cdigo C# al controlador de eventos click entre { and } llaves para el controlador de
eventos click de button(asegrese de reemplazar OTNSRVR con el nombre del host de su servidor):

string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST="


+ "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))"
+ "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"
+ "User Id=scott;Password=tiger;";
OracleConnection conn = new OracleConnection(oradb); // C#
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "select dname from dept where deptno = 10";
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
dr.Read(); // reemplace esta sentencia en el prximo lab
label1.Text = dr["dname"].ToString(); // remove in next lab
dr.Dispose();
cmd.Dispose();
conn.Dispose();
Ejecute la aplicacin. Haga click en button. Usted debera ver lo siguiente:

Figura 10: Datos recuperados con xito

Lab 2: Incorporacin de Interactividad


Ahora que los fundamentos del acceso a la base de datos se implementaron en el cdigo, el prximo paso es
incorporar la interactividad a la aplicacin. En lugar de ejecutar una consulta hard coded, se puede agregar un
control textbox para aceptar el input del usuario para el nmero de departamento (es decir, DEPTNO).
Incorpore el control textbox y otro control label al formulario como se muestra abajo. Determine la
propiedad de texto del control Label2 en EnterDEPTNO:y asegrese de que la
propiedad Text de TextBox1 no est sujeta a ningn valor.

Figura 11: Formulario Lab 2 con


controles button y label.

Modifique el cdigo que defina la cadena de seleccin:

cmd.CommandText = "select dname from dept where


deptno = " + TextBox1.Text 'VB.NET
cmd.CommandText = "select dname from dept where
deptno = " + textBox1.Text; // C#
Ejecute la aplicacin. Pruebe la aplicacin ingresando 10 para el deptno. Vuelva a probar la
aplicacin ingresando un DEPTNO invlido (por ej., 50). La aplicacin finalizar.

Figura 12: Una excepcin inmanejable

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.

If dr.Read() Then ' Visual Basic


Label1.Text = dr.Item("dname").ToString()
Else
Label1.Text = "deptno not found"
End If
if (dr.Read()) // C#
{
label1.Text = dr["dname"].ToString();;
}
else
{

label1.Text = "deptno not found";

}
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

aplicacin necesita un mejor enfoque de manejo de errores.

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.

Lab 3: Recuperacin de Mltiples Columnas y Filas con DataReader


Ahora que se ha recuperado un valor nico, el prximo paso es recuperar mltiples columnas y filas con
DataReader. Un control ListBox se agrega al formulario para desplegar los resultados.
Agregue un control ListBox al formulario. Actualice el tamao del control para cubrir el mayor ancho
posible del formulario como se muestra abajo.

Figura 13: Formulario con ListBox


incorporado

Elimine la clusula where de la consulta e incorpore las columnas adicionales:

cmd.CommandText = "select deptno, dname, loc from dept" ' VB.NET

cmd.CommandText = "select deptno, dname, loc from dept"; // C#


Los resultados de la consulta sern ledos en un while loop y completarn el control ListBox.
Modifique su cdigo VB.NET para que quede de esta manera:

10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.

Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _


+ "(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" _
+ "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _
+ "User Id=scott;Password=tiger;"
Dim conn As New OracleConnection(oradb) ' Visual Basic
conn.Open()
Dim cmd As New OracleCommand
cmd.Connection = conn
cmd.CommandText = "select deptno, dname, loc from dept";
cmd.CommandType = CommandType.Text
Dim dr As OracleDataReader = cmd.ExecuteReader()
While dr.Read()
ListBox1.Items.Add("The " + dr.Item("dname") + _
" department is in " + dr.Item("loc"))
End While
dr.Dispose()
cmd.Dispose()
conn.Dispose()
Modifique su cdigo C# para que quede de esta manera:

string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST="


+ "(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))"
+ "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"
+ "User Id=scott;Password=tiger;";
OracleConnection conn = new OracleConnection(oradb); // C#
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "select deptno, dname, loc from dept";
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
listBox1.Items.Add("The " + dr["dname"].ToString() +
"department is in" + dr["loc"].ToString());
}
dr.Dispose();
cmd.Dispose();
conn.Dispose();
Ejecute la aplicacin. El ListBox debera completarse con todos los nombres de localizaciones y
departamentos de la tabla DEPT. Las descargas de cdigos presentan controladores de errores
implementados.

Anda mungkin juga menyukai