martes, 22 de noviembre de 2016

ResultSet




LA CLASE ResultSet
La interfaz ResultSet proporciona métodos getter (getBoolean, getLong, etc.) para recuperar valores de columna de la fila actual. Los valores se pueden recuperar utilizando el número de índice de la columna o el nombre de la columna. En general, utilizar el índice de columna será más eficiente. Las columnas se numeran desde 1. Para una portabilidad máxima, las columnas de conjunto de resultados dentro de cada fila se deben leer en orden de izquierda a derecha y cada columna debe leerse una sola vez.
Para los métodos getter, un controlador JDBC intenta convertir los datos subyacentes al tipo Java especificado en el método getter y devuelve un valor Java adecuado. La especificación JDBC tiene una tabla que muestra las asignaciones permitidas de tipos SQL a tipos Java que pueden ser utilizados por los métodos getter de ResultSet.

Los nombres de columna utilizados como entrada en los métodos getter son insensibles a mayúsculas y minúsculas. Cuando se llama a un método getter con un nombre de columna y varias columnas tienen el mismo nombre, se devolverá el valor de la primera columna coincidente. La opción nombre de columna está diseñada para utilizarse cuando se utilizan nombres de columna en la consulta SQL que generó el conjunto de resultados. Para las columnas que no están explícitamente nombradas en la consulta, es mejor utilizar números de columna. Si se utilizan nombres de columna, el programador debe tener cuidado de garantizar que se refieran únicamente a las columnas previstas, lo que se puede asegurar con la cláusula SQL AS.

Se agregó un conjunto de métodos de actualización a esta interfaz en la API JDBC 2.0 (SDK JavaTM 2, Versión estándar, versión 1.2). Los comentarios relativos a los parámetros de los métodos getter también se aplican a los parámetros de los métodos de actualización.

Los métodos de actualización se pueden utilizar de dos maneras:

Para actualizar un valor de columna en la fila actual. En un objeto ResultSet desplazable, el cursor se puede mover hacia atrás y hacia delante, a una posición absoluta oa una posición relativa a la fila actual. El siguiente fragmento de código actualiza la columna NAME de la quinta fila del objeto ResultSet rs y, a continuación, utiliza el método updateRow para actualizar la tabla de origen de datos a partir de la cual se derivó rs.

       Rs.absolute (5); // mueve el cursor a la quinta fila de rs
       Rs.updateString ( "NAME", "AINSWORTH"); // actualiza el
          // NAME columna de la fila 5 para ser AINSWORTH
       Rs.updateRow (); // actualiza la fila en el origen de datos


Para insertar valores de columna en la fila de inserción. Un objeto ResultSet actualizable tiene una fila especial asociada con él que sirve como área de espera para construir una fila que se va a insertar. El fragmento de código siguiente mueve el cursor a la fila de inserción, crea una fila de tres columnas e inserta en rs y en la tabla de origen de datos utilizando el método insertRow.

       Rs.moveToInsertRow (); // mueve el cursor a la fila de inserto
       Rs.updateString (1, "AINSWORTH"); // actualiza el
          // primera columna de la fila de inserción AINSWORTH
       Rs.updateInt (2,35); // actualiza la segunda columna para que sea 35
       Rs.updateBoolean (3, true); // actualiza la tercera columna a true
       Rs.insertRow ();
       Rs.moveToCurrentRow ();


Un objeto ResultSet se cierra automáticamente cuando el objeto Statement que lo generó se cierra, se vuelve a ejecutar o se utiliza para recuperar el resultado siguiente de una secuencia de resultados múltiples.

El número, los tipos y las propiedades de las columnas de un objeto ResultSet son proporcionados por el objeto ResultSetMetaData devuelto por el método ResultSet.getMetaData.

Un ResultSet contiene todas las filas que satisfacen las condiciones de una sentencia SQL y proporciona el acceso a los datos de estas filas mediante un conjunto de métodos get que permiten el acceso a las diferentes columnas de las filas. El método ResultSet.next se usa para moverse a la siguiente fila del result set,convirtiendo a ésta en la fila actúal.
El formato general de un result set es una tabla con cabeceras de columna y los valores correspondientes devueltos por la ‘query’. Por ejemplo, si la ‘query’ es SELECT a, b, c FROM Table1, el resultado tendrá una forma semejante a :


A               b                   c
--------   ---------           --------
12345      Cupertino      CA
83472      Redmond        WA
83492      Boston         MA



El siguiente fragmento de código es un ejemplo de la ejecución de una sentencia SQL que devolverá una colección de filas, con la columna 1 como un int, la columna 2 como una String y la columna 3 como un array de bytes:

java.sql.Statement stmt = conn.createStatement();
ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (r.next())
{
// print the values for the current row.
int i = r.getInt("a");
String s = r.getString("b");
float f = r.getFloat("c");
System.out.println("ROW = " + i + " " + s + " " + f);
}


Filas y Cursores
Un ResultSet mantiene un cursor que apunta a la fila actúal de datos. El cursor se mueve una fila hacia abajo cada vez que se llama al método next. Incialmente se sitúa antes de la primera fila, por lo que hay que llamar al método next para situarlo en la primera fila conviertiendola en la fila actúal. Las filas de ResultSet se recuperan en secuencia desde la fila más alta a la más baja. Un cursor se mantiene válido hasta que el objeto Resultset o su objeto padre Statement se cierra.

En SQL, el cursor resultado para una tabla tiene nombre. Si una base de datos
permite upadtes posicionados o deletes posicionados, el nombre del cursor es
necesario y debe ser proporcionado como un parámetro del comando update o
delete. El nombre del cursor puede obtenerse mediante una llamada al método
getCursorName.

No todas las bases de datos soportan updates o deletes posicionados. Los métodos
DatabaseMetaData.supportsPositionedDelete y DatabaseMetaData.supportsPositionedUpdate nos permiten descubrir si
estas operaciones están soportadas en una conexión dada. Cuando lo están, el
driver o la DBMS deben asegurarse que las filas seleccionadas están
apropiadamente bloquedas y por tanto que estas operaciones no provoquen
actualizaciones anomalas ni otros problemas de concurrencia.


Columnas


Los métodos getXXX suministran los medios para recuperar los valores de las
columnas de la fila actúal. Dentro de cada fila, los valores de las columnas pueden
recuperarse en cualquier orden, pero para asegurar la máxima portabilidad,
deberían extraerse las columnas de izquierda a derecha y leer los valores de las
columnas una única vez.

Puede usarse o bien el nombre de la columna o el número de columna para
referirse a esta. Por ejemplo: si la columna segunda de un objeto RecordSet rs se
denomina “title” y almacena valores de cadena, cualquiera de los dos ejemplos
siguientes nos devolverá el valor almacenado en la columna.

String s = rs.getString("title");
String s = rs.getString(2);

Nótese que las columnas se numeran de izquierda a derecha comenzando con la
columna 1. Además los nombres usados como input en los métodos getXXX son
insensibles a las mayúsculas.

La opción de usar el nombre de columna fue provista para que el usuario que
especifica nombres de columnas en una ‘query’ pueda usar esos nombres como
argumentos de los métodos getXXX. Si, por otro lado, la sentencia select no
especifica nombres de columnas (tal como en “select * from table1” o en
casos donde una columna es derivada), deben usarse los números de columna. En
estas situaciones , no hay forma de que el usuario sepa con seguridad cuales son
los nombres de las columnas.

En algunos casos, es posible para una query SQL devolver un result set con más de
una columna con el mismo nombre. Si se usa el nombre de columna como
argumento en un método getXXX, éste devolverá el valor de la primera columna
que coincida con el nombre. Por eso, si hay múltiples columnas con el mismo
nombre, se necesita usar un índice de columna para asegurarse que se recupera el
valor de la columna correcta. Esto puede ser ligeramente más eficiente que usar los
números de columna.

Información acerca de las columnas en un ResultSet es accesible mediante el
método ResultSet.getMetaData. El objeto ResultSetMetaData devuelto nos
da el numero, tipo y propiedades de las columnas de los objetos ResultSet.



Si se conoce el nombre de una columna, pero no su indice, puede usarse el método
findColumn para encontrar el número de columna.


Tipos de datos y conversiones.


Para los métodos getXXX, el driver JDBC intenta convertir los datos subyacentes a
tipos de datos Java . Por ejemplo, si el método getXXX es getString y los tipos de
datos de la base de datos en la base subyacente es VARCHAR, el driver JDBC
convertirá VARCHAR en String de Java. El valor devuelto por getString será un
objeto Java de tipo String.


La siguiente tabla muestra que tipos JDBC está permitido devolver para un método
getXXX y que tipos JDBC (tipos genéricos de SQL) se recomiendan para
recuperarlos. Una x indica un método getXXX legal para un tipo de dato particular.
Por ejemplo, cualquier método getXXX excepto getBytes o getBinaryStream puede
usarse para recuperar valores de tipo LONGVARCHAR, pero se recomienda usar
getAsciiStream o getUnicodeStream, dependiendo de que tipo de dato se devuelve.
El método getObject devolverá cualquier tipo de dato como un Object Java y es util
cuando los tipos de datos de la DBMS subyacente son abstractos específicos de
ésta o cuando una aplicación genérica necesita aceptar cualquier tipo de datos.


El uso de los métodos ResultSet.getXXX recuperan tipos de datos comunes JDBC

Una “x” indica que el método getXXX puede legalmente usarse para recuperar el
tipo JDBC dado.

Una “X” indica que el método getXXX es el recomendado para recuperar el tipo de
dato dado.


Uso de Streams valores muy grandes de filas

ResultSet hace posible el recuperar datos arbitrariamente grandes de tipo
LONGVARBINARY o LONGVARCHAR. Los métodos getBytes y getString
devuelven valores grandes (hasta los límites impuestos por el valor devuelto por
Statement.getMaxFieldSize).






De todos modos, puede ser conveniente recuperar datos muy grandes en ‘pedazos’
de tamaño fijo. Esto se hace mediante la clase ResultSet que devuelve ‘streams’
java.io.Input desde los cuales los datos pueden ser leidos en ‘pedazos’. Nòtese que
estas corrientes deben ser accedidas inmediatamente porque se cierran
automáticamente con la llamada al siguiente método getXXX de ResultSet. (Este
comportamiento está impuesto por las restricciones de implementación de acceso a
grandes blob).

El API JDBC tiene tres métodos diferentes para recuperar streams, cada uno con un
valor diferente de retorno.


• getBinaryStream devuelve una corriente que simplemente suminiistra
bytes en ‘bruto’ desde la base de datos sin ninguna conversión.

• getAsciiStream devuelve una corriente con caracteres ASCII

• getUnicodeStream devuelve una corriente con caracteres Unicode 1 de 2
bytes.

Notar que esto difiere de las corrientes Java que devuelven bytes sn tipo y pueden
(por ejemplo) usarse para ambos caracteres ASCII y Unicode.
A continuación veamos un ejemplo del uso de getAsciiStream:

java.sql.Statement stmt = con.createStatement();
ResultSet r = stmt.executeQuery("SELECT x FROM Table2");
// Now retrieve the column 1 results in 4 K chunks:
byte buff = new byte[4096];
while (r.next()) {
Java.io.InputStream fin = r.getAsciiStream(1);
for (;;) {
int size = fin.read(buff);
if (size == -1) { // at end of stream
break;
}
// Send the newly-filled buffer to some ASCII output stream:


output.write(buff, 0, size);
}
}




Valores resultado NULL

Para determinar si un valor resultado dado es JDBC NULL, primero debe intentarse
leer la columna y usar el método ResultSet.wasNull para descubrir si el valor
devuelto es JDBC NULL

Cuando se ha leido un JDBC NULL usando uno de los métodos
ResultSet.getXXX, el método wasNull devuelve algo de lo siguiente:

• Un valor null de Java para aquellos métodos getXXX que devuelven objetos
Java (tales como getString, getBigDecimal, getBytes, getDate,
getTime, getTimestamp, getAsciiStream, getUnicodeStream,
getBinaryStream, getObject).

• Un valor cero para getByte, getShort, getInt, getLong,
getFloat y getDouble.

• Un valor false para getBoolean.




Result sets opcionales o múltiples.

Normalmente cuando se ejecuta una sentencia SQL o bien se usa excuteQuery
(que devuelve un único ResultSet) o bien executeUpdate (que puede usarse
para cualquier tipo de sentencia de modificación de la base de datos y que devuelve
un contador de las filas que han sido afectadas. De cualquier modo, bajo ciertas
circunstancias una aplicación puede no saber si una sentencia devolverá un result
set hasta que ésta no haya sido ejecutada. Además, ciertos procedimientos
almacenados pueden devolver varios result sets y/o update counts.


Para acomodarse a estas situaciones, JDBC provee de un mecanismo por el cual
una aplicación puede ejecutar una sentencia y luego procesar una colección
arbitraria de result sets y update counts. Este mecanismo se basa en una primera
llamada a un método general execute y luego llamar a otros tres métodos
getResultSet, getUpdateCount y getMoreResults. Estos métodos permiten
a una aplicación explorar los resultados de las sentencias y determinar si dan como
resultado un result set o un update count.





No se necesita hacer nada para cerrar un ResultSet. Se cierra automáticamente
cuando por la Statement que la crea cuando se cierra esta, y se reutiliza cuando
cuando se recupera el próximo resultado de una secuencia de múltiples resultados.

Recuperar datos de ResultSet

El objeto ResultSet proporciona varios métodos para obtener los datos de columna correspondientes a un fila. Todos ellos tienen el formato get<Tipo>, siendo <Tipo> un tipo de datos Java™. Algunos ejemplos de estos métodos son getInt, getLong, getString, getTimestamp y getBlob. Casi todos estos métodos toman un solo parámetro, que es el índice que la columna tiene dentro del ResultSet o bien el nombre de la columna.
Las columnas de ResultSet están numeradas, empezando por el 1. Si se emplea el nombre de la columna y hay más de una columna que tenga ese mismo nombre en el ResultSet, se devuelve la primera. Algunos de los métodos get<Tipo> tienen parámetros adicionales, como el objeto opcional Calendar, que se puede pasar a los métodos getTime, getDate y getTimestamp. Consulte el Javadoc del paquete java.sql para obtener todos los detalles.
En los métodos get que devuelven objetos, el valor de retorno es null cuando la columna del ResultSet es nula. En tipos primitivos, no puede devolverse null. En estos casos, el valor es 0 o false. Si una aplicación debe distinguir entre null, y 0 o false, puede utilizarse el método wasNull inmediatamente después de la llamada. A continuación, este método puede determinar si el valor era un valor 0 o false real o si ese valor se ha devuelto debido a que el valor de ResultSet era de hecho null.

Soporte de ResultSetMetaData

Cuando se llama al método getMetaData en un objeto ResultSet, el método devuelve un objeto ResultSetMetaData que describe las columnas de ese objeto ResultSet. En los casos en que la sentencia SQL que se va a procesar no se conoce hasta el momento de la ejecución, puede utilizarse ResultSetMetaData para determinar cuál de los métodos get hay que emplear para recuperar los datos. El ejemplo de código siguiente utiliza ResultSetMetaData para determinar cada uno de los tipos de columna del conjunto de resultados.
ResultSet rs = stmt.executeQuery(sqlString);
ResultSetMetaData rsmd = rs.getMetaData();
int colType [] = new int[rsmd.getColumnCount()];
for (int idx = 0, int col = 1; idx < colType.length; idx++, col++)
colType[idx] = rsmd.getColumnType(col);

Características de ResultSet

Este tema trata de las características de los ResultSets, como son los tipos de ResultSet, la concurrencia, la capacidad para cerrar el ResultSet comprometiendo el objeto conexión, y la especificación de las características de ResultSet.
Por defecto, el tipo de todos los ResultSets creados es solo de reenvío, la concurrencia es solo de lectura y los cursores se retienen en los límites del compromiso. Una excepción de ello la presenta WebSphere, que actualmente cambia el valor predeterminado de la capacidad de retención de cursores para que los cursores se cierren implícitamente al comprometerse. Estas características pueden configurarse mediante los métodos accesibles en objetos Statement, PreparedStatement y CallableStatement.

Tipos de ResultSet

El tipo de un ResultSet especifica los siguiente acerca del ResultSet:
·         Si el ResultSet es desplazable.
·         Los tipos de los ResultSets de Java™ Database Connectivity (JDBC) definidos por constantes en la interfaz ResultSet.
Las definiciones de estos tipos de ResultSet son las siguientes:
TYPE_FORWARD_ONLY
Un cursor que solo puede utilizarse para procesar desde el principio de un ResultSet hasta el final del mismo. Este es el tipo por omisión.
TYPE_SCROLL_INSENSITIVE
Un cursor que se puede emplear para desplazares a través de un ResultSet. Este tipo de cursor es insensible a los cambios efectuados en la base de datos mientras está abierto. Contiene filas que satisfacen la consulta cuando esta se procesa o cuando se extraen datos.
TYPE_SCROLL_SENSITIVE
Un cursor que puede utilizarse para el desplazamiento en diversas formas a través de un ResultSet. Este tipo de cursor es sensible a los cambios efectuados en la base de datos mientras está abierto. Los cambios en la base de datos tienen un impacto directo sobre los datos del ResultSet.
Los ResultSets de JDBC 1.0 son siempre solo hacia adelante. Los cursores desplazables se añadieron en JDBC 2.0.
Nota: las propiedades de agrupación por bloques habilitada y de conexión de tamaño de bloque afectan al grado de sensibilidad de un cursor TYPE_SCROLL_SENSITIVE. La agrupación por bloques mejora el rendimiento al almacenar en caché datos de la propia capa del controlador JDBC.

Concurrencia

La concurrencia determina si el ResultSet puede actualizarse. Los tipos se definen de nuevo mediante constantes de la interfaz ResultSet. Los valores de concurrencia disponibles son los siguientes:
CONCUR_READ_ONLY
Un ResultSet que solo puede utilizarse para leer datos de la base de datos. Este es el valor predeterminado.
CONCUR_UPDATEABLE
Un ResultSet que permite efectuar cambios en el mismo. Estos cambios pueden colocarse en la base de datos subyacente.
Los ResultSets de JDBC 1.0 son siempre solo hacia adelante. Los ResultSets actualizables se añadieron en JDBC 2.0.
Nota: Según la especificación JDBC, el controlador JDBC puede cambiar el tipo de ResultSet del valor de concurrencia de ResultSet si los valores no pueden utilizarse conjuntamente. En tales casos, el controlador JDBC sitúa un aviso en el objeto Connection.
Existe una situación en la que la aplicación especifica un ResultSet TYPE_SCROLL_INSENSITIVE, CONCUR_UPDATEABLE. La insensibilidad se implementa en el motor de bases de datos efectuando una copia de los datos. A continuación, no se permite al usuario realizar actualizaciones mediante esa copia en la base de datos subyacente. Si especifica esta combinación, el controlador cambia la sensibilidad a TYPE_SCROLL_SENSITIVE y crea el aviso, que indica que la petición se ha cambiado.

Capacidad de retención

La característica de capacidad de retención determina si la llamada al compromiso en el objeto Connection cierra el ResultSet. La API de JDBC destinada a trabajar con la característica de capacidad de retención es nueva en la versión 3.0. Sin embargo, el controlador JDBC nativo ha proporcionado una propiedad de conexión para varios releases que le permite especificar ese valor predeterminado para todos los ResultSets creados bajo la conexión. El soporte de API altera temporalmente cualquier valor de la propiedad de conexión. Los valores de la característica de capacidad de retención se definen mediante constantes de ResultSet y son los siguientes:
HOLD_CURSOR_OVER_COMMIT
Todos los cursores abiertos permanecen así cuando se llama a la cláusula commit. Este es el valor predeterminado del controlador JDBC nativo.
CLOSE_CURSORS_ON_COMMIT
Todos los cursores abiertos se cierran cuando se llama a la cláusula commit.
Nota: Al llamar a la retrotracción en una conexión, siempre se cierran todos los cursores abiertos. Este es un hecho poco conocido, pero es una forma común de que las bases de datos manejen los cursores.
Según la especificación JDBC, el valor predeterminado de la capacidad de retención está definida por la implementación. Algunas plataformas optan por utilizar CLOSE_CURSORS_ON_COMMIT como valor predeterminado. Esto no representa generalmente un problema para la mayoría de las aplicaciones, pero el usuario debe estar al corriente de lo que realiza el controlador que utiliza si está trabajando con cursores en los límites del compromiso. El controlador JDBC de IBM® Toolbox para Java también utiliza el valor predeterminado de HOLD_CURSORS_ON_COMMIT, pero el controlador JDBC de UDB para Windows NT® tiene el valor predeterminado CLOSE_CURSORS_ON_COMMIT.

Especificar características de ResultSet

Las características de un ResultSet no cambian una vez que se ha creado el objeto ResultSet. Por tanto, las características se han especificado antes de crear el objeto. Puede especificar estas características mediante variantes cargadas a posteriori de los métodos createStatement, prepareStatement y prepareCall.
Nota: Existen métodos de ResultSet para obtener el tipo de ResultSet y la concurrencia del ResultSet, pero no existe ningún método para obtener la capacidad de retención del ResultSet.
·         Ejemplo: ResultSets sensibles e insensibles
El ejemplo siguiente muestra la diferencia entre los ResultSets sensibles y los insensibles cuando se insertan filas en una tabla.
·         Ejemplo: sensibilidad de ResultSet
El ejemplo siguiente muestra cómo un cambio puede afectar a una cláusula where de una sentencia SQL en función de la sensibilidad del ResultSet.


Interfaz java.sql.ResultSet

Interfaz pública ResultSet
Un ResultSet proporciona acceso a una tabla de datos generados al ejecutar un Statement. Las filas de la tabla se recuperan en secuencia. Dentro de una fila se puede acceder a sus valores de columna en cualquier orden.

Un ResultSet mantiene un cursor que apunta a su fila actual de datos. Inicialmente el cursor se coloca antes de la primera fila. El método 'siguiente' mueve el cursor a la siguiente fila.

Los métodos getXXX recuperan los valores de columna de la fila actual. Puede recuperar valores utilizando el número de índice de la columna o utilizando el nombre de la columna. En general, utilizar el índice de columna será más eficiente. Las columnas se numeran desde 1.

Para una portabilidad máxima, las columnas ResultSet dentro de cada fila se deben leer en orden de izquierda a derecha y cada columna debe leerse una sola vez.

Para los métodos getXXX, el controlador JDBC intenta convertir los datos subyacentes en el tipo Java especificado y devuelve un valor Java adecuado. Consulte la especificación JDBC para las asignaciones permitidas de tipos SQL a tipos Java con los métodos ResultSet.getXXX.

Los nombres de columna utilizados como entrada para los métodos getXXX son insensibles a mayúsculas y minúsculas. Al realizar un getXXX usando un nombre de columna, si varias columnas tienen el mismo nombre, se devolverá el valor de la primera columna coincidente. La opción de nombre de columna está diseñada para utilizarse cuando se utilizan nombres de columna en la consulta SQL. Para las columnas que no están explícitamente nombradas en la consulta, es mejor utilizar números de columna. Si se usaron nombres de columna, no hay forma de que el programador garantice que se refieren realmente a las columnas previstas.

Un ResultSet se cierra automáticamente por la instrucción que lo generó cuando se cierra, se vuelve a ejecutar o se utiliza para recuperar el resultado siguiente de una secuencia de resultados múltiples.

El número, los tipos y las propiedades de las columnas de un ResultSet son proporcionados por el objeto ResulSetMetaData devuelto por el método getMetaData.

Propiedades del objeto ResultSet

MaxMultiLineTextLength

Descripción

Obtiene o establece el límite actual de datos que se pueden capturar para un campo de texto de varias líneas.
Es útil si los resultados incluyen uno o más campos que contienen una entrada de texto larga, de varias líneas, y existe la posibilidad de que al capturar los datos se produzca un desbordamiento del espacio de almacenamiento intermedio. También resulta útil si se desea examinar los resultados y obtener mejor rendimiento.
De forma predeterminada, no existe límite para la longitud de los datos obtenidos de un campo de texto de varias líneas.
Puede restablecer el valor predeterminado estableciendo el parámetro de longitud en cero (0).
El límite se aplica a los campos de serie cortos así como también a los campos de texto de varias líneas. Un campo de serio corto puede tener 254 caracteres, de forma que puede establecer un límite para ello.

Sintaxis

resultset.MaxMultiLineTextLength 
resultset.MaxMultiLineTextLength max_length 
Perl
$resultset->GetMaxMultiLineTextLength();
 
$resultset->SetMaxMultiLineTextLength($max_length); 
Identificador
Descripción
resultset
Un objeto ResultSet que representa las filas y las columnas de datos resultantes de una consulta.
max_length
Un valor Long que especifica la longitud máxima actual en bytes de datos obtenidos de un campo de texto de varias líneas.
Valor de retorno
Devuelve un valor Long que contiene la longitud máxima actual en bytes de datos obtenidos de un campo de texto de varias líneas.

Ejemplo

Perl
$queryDefObj = $SessionObj->BuildQuery("Defect");
$queryDefObj->BuildField("description");
$queryDefObj->BuildField("id");
 
$resultSetObj = $SessionObj->BuildResultSet($queryDefObj);
 
$resultSetObj->SetMaxMultiLineTextLength(5);
# Not setting the above max multiline text length 
# or setting it to 0 will fetch the entire data of 
# the long varchar column
 
$resultSetObj->Execute();
 
$status = $resultSetObj->MoveNext();
$i=0;
while ($status == 1) {
    $xnote = $resultSetObj->GetColumnValue(1);
    print $i++,". desc=",$xnote,"\n";
    $entyObj = $SessionObj->GetEntity( "defect",
        $resultSetObj->GetColumnValue(2));
    $SessionObj->EditEntity($entyObj,"modify");
    $entyObj->SetFieldValue("headline","testXXX".($i));
    $retval = $entyObj->Validate();
    $entyObj->Commit();
    $status = $resultSetObj->MoveNext();
} 

BuildResultSet

Descripción

Crea y devuelve un conjunto de resultados que se puede utilizar para ejecutar una consulta.
Este método crea un objeto ResultSet para el objeto QueryDef especificado. A continuación, se puede utilizar el objeto ResultSet devuelto para ejecutar la consulta y almacenar los datos resultantes.
No llame a este método hasta que haya añadido todos los campos y los filtros que desea al objeto QueryDef. Este método utiliza la información del objeto QueryDef para compilar el conjunto de estructuras de datos que se necesitan para almacenar los datos de la consulta. Si añade nuevos campos o filtros al objeto QueryDef después de llamar a este método, el objeto ResultSet no refleja las nuevas adiciones. Para ejecutar la consulta y captar los datos resultantes, se debe llamar posteriormente a Execute del objeto ResultSet.
Nota: Para obtener el objeto QueryDef que pasa a este método, se debe llamar al método BuildQuery . Para construir un objeto ResultSet directamente de una serie de consulta SQL sin formato, utilice el método BuildSQLQuery.
Para ver un ejemplo de cómo utilizar BuildResultSet, consulte Ejecución de una consulta que tiene filtros dinámicos.

Sintaxis

session.BuildResultSet(querydef) 
Perl
$session->BuildResultSet($querydef); 
Identificador
Descripción
session
El objeto Session que representa la sesión de acceso a la base de datos actual.
querydef
Un Objeto QueryDef que define la consulta que se desea.
Valor de retorno
Un Objeto ResultSet adecuado para la ejecución eventual de la consulta.

Ejemplos

VBScript
set sessionObj = GetSession 
' Create a query and result set to search for all records. 
 
set queryDefObj = sessionObj.BuildQuery("defect") 
queryDefObj.BuildField("id") 
set resultSetObj = sessionObj.BuildResultSet(queryDefObj)
resultSetObj.Execute 
Perl
$sessionObj = $entity->GetSession();
 
# Create a query and result set to search for all records. 
$queryDefObj = $sessionObj->BuildQuery("defect");
$queryDefObj->BuildField("id");
$resultSetObj = $sessionObj->BuildResultSet($queryDefObj);
$resultsetObj->Execute(); 



MaxResultSetRows

Descripción

Establece o devuelve el límite inicial sobre el número de registros devuelto en un conjunto de resultados.
El valor de MaxResultSetRows es el valor del límite inicial que limita el número de filas en ResultSet. Los clientes pueden alterar temporalmente el límite inicial, siempre que el valor del límite inicial no sea menor que el límite final o absoluto. Cuando el valor de MaxResultSetRows es 0, se utiliza el límite absoluto.
Nota: Este método estuvo disponible en la versión 7.1.

Sintaxis

resultset.MaxResultSetRows 
resultset.MaxResultSetRows limit 
Perl
$resultset->GetMaxResultSetRows();
$resultset->SetMaxResultSetRows($limit); 
Identificador
Descripción
resultset
Un objeto ResultSet que representa las filas y las columnas de datos resultantes de una consulta.
limit
Un valor Long que especifica el límite de filas devueltas en ResultSet.
Valor de retorno
Devuelve un valor Long que contiene el límite para el número de filas devueltas en ResultSet.

Ejemplo

Perl
 # limit a ResultSet to 10000 rows
 my $CQWorkSpace = $CQSession->GetWorkSpace();
 my $qry = $CQWorkSpace->GetQueryDef("Public Queries/Some Big Query");
 my $ResultSet = $CQSession->BuildResultSet($qry);
 $ResultSet->SetMaxResultSetRows(10000);
 $ResultSet->Execute();

GetQueryLimit

Descripción

Devuelve un conjunto de límite de consulta inicial o final para la sesión.
  • El límite absoluto es el límite de consulta absoluto que está establecido para la sesión.
  • El límite inicial es el límite que está establecido para la sesión. El límite de consulta inicial lo establece SetMaxResultSetRows. Este valor no puede ser mayor que el límite de consulta final.
El argumento QUERY_LIMIT_TYPE no es una enumeración QueryLimitType con el valor de SOFT_QUERY_LIMIT o HARD_QUERY_LIMIT.
Nota: Este método estuvo disponible en la versión 7.1.

 

Sintaxis

resultset.GetQueryLimit QUERY_LIMIT_TYPE 
Perl
$resultset->GetQueryLimit($QUERY_LIMIT_TYPE); 
Identificador
Descripción
resultset
Un objeto ResultSet que representa las filas y las columnas de datos resultantes de una consulta.
QUERY_LIMIT_TYPE
Un valor Long que especifica el tipo de límite de consulta para las filas devueltas en ResultSet.
Valor de retorno
Devuelve un valor Long que contiene el límite de consulta inicial o final.

ResultSetIsLimited

Descripción

Devuelve un valor Long que indica si el conjunto de resultados está limitado. Devuelve el número de filas que se van a devolver si la ejecución del objeto ResultSet object está limitada o 0 (zero) si no está limitada.
Este método está disponible después de una llamada al método Execute del objeto ResultSet y puede utilizarse con los métodos EnableRecordCount y GetRecordCount.
Nota: Este método estuvo disponible en la versión 7.1.

Sintaxis

resultset.ResultSetIsLimited 
Perl
$resultset->ResultSetIsLimited();
Identificador
Descripción
resultset
Un objeto ResultSet que representa las filas y las columnas de datos resultantes de una consulta.
Valor de retorno
Devuelve un valor Long que representa el número de filas al que está limitado el objeto ResultSet; devuelve 0 (cero) si ResultSet no está limitado.

Ejemplo

Perl
# Alert the caller about the data truncation: 
$ResultSet->EnableRecordCount();
$ResultSet->Execute();
My $limited_rs = $ResultSet->ResultIsLimited();
My $recs = $ResultSet->GetRecordCount();
If ($limites_rs) print "ResultSet limited to $recs rows!\n";

 

RecordCount

Descripción

Devuelve el recuento de registros (número de filas) del conjunto de resultados.
Para obtener un recuento de registros, en primer lugar debe utilizar EnableRecordCount para habilitar el recuento de filas y, a continuación, debe llamar a RecordCount (GetRecordCount, para Perl) para obtener el número de registros.

 

Sintaxis

resultset.RecordCount 
Perl
$resultset->GetRecordCount(); 
Identificador
Descripción
resultset
Un objeto ResultSet que representa las filas y las columnas de datos resultantes de una consulta.
Valor de retorno
Un valor Long que contiene el número de registros del conjunto de resultados.

Ejemplo

Set ResultSet = cqSession.BuildResultSet(qrydef)
 
ResultSet.EnableRecordCount
 
ResultSet.Execute
 
count = ResultSet.RecordCount 

 

EnableRecordCount

Descripción

Habilita el recuento de registros para el conjunto de resultados.
Para obtener un recuento de registros, en primer lugar se debe utilizar EnableRecordCount para habilitar el recuento de filas y, a continuación, se debe llamar a RecordCount para obtener el número de registros. Utilice este método después de definir el objeto ResultSet, pero antes de ejecutarlo.

Sintaxis

resultset.EnableRecordCount 
Perl
$resultset->EnableRecordCount(); 
Identificador
Descripción
resultset
Un objeto ResultSet que representa las filas y las columnas de datos resultantes de una consulta.
Valor de retorno
Ninguno.

Ejemplo

Set ResultSet = cqSession.BuildResultSet(qrydef)
 
ResultSet.EnableRecordCount
ResultSet.Execute
count = ResultSet.RecordCount 
Perl
$resultset->EnableRecordCount();
$resultset->Execute();
$rows = $resultset->GetRecordCount(); 

EJEMPLO

Ejemplo: interfaz ResultSet 

Este es un ejemplo de cómo utilizar la interfaz ResultSet.
Nota: Al utilizar los ejemplos de código, acepta los términos de: Información sobre licencia de código y exención de responsabilidad.
import java.sql.*;
 
/**
ResultSetExample.java
 
Este programa muestra la utilización de ResultSetMetaData y 
ResultSet para visualizar todos los datos de una tabla aunque 
el programa que obtiene los datos no sabe cuál es el aspecto
que tendrá la tabla (el usuario pasa los valores correspondientes 
a la tabla y a la biblioteca).
**/
public class ResultSetExample {
 
    public static void main(java.lang.String[] args)
    {
        if (args.length != 2) {
            System.out.println("Uso:  java ResultSetExample <biblioteca> <tabla>");
            System.out.println(" siendo <biblioteca> la biblioteca que contiene la <tabla>");
            System.exit(0);
        }
 
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;
        ResultSetMetaData rsmd = null;
 
        try {
            // Obtener una conexión a base de datos y preparar una sentencia.
            Class.forName("com.ibm.db2.jdbc.app.DB2Driver");
            con = DriverManager.getConnection("jdbc:db2:*local");
 
            s = con.createStatement();
 
            rs = s.executeQuery("SELECT * FROM " + args[0] + "." + args[1]);
            rsmd = rs.getMetaData();
 
            int colCount = rsmd.getColumnCount();
            int rowCount = 0;
            while (rs.next()) {
                rowCount++;
                System.out.println("Datos para la fila " + rowCount);
                for (int i = 1; i <= colCount; i++)
                    System.out.println("   Fila " + i + ": " + rs.getString(i));
            }
 
        } catch (Exception e) {
            // Manejar los errores.
            System.out.println("Tenemos un error... ");
            e.printStackTrace();
        } finally {
            // Hay que asegurarse de que siempre se haga
            // el borrado. Si la conexión se cierra, la
// sentencia que hay debajo de ella también se cerrará.
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    System.out.println("Error grave: no se puede cerrar el objeto conexión");
                }
            }
        }
    }
}

EJEMPLO LLENAR UN JTABLE CON RESULTSET

"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

1. ENTORNO

  • JDK 6 Update 21
  • Netbeans 6.9.1
  • MySQL 5.1.

2. INTRODUCCIÓN


Lo que se desea demostrar en este tutorial es como mostrar los datos de una consulta en un JTable. Haciendo uso de la clase ResultSetMetaData que nos brinda la información de una tabla de la base de datos y la clase ResultSet que nos devuelve la data producto de una consulta hacia la base de datos.

3. DESARROLLO


3.1. Crear el proyecto

Primero debemos de crear un proyecto en Netbeans para eso nos vamos a "File->New Project" y seleccionamos la opción de crear un "Java Application"





Y como nombre al proyecto le ponemos "LlenarJTable"




Al proyecto debemos de agregar un formulario (JFrameForm) que lo llamaremos "frmLlenarJtable". Para hacemos clic derecho en el paquete que se llama "llenarjtable" de ahí seleccionamos New y elegimos "JFrame Form"


3.2. Diseño del Formulario

Debemos de diseñar el siguiente formulario:


Donde:

El JTextBox: Recibe el nombre de txtQuery
El JTable: Recibe el nombre de jtQuery
El JButton: Recibe el nombre de btnConsultar

3.3. Crear base de datos en MySQL

Debemos de crear una base de datos en MySQL. A la base de la llamaremos "bdproductos" y también crearemos una tabla que se llamara "producto"




3.4. Codificando el action del botón "Consultar"

Debemos de codificar la acción del botón "Consultar" que va a llenar al JTable con la data producto de la consulta que vamos a hacer a la base de datos bdproductos que esta en MySQL. No olvidar agregar el conector al Netbeans para poder comunicarnos con MySQL.




Para ir a la Action del botón debemos hacer clic derecho en el botón de ahí seleccionamos Events, luego Action y finalmente ActionPerformed




Y luego dentro de ese evento ponemos el siguiente codigo
try {
 //Para establecer el modelo al JTable
 DefaultTableModel modelo = new DefaultTableModel();
 this.jtQuery.setModel(modelo);
 //Para conectarnos a nuestra base de datos
 DriverManager.registerDriver(new com.mysql.jdbc.Driver());
 Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/bdproductos", "usuario", "clave");
 //Para ejecutar la consulta
 Statement s = conexion.createStatement();
 //Ejecutamos la consulta que escribimos en la caja de texto
 //y los datos lo almacenamos en un ResultSet
 ResultSet rs = s.executeQuery(txtQuery.getText());
 //Obteniendo la informacion de las columnas que estan siendo consultadas
 ResultSetMetaData rsMd = rs.getMetaData();
 //La cantidad de columnas que tiene la consulta
 int cantidadColumnas = rsMd.getColumnCount();
 //Establecer como cabezeras el nombre de las colimnas
 for (int i = 1; i <= cantidadColumnas; i++) {
  modelo.addColumn(rsMd.getColumnLabel(i));
 }
 //Creando las filas para el JTable
 while (rs.next()) {
  Object[] fila = new Object[cantidadColumnas];
  for (int i = 0; i < cantidadColumnas; i++) {
    fila[i]=rs.getObject(i+1);
  }
  modelo.addRow(fila);
 }
 rs.close();
 conexion.close();
} catch (Exception ex) {
 ex.printStackTrace();
}

4. EJEMPLO DE LA APLICACIÓN

Sin poner etiquetas a la consulta





Con etiquetas a la consulta



RESUMEN
CLASE RESULTSET
Un Result Set contiene todas las filas que satisfacen las condiciones de una sentencia SQL y proporciona el acceso a los datos de estas filas mediante un conjunto de metodos get que permiten el acceso a las diferentes columnas de las filas.

El metodo Result Set.next se usa para moverse a la siguiente fila del result set,convirtiendo a esta en la fila actual.

El formato general de un result set es una tabla con cabeceras de columna y los valores correspondientes devueltos por la query.

El siguiente fragmento de codigo es un ejemplo de la ejecucion de una sentencia SQL que devolvera una coleccion de filas, con la columna 1 como un int, la columna 2 como una String y la columna 3 como un array de bytes: Un Result Set mantiene un cursor que apunta a la fila actual de datos.
COLUMNAS
Puede usarse o bien el nombre de la columna o el numero de columna para Notese que las columnas se numeran de izquierda a derecha comenzando con la La opcion de usar el nombre de columna fue provista para que el usuario que especifica nombres de columnas en una query pueda usar esos nombres como especifica nombres de columnas , deben usarse los numeros de columna.
Tipos de datos y conversiones.

Para los metodos get XXX, el driver JDBC intenta convertir los datos subyacentes a Datos de la base de datos en la base subyacente es VARCHAR, el driver JDBC Una x indica un metodo get XXX legal para un tipo de dato particular.

El metodo get Object devolvera cualquier tipo de dato como un Object Java y es util
Uso de Streams valores muy grandes de filas

Result Set hace posible el recuperar datos arbitrariamente grandes de tipo Esto se hace mediante la clase Result Set que devuelve streams Get Binary Stream devuelve una corriente que simplemente suminiistra Get Ascii Stream devuelve una corriente con caracteres ASCII Get Unicode Stream devuelve una corriente con caracteres Unicode 1 de 2
Result sets opcionales o múltiples.

Circunstancias una aplicacion puede no saber si una sentencia devolvera un result Almacenados pueden devolver varios result sets y/o update counts.

Arbitraria de result sets y update counts.
Recuperar datos de ResultSet
El objeto Result Set proporciona varios métodos para obtener los datos de columna correspondientes a un fila.

Todos ellos tienen el formato get, siendo un tipo de datos Java .

Casi todos estos metodos toman un solo parámetro, que es el indice que la columna tiene dentro del Result Set o bien el nombre de la columna.

En los metodos get que devuelven objetos, el valor de retorno es null cuando la columna del Result Set es nula.

En tipos primitivos, no puede devolverse null.
Características de ResultSet

Este tema trata de las caracteristicas de los Result Sets, como son los tipos de Result Set, la concurrencia, la capacidad para cerrar el Result Set comprometiendo el objeto conexion, y la especificacion de las caracteristicas de Result Set. El tipo de un Result Set especifica los siguiente acerca del Result Set: Un cursor que se puede emplear para desplazares a traves de un Result Set. Este tipo de cursor es insensible a los cambios efectuados en la base de datos mientras esta abierto.

Un cursor que puede utilizarse para el desplazamiento en diversas formas a traves de un Result Set. Este tipo de cursor es sensible a los cambios efectuados en la base de datos mientras esta abierto.

Nota: Segun la especificacion JDBC, el controlador JDBC puede cambiar el tipo de Result Set del valor de concurrencia de Result Set si los valores no pueden utilizarse conjuntamente.
Propiedades del objeto ResultSet

$result Set Obj = $Session Obj->Build Result Set ; Este metodo crea un objeto Result Set para el objeto Query Def especificado.

Si anade nuevos campos o filtros al objeto Query Def despues de llamar a este metodo, el objeto Result Set no refleja las nuevas adiciones. set query Def Obj = session Obj.Build Query Def Obj.Build Field set result Set Obj = session Obj.Build Result Set


SUMMARY
RESULTSET CLASS
A Result Set contains all the rows that satisfy the conditions of an SQL statement and provides access to the data in these rows using a set of get methods that allow access to the different columns of the rows.

The Result Set.next method is used to move to the next row of the result set, making it the current row.

The general format of a result set is a table with column headers and the corresponding values ​​returned by the query.

The following code fragment is an example of executing an SQL statement that will return a collection of rows, with column 1 as an int, column 2 as a String, and column 3 as an array of bytes: A Result Set holds A cursor pointing to the current row of data.
COLUMNS
You can either use the name of the column or the number of column for Notese that the columns are numbered from left to right beginning with the option to use the column name was provided so that the user who specifies column names in a query You can use those names as you specify column names, column numbers must be used.
Data types and conversions.

