RESULTSET

1. CONTENIDO
1.1. Definición
Es la representación en memoria de las tablas de la base de datos en disco, se puede entender como una tabla virtual, recordar que generalmente todos los procesos que se realizen con la tabla (insertar registros, eliminar registros, etc) se realizaran realmente contra un resulset y no provocaran ningun cambio en la tabla fisica en disco, resulset tiene un conjunto de metodos muy utiles y muy usados para el proceso de los renglones de la tabla virtual.
Puede utilizar un objeto ResultSet para ejecutar una consulta y examinar los resultados de la consulta.
Cuando crea consultas por medio del objeto QueryDef, debe crear un objeto ResultSet correspondiente para ejecutar la consulta y obtener los resultados. Cada objeto ResultSet se personaliza para la consulta que se ejecuta. El objeto ResultSet contiene estructuras de datos que organizan los datos de la consulta en filas y columnas, donde cada fila representa un único registro de datos y cada columna representa un campo del registro de datos. Después de ejecutar la consulta, puede navegar (moverse) fila a fila y columna a columna, para obtener los datos que desea.
Tenga en cuenta que:
Las columnas están numeradas de (1 a N), no de (0 a N-1).
Una vez que se haya generado el conjunto de resultados, es posible que necesite rellenar valores de parámetro, si se trata de una consulta con parámetros.
Una vez que se haya generado el conjunto de resultados y se hayan establecido los parámetros (si procede), la puede ejecutar para ver la salida de la consulta. Se permite ejecutar el conjunto de resultados varias veces, si se desea volver a ejecutar la consulta. (Es posible que haya borrado y restablecido los valores de parámetro). También se permite obtener el SQL para la consulta.
Conceptualmente, una consulta puede generar tanta salida que puede resultar imposible o, incluso, inútil copiarla sólo de la base de datos en la memoria del programa. Por ello, se debe utilizar un "cursor" para navegar a través de la salida, utilizando el método MoveNext.
Inmediatamente después de ejecutar el conjunto de resultados, el cursor se sitúa "justo antes" del primer elemento, de modo que se debe llamar a MoveNext para poder extraer el primer valor.
Para obtener el valor una vez que se haya colocado en la posición adecuada, utilice el método GetColumnValue.

Hoy veremos que es y como podemos usar un objeto ResultSet, como ya vimos anteriormente, un objeto Connection realiza la conexiona a la Base de Datos y con ayuda de un objeto Statement realiza consultas, entre otras sentencias, dichas consultas nos devuelven un conjunto de resultados, estos resultados son almacenados en un objeto tipo ResultSet, el cual veremos en el dia de hoy.
Una vez obtenido el objeto ResultSet procedemos a extraer la informacion que obtuvimos de la consulta a la Base de Datos, para hacer esto hacemos uso de los metodos y funciones del objeto ResultSet tales como next(), first(), last(), etc, que nos sirve para movernos entre las diferentes filas del conjunto de resultados.
Adicionalmente esta clase nos ofrece una gran variedad de metodos para obtener los valores de los campos del conjunto de resultados obtenidos por la consulta que se realizo, por ejemplo si necesitamos obtener un valor entero, tenemos el metodo getInt(), con dos vaiantes la primer getInt(int x) donde x es el numero de la columna de la consulta retornada o getInt(String nombre) donde nombre es el nombre de la columna de la consulta retornada. De esta forma obtenemos el valor almacenado en esa columna para la fila actual. Luego pasamos a la siguiente fila usando el metodo next() y asi hasta que no hayan mas filas.
Un ejemplo de como podemos usar un objeto ResultSet es:
       
import java.sql.*;
import java.util.Properties;
Statement stmt = null;
try {
   stmt = conn.createStatement( );
   ResultSet rs= stmt.executeQuery("SELECT nombre, apellido FROM usuario");

   while(rs.next()){
       String nom=rs.getString(1);
       String ape=rs.getString("apellido");
   }
}
catch (SQLException e) {
}
finally {
   stmt.close();
   conn.close();
}
       

De esta forma vemos como podemos obtener los valores devueltos por la consulta, y ademas vimos como obtener dicho valor conociendo el numero de la columna o el nombre de la columna. Usamos un loop, en este caso while, para ir recorriendo fila a fila todo el objeto ResultSet e ir sacando el nombre y el apellido de todos los registros obtenidos a partir de la consulta.
1.2. Propiedades

En la lista siguiente se resumen las propiedades del objeto ResultSet:

1.2.1. MaxMultiLineTextLength
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
import java.sql.*;
import java.util.Properties;
resultset.MaxMultiLineTextLength 
resultset.MaxMultiLineTextLength max_length 
       


Identificador
Description
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:
       
import java.sql.*;
import java.util.Properties;
$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();
} 
       

1.2.2. MaxResultSetRows
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.
RecordCount
Devuelve el recuento de registros (número de filas) del conjunto de resultados.
SINTAXIS
resultset.MaxResultSetRows 
resultset.MaxResultSetRows limit 
Identificador
Description
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:
       
import java.sql.*;
import java.util.Properties;
 # 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();
       

1.2.3. RercordCount
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 
Identificador
Description
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:
       
import java.sql.*;
import java.util.Properties;
Set ResultSet = cqSession.BuildResultSet(qrydef)

ResultSet.EnableRecordCount

ResultSet.Execute

count = ResultSet.RecordCount 
       
1.3. Ejemplos
1.3.1. Ejemplo 01
Manipulación del Datos del objeto Resultset en Java
       
import java.sql.*;
import java.util.Properties;
/**
  * Método que recibe el código del Departamento y retorna un vector de tipo Empleado con los datos de éstos.
  * @param idDepart Id del departamento del cual se desea extraer la información.
  * @return Persona[] Vector de Tipo Persona con los datos de los empleados pertenecientes al departamento.
  * @throws java.lang.Exception En caso de cualquier error de ejecución.
 */
public static Emplado[] getEmpleadosX_Departamento( int idDepart ) throws Exception{
    try{
        /* Configuraciones de conexión. */
        String DRIVER_SQL = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
        String DRIVER_ORACLE = "oracle.jdbc.driver.OracleDriver";
        Class.forName( /* Alguno de los dos anteriores. */ );
        Connection Cnx = DriverManager.getConnection( /* String de conexión aquí. */ );
        Cnx.setAutoCommit( true );

        /* Ejecusión de la consulta. */
        String strSQL = "SELECT cedula, nombre FROM tbEmpleados WHERE idDept = " + idDepart;
        Statement stmt = Cnx.createStatement();
        ResultSet rsltEmpleados = stmt.executeQuery( strSQL );

        /* 
        Instanciasión de la Lista.
        Como pueden observar al crear la lista se le indica que c/ítem
        de la lista es de tipo Empleado. 
        */
        java.util.List listaEmpleados = new ArrayList();

        /*
        Se recorre cada fila del ResultSet para instancia a cada empleado y agregarlo a la lista de empleados.
        */
        while( rsltEmpleados.next() ){
            /* Se instancia del nuevo Empleado. */
            Empleado tempEmpleado = new Empleado(
                rsltEmpleados.getString( "cedula" ) ),
                rsltEmpleados.getString( "nombre" ) )
            );
            /* Se agrega el empleado a la lista. */
            listaEmpleados.add( tempEmpleado );
        }

        /* Cierre de la conexión con la BD. */
        Cnx.close();

        /*
        Se retorna el contenido de la Lista pero convirtiéndola en vector de tipo Empleado ingresando un nuevo vector de tipo Empleado y esta vez si sabemos el tamaño trayendo el tamaño de la lista.
        */
        return listaEmpleados.toArray( new Empleado[ listaEmpleados.size() ] );
    }
    catch( Exception err ){
        throw new Exception(
            "Error en getEmpleadosX_Departamento( int ).\nDetalle:\n + " + err.getMessage()
        );
    }
}
       

1.3.2. Ejemplo 02
Consulta sql utilizando el objeto Resultset
       
import java.sql.*;
import java.util.Properties;
ConsultasSQL.java

package visorconsultas.controlador;

import java.sql.Connection;

import java.sql.Statement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

public class ConsultaSQL {

 private Connection conexion; 

 private ResultSet resultadoConsulta;

 private ResultSetMetaData metaDatos;

 private String consulta;

 //Crea dos arreglos

 private String[][] datosDevueltos;

 private String [] nombresColumnas;

 private String error;

    public ConsultaSQL(Connection conRecibida, String consultaRecibida){

     conexion=conRecibida;

     consulta=consultaRecibida;

     try {  

   //Crea una instancia para mandar sentencias al servidor MySQL

   Statement sentencia=conexion.createStatement();

   //Ejecuta la consulta y devuelve el ResultSet

   resultadoConsulta=sentencia.executeQuery(consulta);

   //Obtiene los metadatos del ResultSet 

   metaDatos=resultadoConsulta.getMetaData();

   error=null;

  }

  catch (SQLException e) {

   error=e.getMessage();

  }   

    }

    public String[][] getDatosDevueltos(){

     if(error==null){     

      try { 

   //Devuelve el número de columnas del resultset

       int columnas=metaDatos.getColumnCount();

   //Lleva el cursor a la última fila del resultset

       resultadoConsulta.last();

   //Obtiene el número de fila actual( que aquí es la última)

       int filas=resultadoConsulta.getRow();

   //Dimensiona el arreglo datosDevueltos con los enteros obtenidos  

       datosDevueltos=new String[filas][columnas];

   //Ubica el cursor antes del a primera fila

       resultadoConsulta.beforeFirst();

       for(int i=0;i
1.3.3. Ejemplo 03
Este es un ejemplo de cómo utilizar la interfaz ResultSet.
       
import java.sql.*;
import java.util.Properties;
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  ");
            System.out.println(" siendo  la biblioteca que contiene la ");
            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");
                }
            }
        }
    }
}
       
1.3.4. Ejemplo 04

       
import java.sql.*;
import java.util.Properties;
stmt = con.prepareStatement("SELECT * FROM personas");
       
rs = stmt.executeQuery();
       
// Desconocemos el número de columnas y filas que tiene la tabla
// Primero pintamos los nombres de las columnas
for (int x=1;x<=rs.getMetaData().getColumnCount();x++)
  System.out.print(rs.getMetaData().getColumnName(x)+ "\t");
       
System.out.println("");
       
// Ahora volcamos los datos
while(rs.next()) {
  for (int x=1;x<=rs.getMetaData().getColumnCount();x++)
    System.out.print(rs.getString(x)+ "\t");
       
  System.out.println("");
}


       
2. RESUMEN .
Cuando crea consultas por medio del objeto QueryDef, debe crear un objeto ResultSet correspondiente para ejecutar la consulta y obtener los resultados. Cada objeto ResultSet se personaliza para la consulta que se ejecuta. El objeto ResultSet contiene estructuras de datos que organizan los datos de la consulta en filas y columnas, donde cada fila representa un único registro de datos y cada columna representa un campo del registro de datos. Después de ejecutar la consulta, puede navegar (moverse) fila a fila y columna a columna, para obtener los datos que desea.
La interfaz  ResultSet  proporciona métodos getter, getboolean, getlong,ect.para recuperar valores de la columna de la fila actuallos valores se pueden recuperar utilizando el índice de la columna o nombre.En general se utiliza el índice de columna será mas eficiente.las columnas se enumeran desde 1  para una portabilidad máxima las columnas de conjunto de resultados dentro de cada fila se debe leer en orden de izquierda a derecha de cada columna debe lerse una sola vez.
para los métodos ,getter un controlados jdbc intenta convertir los datossubyacentes al tipo java  es escificado en el método  getter y devuelve un valor java adecuado
Pero para poder hacer uso de estas novedosas características se debe crear un objeto ResultSet adecuado, el tipo de ResultSet que permite realizar los movimientos antes mencionados se denomina scrollable. 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’.
Propiedades
En la lista siguiente se resumen las propiedades del objeto ResultSet
Nombre de Propiedad
Descripción
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.
3. SUMMARY
When you create queries using the QueryDef object, you must create a corresponding ResultSet object to run the query and get the results. Each ResultSet object is customized for the query that is executed. The ResultSet object contains data structures that organize the query data into rows and columns, where each row represents a single data record and each column represents a field in the data record. After executing the query, you can navigate (move) row by row and column by column, to get the data you want.
The ResultSet interface provides methods getter, getboolean, getlong, ect.to retrieve values ​​from the column of the current row, the values ​​can be retrieved using the index of the column or name.In general, the column index will be used more efficiently. are listed from 1 for maximum portability The result set columns within each row should be read in order from left to right of each column should be read only once.
for the methods, getter a controlled jdbc tries to convert the underlying data to the java type it is scripted in the getter method and returns an appropriate java value

But to be able to make use of these novel features, an appropriate ResultSet object must be created, the type of ResultSet that allows performing the aforementioned movements is called scrollable. The ResultSet.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'.
Properties
The properties of the ResultSet object are summarized in the following list Property Name
Description
MaxMultiLineTextLength Sets or returns the current data length limit obtained from a multi-line text field. The limit applies to short series fields as well as multi-line text fields. MaxResultSetRows Sets or returns the initial limit on the number of records to be included in the result set when a query is executed.

RecordCount Returns the count of records (number of rows) of the result set.
4. RECOMENDACIONES 
  • Un objecto Statement se debe crear utilizando el método de connection créate Statement.
  • solo se puede abrir a la vez el ResultSet por Statement
  • Es necesario utilizar una referencia al a interfaz ResultSet para manipular los datos
5. CONCLUSIONES
  • El Statement es el que genera el comando de ejecución
  • Para los métodos de conexión se utiliza los siguientes parámetros Connection, Statement, ResultSet.
  • El ResultSet apunta  un registro de datos actuales
6. APRECIACIÓN DEL EQUIPO
En los preliminares contenidos hemos venido tratando temas relacionados a la conexión a una base de datos incluso desarrollamos algunos objetos importantes tales como CONECTION Y STATEMENT en esta oportunidad tratamos  sobre otro objeto que indispensable en el desarrollo de software, el Objeto Resultset.
De la misma manera podemos indicar que gracia a la investigación más amplia que tuvimos con respecto a trabajos anteriores aclaramos algunos interrogantes que teníamos sobre este importante objeto (RESULTSET).
7. GLOSARIO DE TÉRMINOS
ResultSet:  resultados de un query.

Conexión: Línea de comunicación entre nuestro programa y el dbms 

Row: Un renglón (tupla) obtenidas de un query y que a su vez contiene las distintas columnas (valores atributos) de dicha operación.

TRANSACCIÓN: Unidad de programa que accede y posiblemente actualiza varios elementos de información

STATEMENT : ejecuta a través de la conexión

RESULTSET META DATA: información acerca de los resultados de un query, pero no de los resultados en si. 

DRIVER MANAGER: Busca el JDBC driver correspondiente

 INTERFACES JAVA: métodos de gestión de manejadores de conexión hacia cada modelo específico de base de datos.

REUTILIZANDO: permite volver a utilizar los bienes o productos desechados y darles un uso igual o diferente a aquel para el que fueron concebidos. 


JAVA DATABASE CONNECTIVITY  : más conocida por sus siglas JDBC, es una API que permite la ejecución de operaciones sobre bases de datos

8. LINKOGRAFÍA
https://msdn.microsoft.com/es-es/library/ms228700(v=vs.90).aspx

http://www.myjavazone.com/2012/08/resultset.html

http://www.w3api.com/wiki/Java:ResultSet.next()

http://www.programacionfacil.com/java_windows/resultset.html

http://cursodejava.com.mx/cursodejava206.html

http://www.chuidiang.org/java/mysql/ResultSet-DataBase-MetaData.php

http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc18.htm

http://profesores.fi-b.unam.mx/sun/Downloads/Java/jdbc.pdf

http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc18.htm

http://eolo.cps.unizar.es/java/JDBC/resultset.html

Comentarios

Publicar un comentario

Entradas populares de este blog

CONTROL JTABLE CON BASE DE DATOS

Reportes