SQLite cursores solo forward

16 views
Skip to first unread message

Aloisius

unread,
Jul 24, 2009, 6:46:37 AM7/24/09
to sqlite-latino
Muy buenas

Disculpas ante todo, xq soy muy novato, en esto de la programacion
web.

Tengo un problema con una aplicacion web que estoy realizando con JSP,
al conectarme a SQLite, mas concretamente en el momento de volver a
recorrer, el resultado de la consulta. Intento llevar el puntero del
resultado a la posicion inicial para poder volver a recorrerlo con
rs.first(); pero me lanza un error:
"Excepcion java.sql.SQLException: ResultSet is TYPE_FORWARD_ONLY"

He probado tambien a crear dos ResulSet diferentes con el mismo
PrepareStatement, pero no funciona, en ese caso, cuando voy a recorrer
el segundo rs, no lo realiza, incluso cerrando el primero, pero no
lanza ningun error.

He leido en otros foros que creando un PrepareStatement con
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY, de esta
manera:

PrepareStatement st = conexion.prepareStatement(cadenaSQL,
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

Pero tampoco funciona ya que este ultimo caso, me lanza el siguente
mensaje:
Excepcion java.sql.SQLException: SQLite only supports
TYPE_FORWARD_ONLY cursors

Tambien he probado a crear dos Statements diferentes con la misma
consulta pero a la hora de recorrer el segundo, me dice que el rs esta
cerrado, cuando no es verdad ya que el cerrado es el primer rs que
recorro y que funciona, probe tambien, a no cerrarlo, pero sigue
lanzando el mismo error y recorriendo el primer rs pero el segundo no.

Agradeceria mucho si teneis alguna idea, en el caso de que no se pueda
realizar xq como dice uno de los errores SQLite no soporta cursores
mas que de lectura, no me importaria, cargar el resultado de la
consulta en alguna otra estructura de datos, pero la verdad que no se
donde cargarla, ya que me plantee meter la consulta en un array de dos
dimensiones, pero me parecion demasiado complicado, sobre todo a la
hora de mostrar los resultados.

Un saludo

CeRiMiCe

unread,
Aug 4, 2009, 7:23:07 PM8/4/09
to sqlite-latino
Mi estimado amigo Aloisius:
En verdad, no es posible hacer el recorrido hacia atras, como sabes la
lectura es en un archivo unico y supongo que al bloquearse el archivo
no puede generarse una copia del archivo, lo que te sugiero es:

1.- hacer una estructura de datos en la cual cargues en memoria la
tabla de una manera ordenada, podrias usar algo como una clase que
hereda de DefaulTablaModel donde puedes recuperar los datos de una
manera mas sencilla.
2.- generar una copia de la BD (lo cual es algo absurdo pero rapido)
donde vuelvas a recorrer la tabla

esto es lo que se me ocurre pero en realidad que es lo que deseas
hacer para estar recorriendo la tabla en reversa???

Aloisius

unread,
Aug 5, 2009, 3:07:00 AM8/5/09
to sqlite-latino

Muchas gracias por tu respuesta CeRiMiCe, al final, por lo que he
optado es por cargar los datos en un HashMap, y de esta manera poder
recorrerlo dos veces sin ningun problema. La eleccion del HashMap como
estructura de datos, no es por nada, en especial, la verdad que no
sabia por cual optar y me parecio la mas sencilla de usar, y ademas de
la que mayor informacion consegui gogleando.
La razon por la cual quiero recorrer el listado mas de una vez, es xq,
en el JavaScript de la pagina, realizo funciones AJAX, individualmente
para cada registro de la consulta y entre la carga de las funciones en
el JavaScript de la pagina y el mostrado del resultado de la consulta
a la BBDD, hay codigo que no debe repetirse.

Aqui dejo parte del codigo que he utilizado por si a alguien lo puede
necesitar, de todas maneras si ven algo extraño o que se pueda mejorar
o incluso criticable, aceptare tirones de orejas y mejoras en el
mismo.

Hashtable datos = new Hashtable();

int i = 0; // numeroDeFilas

while (rs.next()){
i += 1;
datos.put(i+"codigoColumna1",rs.getObject("columna1"));
datos.put(i+"codigoColumna2",rs.getObject("columna2"));
.
.
.
datos.put(i+"codigoColumnaN",rs.getObject("columnaN"));
}

int numeroFilas = i;

for(i = 0; i < numeroFilas; i++){
// Datos recurrentes
datos.get(i+"codigoColumnaX")
}

Muchas Gracias y un saludo
Reply all
Reply to author
Forward
0 new messages