🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: es.comp.lenguajes.java
10 messages
10 total messages Started by Alejandro Thu, 07 Jun 2007 00:24
Problema con ResultSet en JDBC
#389
Author: Alejandro
Date: Thu, 07 Jun 2007 00:24
106 lines
4146 bytes
Hola,

Estoy haciendo una practica de la universidad y me gustaria que me 
echaseis una mano con un peque�o problema que tengo..

La cuesti�n es que intento hacer lo siguiente:

Tengo un JDialog donde recibo objetos como el ModeloTabla (vease c�digo 
de ModeloTabla m�s abajo) que nos dejaron hecho:

C�digo:

public class VentanaResultados extends JDialog {
     [...]
     JScrollPane ScrollPane = new JScrollPane();
     JTable tabla = new JTable();
     ModeloTabla modelo;
     JButton BTBorrar = new JButton();
     [...]
     public VentanaResultados(ModeloTabla m,String cap,boolean 
mostrarBotones) {
         try {
             this.modelo = m;
             tabla = new JTable(modelo);
             ScrollPane = new JScrollPane(tabla);
             this.LBText.setText(cap);
         } catch (Exception ex) {
             ex.printStackTrace();
         }
     }
[...]
}


Por otra parte, en esa misma clase, cuando pulso sobre el boton borrar, 
ejecuto esto:

C�digo:

     public void BTBorrar_actionPerformed(ActionEvent e) {
         if (tabla.getSelectedRow() != -1) {
          //Compruebo que seleccionaron tupla
             Result r = modelo.deleteRow(tabla.getSelectedRow());
             //Intento borrarla..
             if (r.getResult()) {
                 JOptionPane.showMessageDialog(this,"Tupla 
borrada","Tupla borrada",JOptionPane.INFORMATION_MESSAGE);
             }
             else {
                 JOptionPane.showMessageDialog(this,"Error borrando la 
tupla: " + r.getMsg(),"Error",JOptionPane.ERROR_MESSAGE);
             }
         }
     }


Y finalmente, en ModeloTabla, a�ad� este m�todo:

C�digo:

    public Result deleteRow(int r) {
        try {
            rs.first();
            //Me pongo al principio del ResultSet
            while (rs.getRow() != r) {
                rs.next();
            //Hasta no llegar a la tupla deseada, avanzo.
            }
            //Cuando llegue la borro y hago el updateRow que en teoria
            //actualiza la bd.
            rs.deleteRow();
            rs.updateRow();
        }
        catch (Exception e) {
            e.printStackTrace();
            return new Result(false,e.getMessage());
        }
        return new Result(true,null);
    }


Donde 'rs' es el ResultSet que usa ModeloTabla (El resto, est� igual).

ModeloTabla.java: http://rafb.net/p/hdgIfo99.html

La clase Result es una clase que cree yo auxiliar que no tiene 
importancia para este caso.

El problema es que, al ejecutar eso, obtengo este error:

Cita:

java.sql.SQLException: Operaci�n no v�lida para el juego de resultados 
de s�lo reenv�o : first


La cual aunque busqu� algo de informaci�n no acabo de entender que 
significa.

Como podreis imaginar lo que pretendo es desde la tabla poder borrar 
tuplas del ResultSet y que al actualizarlo (updateRow()) actualice el 
contenido en la base de datos.

�Alguna idea de cual es el problema? �Soluciones? �Alternativas?

Gracias, un saludo.
Re: Problema con ResultSet en JDBC
#390
Author: Eduardo Yáñez Parareda
Date: Thu, 07 Jun 2007 07:46
6 lines
1254 bytes
> java.sql.SQLException: Operaci�n no v�lida para el juego de resultados 
> de s�lo reenv�o : first

El ResultSet que te devuelve el driver que est�s usando es de tipo TYPE_FORWARD_ONLY, lo que quiere decir que no puedes 
'navegar' o moverte por el ResultSet hacia atr�s, s�lo hacia delante.
No creo que te haga falta llamar al first(), cuando ejecutas la consulta ya est�s en el primer elemento.
Re: Problema con ResultSet en JDBC
#391
Author: Alejandro
Date: Thu, 07 Jun 2007 09:20
19 lines
1964 bytes
Entiendo,

La cuesti�n es que me pongo en el primero para luego iterar hacia 
adelante en busca de la columna deseada (Que recibe como par�metro el 
m�todo deleteRow()), de ah� el first(). �No hay alguna opci�n para 
establece que el ResultSet no sea de ese tipo y si poder iterar a trav�s 
de el?

Gracias, un saludo.

Eduardo Y��ez Parareda escribi�:
>> java.sql.SQLException: Operaci�n no v�lida para el juego de resultados 
>> de s�lo reenv�o : first
> 
> El ResultSet que te devuelve el driver que est�s usando es de tipo 
> TYPE_FORWARD_ONLY, lo que quiere decir que no puedes 'navegar' o moverte 
> por el ResultSet hacia atr�s, s�lo hacia delante.
> No creo que te haga falta llamar al first(), cuando ejecutas la consulta 
> ya est�s en el primer elemento.
Re: Problema con ResultSet en JDBC
#392
Author: Eduardo Yáñez Parareda
Date: Thu, 07 Jun 2007 10:01
14 lines
1797 bytes
> La cuesti�n es que me pongo en el primero para luego iterar hacia 
> adelante en busca de la columna deseada (Que recibe como par�metro el 
> m�todo deleteRow()), de ah� el first(). �No hay alguna opci�n para 
> establece que el ResultSet no sea de ese tipo y si poder iterar a trav�s 
> de el?

Me parece que no, que eso tiene que ver con el driver usado, y si el driver no soporta ese tipo de ResultSets 
'navegables', no puedes hacer nada.

Soluci�n: No navegues por el ResultSet, no me parece una buena soluci�n, m�s que nada porque no es est�ndar para todas
las BBDD. Lee el resultado del ResultSet y guardas cada registro en una lista. Recorre la lista y elimina los
elementos que no cumplan los requisitos que requieres. Y listo.

Haz una clase que represente el registro devuelto, y creas objetos de esa clase para guardarlos en la lista.
Re: Problema con ResultSet en JDBC
#393
Author: Alejandro
Date: Thu, 07 Jun 2007 12:11
34 lines
2820 bytes
Hola Eduardo,

Entiendo lo que me dices, el tema es que queria hacerlo un poco m�s 
gen�rico y bueno.. eso de la lista lo veo viable pero.. la cuesti�n es 
que en la tabla (aunque de momento solo borro tuplas), querria poder 
luego modificarlas a trav�s de los diversos m�todos (updateFloat(), 
updateInt(), etc) y que todo esto luego se actualizase en la base de 
datos real.

Existe alguna forma de que, volcando los datos a una lista como me 
comentas, y actualizando/borrando/insertando en esa lista, luego pueda 
reenviar los datos modificados a la BD?

Gracias, un saludo.

Eduardo Y��ez Parareda escribi�:
>> La cuesti�n es que me pongo en el primero para luego iterar hacia 
>> adelante en busca de la columna deseada (Que recibe como par�metro el 
>> m�todo deleteRow()), de ah� el first(). �No hay alguna opci�n para 
>> establece que el ResultSet no sea de ese tipo y si poder iterar a 
>> trav�s de el?
> 
> Me parece que no, que eso tiene que ver con el driver usado, y si el 
> driver no soporta ese tipo de ResultSets 'navegables', no puedes hacer 
> nada.
> 
> Soluci�n: No navegues por el ResultSet, no me parece una buena soluci�n, 
> m�s que nada porque no es est�ndar para todas
> las BBDD. Lee el resultado del ResultSet y guardas cada registro en una 
> lista. Recorre la lista y elimina los
> elementos que no cumplan los requisitos que requieres. Y listo.
> 
> Haz una clase que represente el registro devuelto, y creas objetos de 
> esa clase para guardarlos en la lista.
Re: Problema con ResultSet en JDBC
#394
Author: Ricardo Palomares Martinez
Date: Thu, 07 Jun 2007 18:26
46 lines
3128 bytes
Alejandro escribió:
> Entiendo lo que me dices, el tema es que queria hacerlo un poco más
> genérico y bueno.. eso de la lista lo veo viable pero.. la cuestión es
> que en la tabla (aunque de momento solo borro tuplas), querria poder
> luego modificarlas a través de los diversos métodos (updateFloat(),
> updateInt(), etc) y que todo esto luego se actualizase en la base de
> datos real.
> 
> Existe alguna forma de que, volcando los datos a una lista como me
> comentas, y actualizando/borrando/insertando en esa lista, luego pueda
> reenviar los datos modificados a la BD?


Yo he hecho dos implementaciones distintas para mantenimientos simples
de una tabla como el que estás programando tú. En la primera, hago lo
que creo que dice Eduardo: al entrar en el diálogo, inicializo el
modelo recuperando el ResultSet en el modelo de la tabla (es decir, mi
TableModel tiene un ArrayList donde copio lo que obtengo en el
ResultSet). Luego, replico en la base de datos lo mismo que hago al
modelo. ¿Que se cambia un dato en la tabla? Ejecuto un UPDATE del
registro en la BB.DD. ¿Que se borra un registro? Un DELETE; y lo mismo
con las inserciones. En este caso, si hubiera dos usuarios accediendo
a la base de datos, acabarías rápidamente con una vista desactualizada
en la que faltan y sobran registros (los que añada o borre el usuario
de enfrente).

En la otra implementación he usado una biblioteca de clases que
implementa lo que Sun dejó en el último momento fuera de JDBC 4.0, el
EoD. Básicamente, facilita la implementación de la persistencia de tus
clases Java en tablas de base de datos, y entre otras cosas
proporciona una clase DataSet, que es como un ArrayList<T> que
recupera los datos de un ResultSet. Aquí lo que he hecho es (porque me
lo puedo permitir, dado el tamaño de las tablas), releer el DataSet
cada vez que aplico algún cambio.

Saludos.

-- 
If it's true that we are here to help others,
then what exactly are the OTHERS here for?
Re: Problema con ResultSet en JDBC
#395
Author: Ricardo Palomares Martinez
Date: Thu, 07 Jun 2007 18:32
27 lines
1557 bytes
Alejandro escribió:
> Código:

Si es una práctica para clase, igual resultan importantes estos
pequeños detalles de estilo que te comento:


> 
> public class VentanaResultados extends JDialog {
>     [...]
>     JScrollPane ScrollPane = new JScrollPane();


Las variables deben comenzar por minúscula según las convenciones de
Sun, por lo que deberías llamarla *s*crollPane. Además, entiendo que
no hace falta que la instancies, ya que lo haces en el constructor.


>     JTable tabla = new JTable();

Ídem a la instanciación, ya lo haces en el constructor.

Saludos.

-- 
If it's true that we are here to help others,
then what exactly are the OTHERS here for?
Re: Problema con ResultSet en JDBC
#396
Author: Alejandro
Date: Thu, 07 Jun 2007 20:27
31 lines
1949 bytes
Hola,

Gracias por las sugerencias, conozco este tipo de convenciones aunque la 
verdad es algo que estoy seguro que no van a mirar, dado que solo les 
interesa que funcione la parte de JBDC, aunque es una buena costumbre 
mantener estas "costumbres" (valga la redundancia).

Ricardo Palomares Martinez escribi�:
> Alejandro escribi�:
>> C�digo:
> 
> Si es una pr�ctica para clase, igual resultan importantes estos
> peque�os detalles de estilo que te comento:
> 
> 
>> public class VentanaResultados extends JDialog {
>>     [...]
>>     JScrollPane ScrollPane = new JScrollPane();
> 
> 
> Las variables deben comenzar por min�scula seg�n las convenciones de
> Sun, por lo que deber�as llamarla *s*crollPane. Adem�s, entiendo que
> no hace falta que la instancies, ya que lo haces en el constructor.
> 
> 
>>     JTable tabla = new JTable();
> 
> �dem a la instanciaci�n, ya lo haces en el constructor.
> 
> Saludos.
> 
Re: Problema con ResultSet en JDBC
#494
Author: Alejandro
Date: Thu, 07 Jun 2007 20:27
46 lines
3582 bytes
Hola Ricardo,

Gracias por ambas sugerencias, finalmente consegu� tras trastear un poco 
con la forma de crear la sentencia que el ResultSet me permitiera 
moverme por el y actualizarlo.

Un saludo

Ricardo Palomares Martinez escribi�:
> Alejandro escribi�:
>> Entiendo lo que me dices, el tema es que queria hacerlo un poco m�s
>> gen�rico y bueno.. eso de la lista lo veo viable pero.. la cuesti�n es
>> que en la tabla (aunque de momento solo borro tuplas), querria poder
>> luego modificarlas a trav�s de los diversos m�todos (updateFloat(),
>> updateInt(), etc) y que todo esto luego se actualizase en la base de
>> datos real.
>>
>> Existe alguna forma de que, volcando los datos a una lista como me
>> comentas, y actualizando/borrando/insertando en esa lista, luego pueda
>> reenviar los datos modificados a la BD?
> 
> 
> Yo he hecho dos implementaciones distintas para mantenimientos simples
> de una tabla como el que est�s programando t�. En la primera, hago lo
> que creo que dice Eduardo: al entrar en el di�logo, inicializo el
> modelo recuperando el ResultSet en el modelo de la tabla (es decir, mi
> TableModel tiene un ArrayList donde copio lo que obtengo en el
> ResultSet). Luego, replico en la base de datos lo mismo que hago al
> modelo. �Que se cambia un dato en la tabla? Ejecuto un UPDATE del
> registro en la BB.DD. �Que se borra un registro? Un DELETE; y lo mismo
> con las inserciones. En este caso, si hubiera dos usuarios accediendo
> a la base de datos, acabar�as r�pidamente con una vista desactualizada
> en la que faltan y sobran registros (los que a�ada o borre el usuario
> de enfrente).
> 
> En la otra implementaci�n he usado una biblioteca de clases que
> implementa lo que Sun dej� en el �ltimo momento fuera de JDBC 4.0, el
> EoD. B�sicamente, facilita la implementaci�n de la persistencia de tus
> clases Java en tablas de base de datos, y entre otras cosas
> proporciona una clase DataSet, que es como un ArrayList<T> que
> recupera los datos de un ResultSet. Aqu� lo que he hecho es (porque me
> lo puedo permitir, dado el tama�o de las tablas), releer el DataSet
> cada vez que aplico alg�n cambio.
> 
> Saludos.
> 
Re: Problema con ResultSet en JDBC
#497
Author: Claudio
Date: Sat, 16 Jun 2007 20:17
18 lines
1568 bytes
On 2007-06-07, Alejandro <none@none.es> wrote:
>
> Cita:
>
> java.sql.SQLException: Operaci�n no v�lida para el juego de resultados 
> de s�lo reenv�o : first

Quita el first()   (que realmente no hace nada) o bien dale
las opciones al createStatement cuando crees la Statement a
partir de la Connection. M�rate el primer par�metro de la
funci�n:

  createStatement(int resultSetType, int resultSetConcurrency) 
             Creates a Statement object that will generate ResultSet
	     objects with the given type and concurrency.

Un saludo.
--claudio--
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads