martes, 19 de julio de 2011

¿Cuántas filas retorna un ResultSet?

En uno de mis blogs doy un ejemplo de como retornar un vector con las filas de un ResultSet aún sin saber cuantas filas ha retornado éste, otra forma sencilla de saber la cantidad de filas que retorna un ResultSet es irnos hasta la última fila y extraer el número de ella, como ya sabemos, un ResultSet comienza en la fila 1 así que al irnos a la última fila, podremos saber cuantas filas tiene el ResultSet y cuando ya tengamos el valor nos devolvemos al inicio del ResultSet. He aquí un ejemplo simple y sin validaciones:

miResultSet.moveLast();
int cantFilas = miResultSet.getRow();
miResultSet.beforeFirst();

Para lograr esta funcionalidad (Scrollable ResultSet) debemos declarar el objeto Statement de la siguiente manera:

Statement stmt miConexion.createStatement(
   ResultSet.TYPE_SCROLL_INSENSITIVE,
   ResultSet.CONCUR_READ_ONLY
);
ResultSet miResultSet = stmt.executeQuery( miQuerySQL );


De esta manera también puedes utilizar otras funcionalidades como:
  • absolute( x ) mueve el cursor a la fila x.
  • relative( x ) mueve el cursor x filas hacia adelante o hacia atrás si -x.
  • previous( x ) mueve el cursor una fila hacia atrás, equivalente a previous(-1).
  • first() mueve el cursor a la primera fila, = beforeFirst() + next().
  • last() mueve el cursor a la última fila, = afterLast() + previous().
  • afterLast() mueve el cursor al final del ResultSet, aquí los métodos getXXX() y updateYYY() fallarán ya que estamos sobre una fila.
  • beforeFirst() mueve el cursor al inicio del ResultSet y al igual que el afterLast() los métodos getXXX() y updateYYY() no se deben utilizar.

  • Espero les sea de utilidad, de ser así cheka en [x]útil abajo ;)

    jueves, 7 de julio de 2011

    Paginación de filas desde SQL

    En alguna ocasión hemos visto que en una aplicación mostramos una tabla con los resultados de una consulta SQL, pero cuando la cantidad de filas es muy grande, la tabla también crece hacia abajo, que bonito sería poder mostrar solo una cantidad explícita de filas a la vez y que con solo oprimir siguiente nos muestre la siguiente secuencia de filas sin repetir, bueno, esta podría ser una solución:


    // La página que deseamos mostrar.
    DECLARE @Pagina INT = 2
    // Número de filas por página.
    DECLARE @Cant_deFilas INT = 10
    SELECT * FROM (
        SELECT RowNum = ROW_NUMBER() OVER (
            ORDER BY Campo_deOrdenamiento
        ), * FROM tbMiTabla ) AS t
    WHERE
        RowNum > (@Cant_deFilas * (@Pagina - 1)) AND
        RowNum <= (@Cant_deFilas * (@Pagina - 1)) + @Cant_deFilas
    ORDER BY Campo_deOrdenamiento


    Donde el Campo_deOrdenamiento es un campo de la tabla que nos funcione de orden para el contenido de ésta, puede ser un campo de fecha o algún ID.
    En éste ejemplo nos muestra el segundo grupo de 10 filas.
    Referencia completa: MSSQL Tips