Clicenabrir
Luego ingresamos una label por cada campo
insertado enlabase de datos.
label
Luego ingresamos una caja de texto y la copiamos (al a ser esto nos sale un
mensaje que nos dice: ya existe un control llamado text 1; desea crear una matriz) le damos "si" luego la copiamos tres veces más.
text1
Luego agregamos el control adodc1; para aquello damos clic derecho
en la barra de herramientas -componentes-Microsoft ADO data control 6.0(OLEDB)-aceptar.
componentes- Microsoft
ADOdata control 6.0
(OLEDB
Luego agregamos dicho control (control adodc1) al formulario
controladodc1
Luego seleccionamos el control adodc1 y le
agregamos las siguientes propiedades:
Conecctionstring
Usar cadena de
conexión- generar
Pestaña PROVEEDOR
Microsoft OLE DB Provider for ODBC
Drivers
Pestaña
CONEXION
Usar la cadena de conexión generar
PestañaCONEXION
Usarla
cadena de conexión-
generar
Nombrede
DSN
nuevo
Microsoft Access driver
siguiente
examinar
"BuscarlaBasedeDatos" guardar
siguiente
finalizar
seleccionar
BuscarlaBasedeDatos" aceptar
aceptar
aceptar
Seleccionar el origen de
datos
En este caso esta seleccionado el origen de dato
como adcmd Tble (por que lo que estamos
conectando establa) Aquí selecciona la tabla
que deseaconectar
Luego seleccionamos los text y le aplicamos
la propiedad datasource-adodc1.
propiedad datasource- adodc1.
text
Luego seleccionamos los text, nos ubicamos en la propiedad data fiel y
aplicamos el nombre del campo correspondiente a cada text según cadalabel.
label
propiedad
text
Aclaración del punto anterior
propiedad
label text
Nombres que se le aplican a los text según
cadalabel
Clicaquí para pasar
al dato siguiente
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
CONEXIÓN Visual Studio 2010 y SQL Server 2008
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Construcción de una Aplicación .NET en Oracle Database para Visual Studio
Conozca los procesos básicos y esenciales para crear una aplicación .NET en base de datos de
Oracle.
Con la creciente popularidad del entorno .NET de Microsoft, muchos desarrolladores desean
obtener información sobre las mejoresmaneras de integrar las aplicaciones.NET con Oracle—no
soloentérminosde conectividadbásica,sinotambiénconrelaciónal desarrolloefectivoyeficiente
de la aplicación utilizando Visual Studio.NET (VS.NET).
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Eneste artículo,explicaré losprocesosbásicosyesencialesparacrearunaaplicación.NETejecutada
en una base de datos Oracle, que incluyen:
 Cómoincorporarreferenciasde proyectosparasoportarOracle ClassLibraries ensuproyecto.NET
 Cómo crear cadenas de conexión para Oracle Database
 Cómo trabajar con objetos Connection, Command y DataReader
Tendrá la oportunidadde aplicar lo que ha aprendidoentres laboratoriosprácticos,con distintos
grados de dificultad, desde los relativamente fáciles hasta los más complejos.
Para obtenerinformación,conocerloslaboratoriosysabercómo protegersusaplicaciones,leami
artículo " Protección de las Aplicaciones .NET en la Base de Datos de Oracle". (También consulte
OTN .NET Developer Center y lea los artículos técnicos que abarcan una amplia gama de temas
relacionados con el ciclo de vida de la aplicación .NET en Oracle)
Recuerde que OracleDeveloperToolsparaVisual Studio,que puede descargarse desdeel sitioOTN,
ofrece un módulo Visual Studio que hace que el desarrollode las aplicaciones .NET en Oracle sea
mucho más fácil e intuitivo. Ese tema escapa a nuestro alcance, no obstante puede obtener más
información en Oracle Developer Tools para Visual Studio Product Center.
Proveedor de Datos .NET
Además del software básico de conectividad cliente de Oracle,las aplicaciones .NET requieren el
usode loque se conoce comomanaged dataprovider (proveedorde datosadministrado,endonde
el término "managed" hace referencia al código administrado por el entorno .NET). El proveedor
de datosactúa entre el códigode aplicaciones.NETyel softwarede conectividadcliente de Oracle.
En casi todosloscasos, el mejordesempeñose lograutilizandounproveedoroptimizadoparauna
plataformade base de datos específicaenlugar de un proveedor de datos OLE DB .NET genérico.
Oracle, Microsoft y los proveedores externos, todos ofrecen proveedores de datos .NET
optimizados para Oracle. Oracle y Microsoft ofrecensus proveedores de datos Oracle de manera
gratuita.(El proveedorde Microsoftpara el Entorno .NET 1.1 se encuentraincluidoenel entorno,
pero requiere la instalación del software cliente de Oracle.) En este artículo, 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 estándar, mientras se ofrecen las características
específicasde labase de datosde Oracle,talescomoXMLDB,lasoptimizacionesde desempeñode
acceso de datos, y el grupo de conexión 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
desarrolloesuna buenaidea.Si ustedpuede conectarse a Oracle utilizandoel software clientede
Oracle como SQL*Plus en la misma máquina como Visual Studio, entonces usted sabrá que su
software cliente de Oracle ha sido correctamente instalado y configurado.
Si ustedesnuevoen Oracle,veala sección"Instalaciónde Productos.NET"en la Guía de 2 Días de
Oracle Database para Desarrolladores para obtener información sobre la instalación y
configuración de ODP.NET específicamente,o consulte la Biblioteca de Documentaciónde Oracle
Database para tener un panorama general sobre Oracle Database.
Creación 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 botón Nuevo Proyecto o seleccionar File | New | Project... como se muestra a continuación.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Figura 1: Creación de un nuevo proyecto en Visual Studio.NET
Aparece la ventana de diálogo New Project ( Nuevo Proyecto). A la izquierda de la ventana de
diálogo,bajoel título Project Types(Tipode Proyecto),seleccioneel lenguaje de programaciónde
su preferencia. En nuestro ejemplo, se ha elegido VB.NET. A la derecha, bajo el
título Templates (Plantillas), seleccione la plantilla del proyecto. Para facilitar las cosas, en este
caso se seleccionan las Aplicaciones de Windows.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Figura 2: Utilización de la ventana de diálogo New Project
Seguramente quiera especificar nombres significativos para designar al proyecto (nosotros
utilizamosOraWinApp)yal nombre de lasolución(utilizamosOraSamples).Todasolucióncontiene
uno o más proyectos. Cuando una solución contiene solamente un proyecto, muchas personas
utilizan el mismo nombre para ambos.
Incorporación de una Referencia
Debidoaque nuestroproyectodebe conectarseaunabase de datosde Oracle,esnecesarioagregar
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 .
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Figura 3: Incorporación de una referencia
Se abre la ventana de diálogo Add Reference.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Figura 4: Selección del Proveedor de Datos ODP.NET Administrado
Seleccione Oracle.DataAccess.dll de lalista,luegohagaunclick enel botón S elect(Seleccionar),y
finalmente click en el botón OKpara comunicar al proyecto el proveedor de datos ODP.NET.
Figura 5: Solution Explorer luego de
seleccionarel ProveedorAdministrado
de Oracle
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Sentencias VB.NET/C#
Luego de incorporar referencias, lo común es agregar sentencias VB.NET Imports, sentenciasC#
using,osentenciasJ#import.Técnicamente estassentenciasnosonrequeridas,peronospermiten
referirnos a los objetos de la base de datos sin utilizar nombres largos o totalmente detallados.
Porconvención,estassentenciasaparecencercaoenlaparte superiordelarchivodecódigos,antes
del namespace o declaración 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 incorporación de una sentencia
Imports o using.
Conexión de Cadenas y Objetos
Una cadena de conexión de Oracle es inseparable de la resolución de nombres de Oracle.
Supongamosque teníamosun aliasde base de datos OraDb definidoenun archivotnsnames.ora,
de este modo:
OraDb=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521))
)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=ORCL)
)
)
El aliasOraDbdefine lainformaciónde conexiónde ladirecciónde labase de datosparael cliente.
Para utilizar el OraDb definido en el archivo tnsnames.ora que se muestra arriba, usted debería
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 conexión para obviar la necesidad del archivo tnsnames.ora.
Simplemente reemplace el nombre del alias con el nombre que se definiría 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="
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
+ "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))"
+ "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"
+ "User Id=scott;Password=tiger;";
Comopuede observararriba,el nombre de usuarioylacontraseñaestánincorporadosenlacadena
de conexiónentextolimpio.Este esel enfoque mássimple paracrearuna cadenade conexión.No
obstante, desde una perspectiva de seguridad, el enfoque de texto limpio no es tan aconsejable.
En particular, usted debe comprender que el código de aplicación.NET compiladoes solo apenas
más seguroque losarchivosde códigode origendel textolimpio.Descompilararchivos.NET DLL y
EXE y verel contenidodel textolimpiooriginalesmuyfácil.(Enrealidad,lasoluciónadecuadaesla
encriptación, pero ese tema implicaría una digresión para nuestro debate.)
Luego, debe representar un objeto de conexión a partir de la clase de conexión. La cadena de
conexión debe estar relacionada con el objeto de conexión.
Dim conn As New OracleConnection(oradb) ' VB.NET
OracleConnection conn = new OracleConnection(oradb); // C#
Observe que la cadena de conexión se relaciona con el objeto de conexión 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 conexión con un objeto de conexión, utilice el métodoOpen
para realizar la conexión real.
conn.Open() ' VB.NET
conn.Open(); // C#
Más 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 cadenaSQL o unprocedimientoalmacenado.De manerasimilaral objetoConnection,
debe representarse apartir de su clase y presentaunconstructor sobrecargado.En este ejemplo,
ODP.NET realizarála consultaSQL para obtenerel nombre de departamento(DNAME) de la tabla
de departamentos (DEPT) en donde el número 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;
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Al utilizarsobrecargasdistintas,lasintaxispuede serestructuradade maneraligeramente distinta.
El objetoCommandtienemétodosparaejecutarel textocommand.Existendistintosmétodosque
son adecuados para distintos tipos de comandos SQL.
Recuperación de un Valor Escalar
Recuperar datos de una base de datos puede lograrse a través de la representación de un objeto
OracleDataReader y utilizando el método 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 selección
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
emitirtiposde datosOracle nativos,ytodos estándisponiblesenC#,Visual Basic,o cualquierotro
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 ejemplosimplificado,el valoremitidode DNAMEesunacadenay se utilizaparaestablecer
el valorde lapropiedaddetextodelcontrol Etiqueta,que tambiénesunacadena.Pero si encambio
DEPTNO,que noesuna cadena,hasidorecuperado,se produciráundesajustedel tipode datos.El
tiempode ejecución.NETintentaimplícitamente convertiruntipode datosaotrocuando lostipos
de datos de origen y destino no coinciden. Algunas veces el tipo de datos es incompatible y la
conversión implícita falla, generandouna excepción. Pero incluso cuando funciona, es aún mejor
utilizarlasconversionesexplícitasde lostiposde datosenvezde laconversiónimplícitade lostipos
de datos.
A continuación observamos una conversión explícita a número entero:
Label1.Text = CStr(dr.Item("deptno"))
' Número entero de Visual Basic para la conversión de cadena
C# no es tan inflexible como Visual Basic respecto de las conversiones implícitas. Usted se
encontrará realizando conversiones explícitas:
label1.Text = dr.GetInt16("deptno").ToString(); // C#
Puede explícitamente convertir matrices y valores escalares.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Métodos Close y Dispose
El métodoClose o Dispose del objetode conexióndeberíaninvocarse paracerrar la conexióna la
base de datoscuandodichaconexiónyanoesnecesaria.El métodoDisposeinvocaal métodoClose.
conn.Close() ' Visual Basic
conn.Dispose() ' Visual Basic
conn.Close(); // C#
conn.Dispose(); // C#
Alternativamente,C# ofrece una sintaxis especial que permite disponer automáticamente de una
conexión cuando ésta se encuentra fuera del alcance. La clave using activa esta característica.
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 método Dispose; y OracleDataReader incluye un método
Close y Dispose. Cerrar y disponer de objetos .NET libera recursos del sistema, garantizando un
desempeñomáseficientede lasaplicaciones,locual esespecialmente importante encondiciones
de mucha carga. Usted puede experimentar algunos de los conceptos aprendidos aquí en Lab
1(Recuperación de Datos de la Base de Datos) y en Lab 2 (Incorporación de Interactividad).
Manejo de Errores
Cuandoocurre unerror,lasaplicaciones.NETdebenmanejareste errorcorrectamente ymantener
al usuario informado a través 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)
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
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 aplicación real, utilice el código cleanup aquí.
}
A pesarde que este enfoque permitirácapturarcorrectamente cualquiererrorque surjaal intentar
obtener datos de la base de datos, no es tan fácil 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.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Un error ORA-12545 es bastante significativoparaun Oracle DBA o desarrollador,peronopara el
usuariofinal.UnamejorsoluciónesagregarunasentenciaCatchadicional paracapturarloserrores
de base de datos más 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 lasdossentencias Catchenel códigode muestrade arriba.Si nohayningúnerrorde 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 código de la más específica a la más general. Luego de implementar el código de
manejo fácil de excepciones, aparece el mensaje de error ORA-12545 como se muestra a
continuación:
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Figura 7: Mensaje de error
comprensible para el usuario
advirtiendosobre unerror ORA-12545
El bloque de código Finally siemprese ejecutaindependientemente de que se produzcaunerroro
no. De ahí proviene el códigocleanup.Si noutiliza Usingni using,deberíadisponerde suconexión
y de otros objetos en el bloque de código Finally.
Recuperación de Múltiples Valores Utilizando DataReader
Hasta el momento nuestros ejemplos han mostrado cómo recuperar un valor único.
OracleDataReader puede recuperar los valores de múltiples columnas y múltiplesfilas. Primero
analicemos la consulta de múltiples 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
ordinalesde base cero.Losvaloresordinalessonrelativosal ordende laconsulta.Así,el valorde la
columna LOC puede obtenerse en Visual Basic utilizando
dr.Item(2) o dr.Item("loc").
Aquí vemos un fragmento del código 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 múltiples filas:
select deptno, dname, loc from dept
Para procesar múltiples filas emitidas desde OracleDataReader, se requiere algún tipo de
construcción de loop. Además, siempre es mejor un control que pueda desplegar múltiples filas.
OracleDataReaderesuncursordesololecturayde desplazamientosolohaciaadelante,porlotanto
no puede compararse a un control totalmente deslizable o adaptable como un control Windows
Forms DataGrid.OracleDataReaderescompatible conel control ListBox,tal como lodemuestrael
siguiente fragmento de código:
.
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());
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
}
Lab 3 (RecuperacióndeMúltiplesColumnasyFilasconOracleDataReader) destacaalgunosde estos
conceptos.
Resumen
Este artículo ha presentado el proceso que debe seguirse para acceder a las bases de datos de
Oracle utilizandoloslenguajesde programaciónVS.NET.Ahoratendrála capacidad de conectarse
a la base de datos y recuperar múltiples filas y columnas.
Lab 1: Recuperación de Datos desde la Base de Datos
1. Comenzamosconel requisitode habercreadounproyectoyhaberagregadounareferenciacomo
se muestra anteriormente en este artículo.
2. Ahoraincorporaremosel control buttony el control labelenel formularioWindows.Asegúresede
dejarespacioarribade loscontrolesparapermitirlasincorporacionesque seránrealizadasenLab
2.
Figura 8: Formulario Lab 1 con controles button y label
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
3. Agregue el códigopararecuperarlosdatosde labase de datosdeOracle ydesplegarlosresultados
enel formulario.Coloque el códigoenuncontroladorde eventosclickparabutton.La forma más
sencilla de comenzar con esta tarea es haciendo doble click con el botón ya que creará un stub
para el controlador de eventos.
Figura 9: Click en el stub del controlador de eventos.
4. Agregue las sentencias VB.NET Imports antes de la declaración Public Class o las sentencias C#
using antes de la declaración del namespace.
5. Imports System.Data ' VB.NET
6. Imports Oracle.DataAccess.Client ' ODP.NET Oracle managed provider
7.
8.
9. using System.Data; // C#
10. using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider
11. Agregue laversiónVB.NETdel controladorde eventosclickentre lassentenciasPrivate SubyEnd
Sub (asegúrese de reemplazar OTNSRVR con el nombre de host de su servidor):
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
12. Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _
13. + "(ADDRESS=(PROTOCOL=TCP)(HOST=OSRVR)(PORT=1521)))"
14. + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _
15. + "User Id=scott;Password=tiger;"
16.
17. Dim conn As New OracleConnection(oradb) ' VB.NET
18. conn.Open()
19.
20. Dim cmd As New OracleCommand
21. cmd.Connection = conn
22. cmd.CommandText = "select dname from dept where deptno = 10"
23. cmd.CommandType = CommandType.Text
24.
25. Dim dr As OracleDataReader = cmd.ExecuteReader()
26. dr.Read() ' remplace esta sentencia en el próximo lab
27. Label1.Text = dr.Item("dname") ' or dr.Item(0), remove in next lab
28.
29. dr.Dispose()
30. cmd.Dispose()
31. conn.Dispose()
Agregue el siguiente código C# al controlador de eventos click entre { and } llaves para el
controladorde eventosclickde button(asegúrese de reemplazarOTNSRVRconel nombre delhost
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 próximo lab
label1.Text = dr["dname"].ToString(); // remove in next lab
dr.Dispose();
cmd.Dispose();
conn.Dispose();
32. Ejecute la aplicación. Haga click en button. Usted debería ver lo siguiente:
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Figura 10: Datos recuperados con éxito
Lab 2: Incorporación de Interactividad
Ahora que los fundamentos del acceso a la base de datos se implementaron en el código, el
próximopasoesincorporarlainteractividadalaaplicación.Enlugarde ejecutarunaconsulta hard
coded, se puede agregar un control textbox para aceptar el input del usuario para el número de
departamento (es decir, DEPTNO).
1. Incorpore el control textbox y otro control label al formulariocomose muestraabajo.Determine
la propiedad de texto del control Label2 en Enter DEPTNO: y asegúrese de que la
propiedad Text de TextBox1 no esté sujeta a ningún valor.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Figura 11: Formulario Lab 2 con controles button y label.
2. Modifique el código que defina la cadena de selección:
3. cmd.CommandText = "select dname from dept where
4. deptno = " + TextBox1.Text 'VB.NET
5.
6. cmd.CommandText = "select dname from dept where
7. deptno = " + textBox1.Text; // C#
8.
9.
10. Ejecute la aplicación. Pruebe la aplicación ingresando 10 para el deptno. Vuelva a probar la
aplicación ingresando un DEPTNO inválido (por ej., 50). La aplicación finalizará.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Figura 12: Una excepción inmanejable
11. Modifique sucódigopara evitarcualquiererrorcuandose ingrese unDEPTNOinválido.Recuerde
que el método ExecuteReader en verdad devuelve un objeto. Reemplace la línea que contiene
dr.Read con las siguientes sentencias.
12. If dr.Read() Then ' Visual Basic
13. Label1.Text = dr.Item("dname").ToString()
14. Else
15. Label1.Text = "deptno not found"
16. End If
17.
18. if (dr.Read()) // C#
19. {
20. label1.Text = dr["dname"].ToString();;
21. }
22. else
23.
24. {
25. label1.Text = "deptno not found";
26. }
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
27.
28.
29. Pruebe la aplicación ingresando un DEPTNO que no existe. Ahora la aplicación ya no se cierra.
Ingrese laletraA en vezde un númeroy haga click en button.La aplicaciónse cierra.Claramente,
nuestra aplicación necesita un mejor enfoque de manejo de errores.
Aunque podría discutirse que laaplicaciónno deberíapermitiral usuariorealizarinputsinválidos
que pudierancausarerrores,enúltimainstanciala aplicacióndebe tenerunsólidocontroladorde
erroresincorporado.Notodosloserrorespuedenprevenirse,porlotantodebeimplementarse un
controlador de errores.
Lab 3: Recuperación de Múltiples Columnas y Filas con DataReader
Ahora que se ha recuperado un valor único, el próximo paso es recuperar múltiples columnas y
filas con DataReader. Un control ListBox se agrega al formulario para desplegar los resultados.
1. Agregue un control ListBox al formulario. Actualice el tamaño del control para cubrir el mayor
ancho posible del formulario como se muestra abajo.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Figura 13: Formulario con ListBox incorporado
2. Elimine la cláusula where de la consulta e incorpore las columnas adicionales:
3.
4. cmd.CommandText = "select deptno, dname, loc from dept" ' VB.NET
5.
6. cmd.CommandText = "select deptno, dname, loc from dept"; // C#
7. Los resultados de la consulta serán leídos en un while loop y completarán el control ListBox.
Modifique su código VB.NET para que quede de esta manera:
8. Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _
9. + "(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" _
10. + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _
11. + "User Id=scott;Password=tiger;"
12.
13. Dim conn As New OracleConnection(oradb) ' Visual Basic
14. conn.Open()
15.
16. Dim cmd As New OracleCommand
17. cmd.Connection = conn
18. cmd.CommandText = "select deptno, dname, loc from dept";
19. cmd.CommandType = CommandType.Text
20.
21. Dim dr As OracleDataReader = cmd.ExecuteReader()
22. While dr.Read()
23. ListBox1.Items.Add("The " + dr.Item("dname") + _
24. " department is in " + dr.Item("loc"))
25. End While
26.
27. dr.Dispose()
28. cmd.Dispose()
29. conn.Dispose()
Modifique su código 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();
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
while (dr.Read())
{
listBox1.Items.Add("The " + dr["dname"].ToString() +
"department is in" + dr["loc"].ToString());
}
dr.Dispose();
cmd.Dispose();
conn.Dispose();
Ejecute la aplicación. El ListBox debería completarse con todos los nombres de localizaciones y
departamentos de la tabla DEPT. Las descargas de códigos presentan controladores de errores
implementados.
Crear una nueva Conexión de Base de Datos
Esta sección describecómo crear una nueva conexión de base de datos e incluyeuna descripción detallada
de cada propiedad de la conexión.
Para crear una nueva conexión seleccionar en el panel izquierdo "Arbol Principal",hacer clicderecho en
"Conexiones a bases de datos" y seleccionar "Nuevo" o "Asistente Nueva Conexión".
También se puede hacer doble clic en "Conexiones a bases de datos", o presionar F3.
Los siguientes apartados describen las opciones deconfiguración disponibles en cada pestaña del editor de
conexión.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Pestaña General
La pestaña General es en donde se configura la información básicasobrela conexión,tal como nombre de
la conexión,tipo, método de acceso,nombre del servidor y acceso al mismo.
Lo primero que se debe hacer es dar un nombre a la conexión ("Connection Name").
Luego debe seleccionarseen el listado "Connection Type" el tipo de base de datos que utilizaremos.De
acuerdo a lo que seelija,las opcionesdisponibles en "Setting" y "Access" irán variando.
Una vez que sehan completado los datos de "Connection Name" , "Connection Type", "Connection Access"
y "Connection Setting" es recomendable presionar el botón "Probar"para verificar l a correcta configuración
de la conexión.
El botón "Explorar"permite navegar interactivamente en la basede datos en cuestión,visualizar tablas,
vistas y datos,generar DDL, etc.
El botón "Lista de" (Lista de funciones) muestra una tabla con variablesy valores relacionados a la conexión
actual.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Pestaña Advanced
En esta pestaña es en donde se configura la información avanzada sobrela conexión.Las opciones
disponibles son lassiguientes:
 Soporte de tipo de datos booleanos.
 Encomillado.
 Forzar a mayúscula.
 Forzar a minúscula.
 Esquema por defecto.
 Sentencias SQL a ejecutarse luego de realizadala conexión.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Pestaña Options
Esta pestaña permite configurar opciones debases de datos específicas para la conexión,agregando
parámetros a la URL generada.
Para agregar un parámetro seguir los siguientes pasos:
1. Seleccionar la siguientefila en la tabla deparámetros.
2. Ingresar un nombre de parámetro válido y su valor correspondiente.Para más información acerca
de los parámetros disponiblespresionar el botón "Help...".
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Pestaña Pooling
Esta pestaña permite configurar la conexión para usar poolingy definir las opciones relacionadascon la
misma,como el tamaño inicial depool,tamaño máximo de pool y los parámetros de la conexión.
La siguientetabla proporciona una descripción detalladadelas opciones disponiblesdeesta pestaña:
Característica Descripción
Enable Connection Poolin Habilita/Deshabilitala conexión pooling.
Pool Size: Initial Configura el tamaño inicial dela conexión pool.
Pool Size: Maximum Configura la cantidad máxima deconexiones de la conexión pool.
Parameters Permite definir parámetros personalizados adicionales al pool.
UNIVERSIDAD NACIONAL DE CHIMBORAZO
Facultad de Ciencias de la Educación, Humanas y Tecnologías
Escuela de Informática Aplicada a la Educación
WILLIAM LOZANO
Pestaña Clustering
Esta pestaña permite habilitar el clusteringpara la conexión a la basede datos y crear conexi ones a
particiones dedatos.
Para crear una nueva partición dedatos,ingresar un ID de partición y el nombre del host, puerto, basede
datos,nombre de usuario y contraseña

Tipos de coneciones

  • 3.
  • 5.
    Luego ingresamos unalabel por cada campo insertado enlabase de datos. label
  • 6.
    Luego ingresamos unacaja de texto y la copiamos (al a ser esto nos sale un mensaje que nos dice: ya existe un control llamado text 1; desea crear una matriz) le damos "si" luego la copiamos tres veces más. text1
  • 7.
    Luego agregamos elcontrol adodc1; para aquello damos clic derecho en la barra de herramientas -componentes-Microsoft ADO data control 6.0(OLEDB)-aceptar. componentes- Microsoft ADOdata control 6.0 (OLEDB
  • 8.
    Luego agregamos dichocontrol (control adodc1) al formulario controladodc1
  • 9.
    Luego seleccionamos elcontrol adodc1 y le agregamos las siguientes propiedades: Conecctionstring Usar cadena de conexión- generar
  • 10.
    Pestaña PROVEEDOR Microsoft OLEDB Provider for ODBC Drivers
  • 11.
    Pestaña CONEXION Usar la cadenade conexión generar PestañaCONEXION Usarla cadena de conexión- generar
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
    En este casoesta seleccionado el origen de dato como adcmd Tble (por que lo que estamos conectando establa) Aquí selecciona la tabla que deseaconectar
  • 24.
    Luego seleccionamos lostext y le aplicamos la propiedad datasource-adodc1. propiedad datasource- adodc1. text
  • 25.
    Luego seleccionamos lostext, nos ubicamos en la propiedad data fiel y aplicamos el nombre del campo correspondiente a cada text según cadalabel. label propiedad text
  • 26.
    Aclaración del puntoanterior propiedad label text Nombres que se le aplican a los text según cadalabel
  • 27.
  • 29.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO CONEXIÓN Visual Studio 2010 y SQL Server 2008
  • 30.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO
  • 31.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO
  • 32.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO
  • 33.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO
  • 34.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO
  • 35.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO
  • 36.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO
  • 37.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO
  • 38.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO
  • 39.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Construcción de una Aplicación .NET en Oracle Database para Visual Studio Conozca los procesos básicos y esenciales para crear una aplicación .NET en base de datos de Oracle. Con la creciente popularidad del entorno .NET de Microsoft, muchos desarrolladores desean obtener información sobre las mejoresmaneras de integrar las aplicaciones.NET con Oracle—no soloentérminosde conectividadbásica,sinotambiénconrelaciónal desarrolloefectivoyeficiente de la aplicación utilizando Visual Studio.NET (VS.NET).
  • 40.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Eneste artículo,explicaré losprocesosbásicosyesencialesparacrearunaaplicación.NETejecutada en una base de datos Oracle, que incluyen:  Cómoincorporarreferenciasde proyectosparasoportarOracle ClassLibraries ensuproyecto.NET  Cómo crear cadenas de conexión para Oracle Database  Cómo trabajar con objetos Connection, Command y DataReader Tendrá la oportunidadde aplicar lo que ha aprendidoentres laboratoriosprácticos,con distintos grados de dificultad, desde los relativamente fáciles hasta los más complejos. Para obtenerinformación,conocerloslaboratoriosysabercómo protegersusaplicaciones,leami artículo " Protección de las Aplicaciones .NET en la Base de Datos de Oracle". (También consulte OTN .NET Developer Center y lea los artículos técnicos que abarcan una amplia gama de temas relacionados con el ciclo de vida de la aplicación .NET en Oracle) Recuerde que OracleDeveloperToolsparaVisual Studio,que puede descargarse desdeel sitioOTN, ofrece un módulo Visual Studio que hace que el desarrollode las aplicaciones .NET en Oracle sea mucho más fácil e intuitivo. Ese tema escapa a nuestro alcance, no obstante puede obtener más información en Oracle Developer Tools para Visual Studio Product Center. Proveedor de Datos .NET Además del software básico de conectividad cliente de Oracle,las aplicaciones .NET requieren el usode loque se conoce comomanaged dataprovider (proveedorde datosadministrado,endonde el término "managed" hace referencia al código administrado por el entorno .NET). El proveedor de datosactúa entre el códigode aplicaciones.NETyel softwarede conectividadcliente de Oracle. En casi todosloscasos, el mejordesempeñose lograutilizandounproveedoroptimizadoparauna plataformade base de datos específicaenlugar de un proveedor de datos OLE DB .NET genérico. Oracle, Microsoft y los proveedores externos, todos ofrecen proveedores de datos .NET optimizados para Oracle. Oracle y Microsoft ofrecensus proveedores de datos Oracle de manera gratuita.(El proveedorde Microsoftpara el Entorno .NET 1.1 se encuentraincluidoenel entorno, pero requiere la instalación del software cliente de Oracle.) En este artículo, 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 estándar, mientras se ofrecen las características específicasde labase de datosde Oracle,talescomoXMLDB,lasoptimizacionesde desempeñode acceso de datos, y el grupo de conexión 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 desarrolloesuna buenaidea.Si ustedpuede conectarse a Oracle utilizandoel software clientede Oracle como SQL*Plus en la misma máquina como Visual Studio, entonces usted sabrá que su software cliente de Oracle ha sido correctamente instalado y configurado. Si ustedesnuevoen Oracle,veala sección"Instalaciónde Productos.NET"en la Guía de 2 Días de Oracle Database para Desarrolladores para obtener información sobre la instalación y configuración de ODP.NET específicamente,o consulte la Biblioteca de Documentaciónde Oracle Database para tener un panorama general sobre Oracle Database. Creación 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 botón Nuevo Proyecto o seleccionar File | New | Project... como se muestra a continuación.
  • 41.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Figura 1: Creación de un nuevo proyecto en Visual Studio.NET Aparece la ventana de diálogo New Project ( Nuevo Proyecto). A la izquierda de la ventana de diálogo,bajoel título Project Types(Tipode Proyecto),seleccioneel lenguaje de programaciónde su preferencia. En nuestro ejemplo, se ha elegido VB.NET. A la derecha, bajo el título Templates (Plantillas), seleccione la plantilla del proyecto. Para facilitar las cosas, en este caso se seleccionan las Aplicaciones de Windows.
  • 42.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Figura 2: Utilización de la ventana de diálogo New Project Seguramente quiera especificar nombres significativos para designar al proyecto (nosotros utilizamosOraWinApp)yal nombre de lasolución(utilizamosOraSamples).Todasolucióncontiene uno o más proyectos. Cuando una solución contiene solamente un proyecto, muchas personas utilizan el mismo nombre para ambos. Incorporación de una Referencia Debidoaque nuestroproyectodebe conectarseaunabase de datosde Oracle,esnecesarioagregar 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 .
  • 43.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Figura 3: Incorporación de una referencia Se abre la ventana de diálogo Add Reference.
  • 44.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Figura 4: Selección del Proveedor de Datos ODP.NET Administrado Seleccione Oracle.DataAccess.dll de lalista,luegohagaunclick enel botón S elect(Seleccionar),y finalmente click en el botón OKpara comunicar al proyecto el proveedor de datos ODP.NET. Figura 5: Solution Explorer luego de seleccionarel ProveedorAdministrado de Oracle
  • 45.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Sentencias VB.NET/C# Luego de incorporar referencias, lo común es agregar sentencias VB.NET Imports, sentenciasC# using,osentenciasJ#import.Técnicamente estassentenciasnosonrequeridas,peronospermiten referirnos a los objetos de la base de datos sin utilizar nombres largos o totalmente detallados. Porconvención,estassentenciasaparecencercaoenlaparte superiordelarchivodecódigos,antes del namespace o declaración 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 incorporación de una sentencia Imports o using. Conexión de Cadenas y Objetos Una cadena de conexión de Oracle es inseparable de la resolución de nombres de Oracle. Supongamosque teníamosun aliasde base de datos OraDb definidoenun archivotnsnames.ora, de este modo: OraDb= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)) ) (CONNECT_DATA= (SERVER=DEDICATED) (SERVICE_NAME=ORCL) ) ) El aliasOraDbdefine lainformaciónde conexiónde ladirecciónde labase de datosparael cliente. Para utilizar el OraDb definido en el archivo tnsnames.ora que se muestra arriba, usted debería 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 conexión para obviar la necesidad del archivo tnsnames.ora. Simplemente reemplace el nombre del alias con el nombre que se definiría 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="
  • 46.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" + "User Id=scott;Password=tiger;"; Comopuede observararriba,el nombre de usuarioylacontraseñaestánincorporadosenlacadena de conexiónentextolimpio.Este esel enfoque mássimple paracrearuna cadenade conexión.No obstante, desde una perspectiva de seguridad, el enfoque de texto limpio no es tan aconsejable. En particular, usted debe comprender que el código de aplicación.NET compiladoes solo apenas más seguroque losarchivosde códigode origendel textolimpio.Descompilararchivos.NET DLL y EXE y verel contenidodel textolimpiooriginalesmuyfácil.(Enrealidad,lasoluciónadecuadaesla encriptación, pero ese tema implicaría una digresión para nuestro debate.) Luego, debe representar un objeto de conexión a partir de la clase de conexión. La cadena de conexión debe estar relacionada con el objeto de conexión. Dim conn As New OracleConnection(oradb) ' VB.NET OracleConnection conn = new OracleConnection(oradb); // C# Observe que la cadena de conexión se relaciona con el objeto de conexión 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 conexión con un objeto de conexión, utilice el métodoOpen para realizar la conexión real. conn.Open() ' VB.NET conn.Open(); // C# Más 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 cadenaSQL o unprocedimientoalmacenado.De manerasimilaral objetoConnection, debe representarse apartir de su clase y presentaunconstructor sobrecargado.En este ejemplo, ODP.NET realizarála consultaSQL para obtenerel nombre de departamento(DNAME) de la tabla de departamentos (DEPT) en donde el número 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;
  • 47.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Al utilizarsobrecargasdistintas,lasintaxispuede serestructuradade maneraligeramente distinta. El objetoCommandtienemétodosparaejecutarel textocommand.Existendistintosmétodosque son adecuados para distintos tipos de comandos SQL. Recuperación de un Valor Escalar Recuperar datos de una base de datos puede lograrse a través de la representación de un objeto OracleDataReader y utilizando el método 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 selección 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 emitirtiposde datosOracle nativos,ytodos estándisponiblesenC#,Visual Basic,o cualquierotro 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 ejemplosimplificado,el valoremitidode DNAMEesunacadenay se utilizaparaestablecer el valorde lapropiedaddetextodelcontrol Etiqueta,que tambiénesunacadena.Pero si encambio DEPTNO,que noesuna cadena,hasidorecuperado,se produciráundesajustedel tipode datos.El tiempode ejecución.NETintentaimplícitamente convertiruntipode datosaotrocuando lostipos de datos de origen y destino no coinciden. Algunas veces el tipo de datos es incompatible y la conversión implícita falla, generandouna excepción. Pero incluso cuando funciona, es aún mejor utilizarlasconversionesexplícitasde lostiposde datosenvezde laconversiónimplícitade lostipos de datos. A continuación observamos una conversión explícita a número entero: Label1.Text = CStr(dr.Item("deptno")) ' Número entero de Visual Basic para la conversión de cadena C# no es tan inflexible como Visual Basic respecto de las conversiones implícitas. Usted se encontrará realizando conversiones explícitas: label1.Text = dr.GetInt16("deptno").ToString(); // C# Puede explícitamente convertir matrices y valores escalares.
  • 48.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Métodos Close y Dispose El métodoClose o Dispose del objetode conexióndeberíaninvocarse paracerrar la conexióna la base de datoscuandodichaconexiónyanoesnecesaria.El métodoDisposeinvocaal métodoClose. conn.Close() ' Visual Basic conn.Dispose() ' Visual Basic conn.Close(); // C# conn.Dispose(); // C# Alternativamente,C# ofrece una sintaxis especial que permite disponer automáticamente de una conexión cuando ésta se encuentra fuera del alcance. La clave using activa esta característica. 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 método Dispose; y OracleDataReader incluye un método Close y Dispose. Cerrar y disponer de objetos .NET libera recursos del sistema, garantizando un desempeñomáseficientede lasaplicaciones,locual esespecialmente importante encondiciones de mucha carga. Usted puede experimentar algunos de los conceptos aprendidos aquí en Lab 1(Recuperación de Datos de la Base de Datos) y en Lab 2 (Incorporación de Interactividad). Manejo de Errores Cuandoocurre unerror,lasaplicaciones.NETdebenmanejareste errorcorrectamente ymantener al usuario informado a través 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)
  • 49.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO 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 aplicación real, utilice el código cleanup aquí. } A pesarde que este enfoque permitirácapturarcorrectamente cualquiererrorque surjaal intentar obtener datos de la base de datos, no es tan fácil 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.
  • 50.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Un error ORA-12545 es bastante significativoparaun Oracle DBA o desarrollador,peronopara el usuariofinal.UnamejorsoluciónesagregarunasentenciaCatchadicional paracapturarloserrores de base de datos más 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 lasdossentencias Catchenel códigode muestrade arriba.Si nohayningúnerrorde 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 código de la más específica a la más general. Luego de implementar el código de manejo fácil de excepciones, aparece el mensaje de error ORA-12545 como se muestra a continuación:
  • 51.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Figura 7: Mensaje de error comprensible para el usuario advirtiendosobre unerror ORA-12545 El bloque de código Finally siemprese ejecutaindependientemente de que se produzcaunerroro no. De ahí proviene el códigocleanup.Si noutiliza Usingni using,deberíadisponerde suconexión y de otros objetos en el bloque de código Finally. Recuperación de Múltiples Valores Utilizando DataReader Hasta el momento nuestros ejemplos han mostrado cómo recuperar un valor único. OracleDataReader puede recuperar los valores de múltiples columnas y múltiplesfilas. Primero analicemos la consulta de múltiples 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 ordinalesde base cero.Losvaloresordinalessonrelativosal ordende laconsulta.Así,el valorde la columna LOC puede obtenerse en Visual Basic utilizando dr.Item(2) o dr.Item("loc"). Aquí vemos un fragmento del código 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 múltiples filas: select deptno, dname, loc from dept Para procesar múltiples filas emitidas desde OracleDataReader, se requiere algún tipo de construcción de loop. Además, siempre es mejor un control que pueda desplegar múltiples filas. OracleDataReaderesuncursordesololecturayde desplazamientosolohaciaadelante,porlotanto no puede compararse a un control totalmente deslizable o adaptable como un control Windows Forms DataGrid.OracleDataReaderescompatible conel control ListBox,tal como lodemuestrael siguiente fragmento de código: . 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());
  • 52.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO } Lab 3 (RecuperacióndeMúltiplesColumnasyFilasconOracleDataReader) destacaalgunosde estos conceptos. Resumen Este artículo ha presentado el proceso que debe seguirse para acceder a las bases de datos de Oracle utilizandoloslenguajesde programaciónVS.NET.Ahoratendrála capacidad de conectarse a la base de datos y recuperar múltiples filas y columnas. Lab 1: Recuperación de Datos desde la Base de Datos 1. Comenzamosconel requisitode habercreadounproyectoyhaberagregadounareferenciacomo se muestra anteriormente en este artículo. 2. Ahoraincorporaremosel control buttony el control labelenel formularioWindows.Asegúresede dejarespacioarribade loscontrolesparapermitirlasincorporacionesque seránrealizadasenLab 2. Figura 8: Formulario Lab 1 con controles button y label
  • 53.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO 3. Agregue el códigopararecuperarlosdatosde labase de datosdeOracle ydesplegarlosresultados enel formulario.Coloque el códigoenuncontroladorde eventosclickparabutton.La forma más sencilla de comenzar con esta tarea es haciendo doble click con el botón ya que creará un stub para el controlador de eventos. Figura 9: Click en el stub del controlador de eventos. 4. Agregue las sentencias VB.NET Imports antes de la declaración Public Class o las sentencias C# using antes de la declaración del namespace. 5. Imports System.Data ' VB.NET 6. Imports Oracle.DataAccess.Client ' ODP.NET Oracle managed provider 7. 8. 9. using System.Data; // C# 10. using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider 11. Agregue laversiónVB.NETdel controladorde eventosclickentre lassentenciasPrivate SubyEnd Sub (asegúrese de reemplazar OTNSRVR con el nombre de host de su servidor):
  • 54.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO 12. Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _ 13. + "(ADDRESS=(PROTOCOL=TCP)(HOST=OSRVR)(PORT=1521)))" 14. + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _ 15. + "User Id=scott;Password=tiger;" 16. 17. Dim conn As New OracleConnection(oradb) ' VB.NET 18. conn.Open() 19. 20. Dim cmd As New OracleCommand 21. cmd.Connection = conn 22. cmd.CommandText = "select dname from dept where deptno = 10" 23. cmd.CommandType = CommandType.Text 24. 25. Dim dr As OracleDataReader = cmd.ExecuteReader() 26. dr.Read() ' remplace esta sentencia en el próximo lab 27. Label1.Text = dr.Item("dname") ' or dr.Item(0), remove in next lab 28. 29. dr.Dispose() 30. cmd.Dispose() 31. conn.Dispose() Agregue el siguiente código C# al controlador de eventos click entre { and } llaves para el controladorde eventosclickde button(asegúrese de reemplazarOTNSRVRconel nombre delhost 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 próximo lab label1.Text = dr["dname"].ToString(); // remove in next lab dr.Dispose(); cmd.Dispose(); conn.Dispose(); 32. Ejecute la aplicación. Haga click en button. Usted debería ver lo siguiente:
  • 55.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Figura 10: Datos recuperados con éxito Lab 2: Incorporación de Interactividad Ahora que los fundamentos del acceso a la base de datos se implementaron en el código, el próximopasoesincorporarlainteractividadalaaplicación.Enlugarde ejecutarunaconsulta hard coded, se puede agregar un control textbox para aceptar el input del usuario para el número de departamento (es decir, DEPTNO). 1. Incorpore el control textbox y otro control label al formulariocomose muestraabajo.Determine la propiedad de texto del control Label2 en Enter DEPTNO: y asegúrese de que la propiedad Text de TextBox1 no esté sujeta a ningún valor.
  • 56.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Figura 11: Formulario Lab 2 con controles button y label. 2. Modifique el código que defina la cadena de selección: 3. cmd.CommandText = "select dname from dept where 4. deptno = " + TextBox1.Text 'VB.NET 5. 6. cmd.CommandText = "select dname from dept where 7. deptno = " + textBox1.Text; // C# 8. 9. 10. Ejecute la aplicación. Pruebe la aplicación ingresando 10 para el deptno. Vuelva a probar la aplicación ingresando un DEPTNO inválido (por ej., 50). La aplicación finalizará.
  • 57.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Figura 12: Una excepción inmanejable 11. Modifique sucódigopara evitarcualquiererrorcuandose ingrese unDEPTNOinválido.Recuerde que el método ExecuteReader en verdad devuelve un objeto. Reemplace la línea que contiene dr.Read con las siguientes sentencias. 12. If dr.Read() Then ' Visual Basic 13. Label1.Text = dr.Item("dname").ToString() 14. Else 15. Label1.Text = "deptno not found" 16. End If 17. 18. if (dr.Read()) // C# 19. { 20. label1.Text = dr["dname"].ToString();; 21. } 22. else 23. 24. { 25. label1.Text = "deptno not found"; 26. }
  • 58.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO 27. 28. 29. Pruebe la aplicación ingresando un DEPTNO que no existe. Ahora la aplicación ya no se cierra. Ingrese laletraA en vezde un númeroy haga click en button.La aplicaciónse cierra.Claramente, nuestra aplicación necesita un mejor enfoque de manejo de errores. Aunque podría discutirse que laaplicaciónno deberíapermitiral usuariorealizarinputsinválidos que pudierancausarerrores,enúltimainstanciala aplicacióndebe tenerunsólidocontroladorde erroresincorporado.Notodosloserrorespuedenprevenirse,porlotantodebeimplementarse un controlador de errores. Lab 3: Recuperación de Múltiples Columnas y Filas con DataReader Ahora que se ha recuperado un valor único, el próximo paso es recuperar múltiples columnas y filas con DataReader. Un control ListBox se agrega al formulario para desplegar los resultados. 1. Agregue un control ListBox al formulario. Actualice el tamaño del control para cubrir el mayor ancho posible del formulario como se muestra abajo.
  • 59.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Figura 13: Formulario con ListBox incorporado 2. Elimine la cláusula where de la consulta e incorpore las columnas adicionales: 3. 4. cmd.CommandText = "select deptno, dname, loc from dept" ' VB.NET 5. 6. cmd.CommandText = "select deptno, dname, loc from dept"; // C# 7. Los resultados de la consulta serán leídos en un while loop y completarán el control ListBox. Modifique su código VB.NET para que quede de esta manera: 8. Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _ 9. + "(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" _ 10. + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _ 11. + "User Id=scott;Password=tiger;" 12. 13. Dim conn As New OracleConnection(oradb) ' Visual Basic 14. conn.Open() 15. 16. Dim cmd As New OracleCommand 17. cmd.Connection = conn 18. cmd.CommandText = "select deptno, dname, loc from dept"; 19. cmd.CommandType = CommandType.Text 20. 21. Dim dr As OracleDataReader = cmd.ExecuteReader() 22. While dr.Read() 23. ListBox1.Items.Add("The " + dr.Item("dname") + _ 24. " department is in " + dr.Item("loc")) 25. End While 26. 27. dr.Dispose() 28. cmd.Dispose() 29. conn.Dispose() Modifique su código 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();
  • 60.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO while (dr.Read()) { listBox1.Items.Add("The " + dr["dname"].ToString() + "department is in" + dr["loc"].ToString()); } dr.Dispose(); cmd.Dispose(); conn.Dispose(); Ejecute la aplicación. El ListBox debería completarse con todos los nombres de localizaciones y departamentos de la tabla DEPT. Las descargas de códigos presentan controladores de errores implementados. Crear una nueva Conexión de Base de Datos Esta sección describecómo crear una nueva conexión de base de datos e incluyeuna descripción detallada de cada propiedad de la conexión. Para crear una nueva conexión seleccionar en el panel izquierdo "Arbol Principal",hacer clicderecho en "Conexiones a bases de datos" y seleccionar "Nuevo" o "Asistente Nueva Conexión". También se puede hacer doble clic en "Conexiones a bases de datos", o presionar F3. Los siguientes apartados describen las opciones deconfiguración disponibles en cada pestaña del editor de conexión.
  • 61.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Pestaña General La pestaña General es en donde se configura la información básicasobrela conexión,tal como nombre de la conexión,tipo, método de acceso,nombre del servidor y acceso al mismo. Lo primero que se debe hacer es dar un nombre a la conexión ("Connection Name"). Luego debe seleccionarseen el listado "Connection Type" el tipo de base de datos que utilizaremos.De acuerdo a lo que seelija,las opcionesdisponibles en "Setting" y "Access" irán variando. Una vez que sehan completado los datos de "Connection Name" , "Connection Type", "Connection Access" y "Connection Setting" es recomendable presionar el botón "Probar"para verificar l a correcta configuración de la conexión. El botón "Explorar"permite navegar interactivamente en la basede datos en cuestión,visualizar tablas, vistas y datos,generar DDL, etc. El botón "Lista de" (Lista de funciones) muestra una tabla con variablesy valores relacionados a la conexión actual.
  • 62.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Pestaña Advanced En esta pestaña es en donde se configura la información avanzada sobrela conexión.Las opciones disponibles son lassiguientes:  Soporte de tipo de datos booleanos.  Encomillado.  Forzar a mayúscula.  Forzar a minúscula.  Esquema por defecto.  Sentencias SQL a ejecutarse luego de realizadala conexión.
  • 63.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Pestaña Options Esta pestaña permite configurar opciones debases de datos específicas para la conexión,agregando parámetros a la URL generada. Para agregar un parámetro seguir los siguientes pasos: 1. Seleccionar la siguientefila en la tabla deparámetros. 2. Ingresar un nombre de parámetro válido y su valor correspondiente.Para más información acerca de los parámetros disponiblespresionar el botón "Help...".
  • 64.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Pestaña Pooling Esta pestaña permite configurar la conexión para usar poolingy definir las opciones relacionadascon la misma,como el tamaño inicial depool,tamaño máximo de pool y los parámetros de la conexión. La siguientetabla proporciona una descripción detalladadelas opciones disponiblesdeesta pestaña: Característica Descripción Enable Connection Poolin Habilita/Deshabilitala conexión pooling. Pool Size: Initial Configura el tamaño inicial dela conexión pool. Pool Size: Maximum Configura la cantidad máxima deconexiones de la conexión pool. Parameters Permite definir parámetros personalizados adicionales al pool.
  • 65.
    UNIVERSIDAD NACIONAL DECHIMBORAZO Facultad de Ciencias de la Educación, Humanas y Tecnologías Escuela de Informática Aplicada a la Educación WILLIAM LOZANO Pestaña Clustering Esta pestaña permite habilitar el clusteringpara la conexión a la basede datos y crear conexi ones a particiones dedatos. Para crear una nueva partición dedatos,ingresar un ID de partición y el nombre del host, puerto, basede datos,nombre de usuario y contraseña