3. 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.
4. 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 actual.
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
5. 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.
6. 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.
7. Los métodos
Siguiente fila: next()
public abstract boolean next() throws SQLException
Pasa a la siguiente fila, o a la primera cuando se ejecuta por primera vez. Devuelve true si se
consigue y false si no quedan filas.
Cierre del ResultSet: close()
public abstract void close() throws SQLException
Cierra inmediatamente el ResultSet, liberando los recursos utilizados.
Resultados nulos: wasNull()
public abstract boolean wasNull() throws SQLException
Se usa después de obtener un null con un método getXXX() para comprobar que corresponde a un
valor NULL SQL.
8. Obtención de valores: getXXX()
public abstract tipoJava getXXX(int indiceColumna) throws
SQLException
public abstract tipoJava getXXX(String nombreColumna) throws
SQLException
Obtienen el valor contenido en la columna como un tipoJava, o un null si se trataba de
un valor NULL de SQL.
9. Método getXXX() Tipo Java
getString String
getBoolean boolean
getByte byte
getShort short
getInt int
getLong long
getFloat float
getDouble double
getBigDecimal* BigDecimal
getBytes byte[]
getDate Date
getTime Time
getTimestamp Timestamp
getAsciiStream** InputStream
getUnicodeStream** InputStream
getBinaryStream** InputStream
10. Lectura de avisos: getWarnings()
public abstract SQLWarning getWarnings() throws SQLException
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.
Borrado de avisos: clearWarnings()
public abstract void clearWarnings() throws SQLException
Borra todos los avisos de la cadena.
Obtención del nombre del cursor: getCursorName()
public abstract String getCursorName() throws SQLException
Obtiene el nombre del cursor asignado a este ResultSet.
11. Propiedades del ResultSet: getMetaData()
public abstract ResultSetMetaData getMetaData() throws SQLException
Obtiene en un objeto ResultSetMetaData información sobre el número de columnas y su
estructura.
Obtención de Objetos: getObject()
public abstract Object getObject(int indiceColumna) throws SQLException
public abstract Object getObject(int nombreColumna) throws SQLException
Obtiene el valor contenido en la columna como un objeto Java cuyo tipo sigue la traducción
estándar JDBC de tipos SQL a tipos Java. Este método es válido para tipos específicos de la
base de datos.
12. Recuperar datos de ResultSet
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.
13. Propiedades del objeto ResultSet
En la lista siguiente se resumen las propiedades del objeto ResultSet:
Nombre de propiedad
MaxMultiLineTextLength
Establece o devuelve el límite actual de longitud de datos obtenido de un campo de texto de
varias líneas. El límite se aplica a los campos de serie cortos así como también a los campos de
texto de varias líneas.
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.
RecordCount
Devuelve el recuento de registros (número de filas) del conjunto de resultados.
14. EJEMPLOS
1. Este programa hace una demostración de cómo utilizar un ResultSetMetaData
y un ResultSet para visualizar todos los metadatos de ResultSet creado al
consultar una tabla. El usuario pasa el valor de la tabla y la biblioteca.
import java.sql.*;
/**
ResultSetMetaDataExample.java
Este programa muestra la utilización de ResultSetMetaData y
ResultSet para visualizar todos los metadatos relacionados con un ResultSet
creado al consultar una tabla. El usuario pasa el valor correspondiente a
la tabla y a la biblioteca.
15. public class ResultSetMetaDataExample {
public static void main(java.lang.String[] args)
{
if (args.length != 2) {
System.out.println("Uso: java
ResultSetMetaDataExample <biblioteca> <tabla>");
System.out.println("siendo <biblioteca>
la biblioteca que contiene la <tabla>");
System.exit(0);
}
Connection con = null;
Statement s = null;
16. 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.DB2Driv
er");
con =
DriverManager.getConnection("jdbc:db2:*loca
l");
s = con.createStatement();
rs = s.executeQuery("SELECT *
FROM " + args[0] + "." + args[1]);
rsmd = rs.getMetaData();
17. int colCount = rsmd.getColumnCount();
int rowCount = 0;
for (int i = 1; i <= colCount; i++) {
System.out.println("Información acerca de la columna " + i);
System.out.println(" Nombre........: " + rsmd.getColumnName(i));
System.out.println(" Tipo de datos.....: " + rsmd.getColumnType(i)
+" ( " + rsmd.getColumnTypeName(i) + " )");
System.out.println(" Precisión.....: " + rsmd.getPrecision(i));
System.out.println(" Escala........: " + rsmd.getScale(i));
System.out.print (" Permitir nulos: ");
if (rsmd.isNullable(i)==0)
System.out.println("false");
else
System.out.println("true");
}
} catch (Exception e) {
18. // 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");
}}}}}