For get XXX methods, the JDBC driver attempts to convert the underlying data to Database Data on the underlying base is VARCHAR, the JDBC driver A x indicates a legal XXX get method for a particular data type.

The method get Object will return any type of data as an Object Java and is useful
Using Streams very large values ​​of rows

Result Set makes it possible to retrieve arbitrarily large data of type This is done by class Result Set that returns streams Get Binary Stream returns a stream that simply suminiistra Get Ascii Stream returns a stream with ASCII characters Get Unicode Stream returns a stream with Unicode characters 1 of 2
Optional or multiple result sets.

Circumstances an application may not know if a statement will return a result Stored can return several result sets and / or update counts.

Arbitrary of result sets and update counts.
Recover Data from ResultSet
The Result Set object provides several methods for obtaining column data corresponding to a row.

They all have the get format, being a Java data type.

Almost all of these methods take a single parameter, which is the index that the column has within the Result Set or the name of the column.

In get methods that return objects, the return value is null when the Result Set column is null.

In primitive types, null can not be returned.
Features of ResultSet

This topic deals with the characteristics of Result Sets, such as Result Set types, concurrency, the ability to close the Result Set by compromising the connection object, and specifying the characteristics of the Result Set. The type of a Result Set specifies the following about the Result Set: A cursor that can be used to move through a Result Set. This type of cursor is insensitive to changes made in the database while it is open.

A cursor that can be used for scrolling in various ways through a Result Set. This type of cursor is sensitive to changes made in the database while it is open.

Note: According to the JDBC specification, the JDBC driver can change the Result Set type of the Result Set concurrency value if the values ​​can not be used together.
ResultSet object properties

$ Result Set Obj = $ Session Obj-> Build Result Set; This method creates a Result Set object for the specified Query Def object.

If you add new fields or filters to the Query Def object after calling this method, the Result Set object does not reflect the new additions. Set query Obj = session Obj.Build Query Def Obj.Build Field set result Set Obj = session Obj.Build Result Set
RECOMENDACIÓN
·         Se le recomienda trabajar con ResultSet dentro del (try/catch) por si algo va mal, la aplicación no detenga su ejecución de manera brusca.

·         Cuando desarrollamos una aplicación con JDBC, una de las tareas que programamos frecuentemente es pasar un objeto de tipo ResultSet a una lista de objetos Map, List<Map<String,Object>>.


En conclusión
Como un elemento básico del desarrollo de Java, la API JDBC es algo que todos los desarrolladores Java deben conocer como la parte posterior de su mano. Lo curioso es que la mayoría de los desarrolladores no se han mantenido al día con las mejoras de la API a lo largo de los años, por lo que pierden los trucos de ahorro de tiempo descritos en este artículo.
Si usted decide utilizar las características más nuevas de JDBC, depende de usted, por supuesto. Un aspecto clave a considerar será la escalabilidad del sistema en el que está trabajando. Cuanto mayor sea la escala, más restringido será el uso de la base de datos y, por lo tanto, más tendrá que reducir el tráfico de red en su contra. Rowsets, llamadas escalares y actualizaciones por lotes serán tus amigos aquí. De lo contrario, pruebe los ResultSets desplazables y actualizables (que no consumen tanta memoria como los conjuntos de filas) y mida el éxito de escalabilidad. Probablemente no será tan malo como usted espera.

JDBC no sólo admite conjuntos de resultados bidireccionales, sino que también admite actualizaciones en sitio en ResultSets. Esto significa que en lugar de crear una nueva instrucción SQL para cambiar los valores almacenados actualmente en la base de datos, sólo puede modificar el valor contenido dentro del ResultSet y se enviará automáticamente a la base de datos para esa columna de esa fila.
Pedir un ResultSet actualizable es similar al proceso implicado en pedir un ResultSet desplazable. De hecho, es donde usará el segundo parámetro para createStatement (). En lugar de especificar ResultSet.CONCUR_READ_ONLY para el segundo parámetro, envíe ResultSet.CONCUR_UPDATEABLE.

Apreciación del equipo

este trabajo acerca de la clase resul set nos ha permitido conocer bastante como  por ejemplo Su sintaxis ,para que sirve, también  hemos que entendido Un Resultes mantiene un cursor que apunta a la fila actual de datos y simpre se va a mover hacia la fila siguiente cada ves que llamemos al método nex().
También hemos entendido, si queremos obtener los datos de las columnas se llama al método getXXX  se puede obtener los datos con el nombre de la columna de la de nuestra base de datos o por el numero de la columna:
  de la siguiente forma.
String s = rs.getString("title");
String s = rs.getString(2);

Bueno y por lo diremos que esta clase Resultset es muy importante porque sin ella no podremos acceder a los datos que se encuentran almacenados en nuestra base de datos

Glosario de Términos
getInt: Recupera el valor del parámetro designado como un valor int en el lenguaje de programación Java según el nombre del parámetro.
Query: significa consulta. Es decir, un query en base de datos es una búsqueda o pedido de datos almacenados en una base de datos.
 Array: son usados extensamente por los programadores para contener listas de datos en la memoria  DBMS: "Database Management System" (DBMS) son un tipo de software muy específico, dedicado a servir de interfaz entre la base de datos, el usuario y las aplicaciones que la utilizan.
RecordCount: Devuelve el recuento de registros (número de filas) del conjunto de resultados.
MaxResultSetRows: Establece o devuelve el límite inicial sobre el número de registros que se incluirá en el conjunto de resultados cuando se ejecuta una consulta
clearWarnings (): Borra todos los avisos de la cadena.
getCursorName(): Obtiene el nombre del cursor asignado a este ResultSet.
 getWarnings (): Obtiene el primer aviso de la cadena de avisos SQL producidos durante el trabajo con este ResultSet o null si no hay ninguno. La cadena de avisos se renueva con cada fila.
clearWarnings(): Borra todos los avisos de la cadena.


LINCOGRAFIA





Por si mas les interese este Proyecto acá los dejaré el link para sus respectivas diapositivas

http://es.slideshare.net/ErlinDarwinHerreraCieza/presentacin-result-set

espero sea de su agrado Gracias a todos

No hay comentarios:

Publicar un comentario