[RESUELTO]No encuentro error, intentando borrar de un resultset

Iniciado por |Miguel|, 21 Febrero 2012, 16:02 PM

0 Miembros y 2 Visitantes están viendo este tema.

|Miguel|

Hola a todos, ¿qué tal?

Bueno, llevo un par de días como un loco y no doy con el fallo en mi programa... os cuento un poco de qué va la historia. Tengo una BBDD de empleados y departamentos con una relación 1:N donde cada empleado tiene un solo departamento y los departamentos de 0 a N empleados... Pues bien, estoy programando en Java un aplicación sencilla que permita añadir, eliminar y modificar datos de cualquier empleado/departamento.

Lo tengo todo acabado, excepto un JFrame en el que arriba tengo un JTextField con el nombre de un departamento y debajo de éste un JTable en el que se muestran los datos de todos los empleados de ese departamento. Hay también botones para pasar al siguiente, anterior, primer y último departamento, con sus eventos correspondientes que vacían y rellenan de nuevo la tabla con los empleados correspondientes al departamento activo.

Y por último tengo un botón que me permitiría borrar de la BBDD el empleado que esté seleccionado. Este es el código:

Código (java) [Seleccionar]

private void jtblEmpleMouseClicked(java.awt.event.MouseEvent evt) {
       System.out.println("Entro en evento");
       int fila=jtblEmple.getSelectedRow();
       System.out.println("Fila seleccionada: "+fila);
       if(fila >= 0){
           System.out.println("entro en if");
           try{
               System.out.println("entro en el try");
               for(int i=0; i<fila+1; i++){
                   System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);
                   rsE.next();                    
               }
               System.out.println("Voy a borrar");
               //rsE.deleteRow(); línea comentada para no borrar registros en pruebas y quedarme con 0 empleados... xD
               //(aún así, esta línea me da unas veces la excepción de 'No data found' y otras la de 'estado del cursor no válido').
               System.out.println("He borrado.");
           }catch(Exception e){JOptionPane.showConfirmDialog(null, e, "Error de borrado", JOptionPane.PLAIN_MESSAGE);}
           finally{
               System.out.println("llego al finally");
               limpiaTabla();
               rellenaTabla();
               System.out.println("salgo del finally");
           }
       }
       else
           JOptionPane.showConfirmDialog(null, "Seleccione un departamento para eliminarlo.", "Error de borrado", JOptionPane.PLAIN_MESSAGE);
   }


Donde rsE es un ResultSet con todos los empleados del departamento activo y rsD es otro ResultSet con todos los departamentos. Todos esos println sobran, los he usado para ver qué hace la aplicación y esta me devuelve lo siguiente:

Cita de: NetBeans
run:
Entro en evento
Fila seleccionada: 1
entro en if
entro en el try
// aquí me salta la Excepción e
llego al finally
salgo del finally
BUILD SUCCESSFUL (total time: 10 seconds)

Este código funcionaba perfectamente para borrar departamentos... Y así llevo un par de días. Hoy he pedido ayuda al profesor y ha estado una hora  mirando y tocando sin sacar absolutamente nada, lo cual me hace pensar que seguramente será algún fallo bastante estúpido...

Gracias a todos.

HdM

Buenas.

Código (java) [Seleccionar]
for(int i=0; i<fila+1; i++){
                    System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);
                    rsE.next();                   
                }
                System.out.println("Voy a borrar");
                //rsE.deleteRow(); línea comentada para no borrar registros en pruebas y quedarme con 0 empleados... xD
                //(aún así, esta línea me da unas veces la excepción de 'No data found' y otras la de 'estado del cursor no válido').
                System.out.println("He borrado.");


Creo que es debido a que antes de empezar el for, no sabes en qué posición se encuentra el rsE, de modo que después de salir del bucle y tras los sucesivos rsE.next() te deja el resultset en EOF, sin registro activo y por eso, al intentar eliminar te salta el error. Creo que antes de empezar el bucle, deberías comprobar que el rsE contiene registros y hacer un movefirst. Ése podría ser un error. Otro podría ser la condición del for, ¿no debería ser i < fila en vez de i < fila +1?

Saludos.

- Nice to see you again -

|Miguel|

Hola Bulld0z3r, gracias por contestar.

rsE se carga con el constructor del JFrame donde estoy trabajando mediante el siguiente método:
Código (java) [Seleccionar]

static void cargaEmpleados(){
        try{
            int id_dep = rsD.getInt("dept_no");
            seleccionaEmple(id_dep);
            rsE.first();
        }catch(Exception e){System.out.println("Error capturando depto para la tabla --> "+e);}
       
    }


A ese método lo llamo, como he dicho, en el constructor del JFrame así como en todos los eventos de los botones primero, último, anterior y siguiente. Así me aseguro que rsE tenga siempre datos y además me posiciono en el primero de ellos.

En cuanto a la condición del for, antes la tenía así pero el método getSelectedRow() devuelve enteros a partir del 0 (éste incluido) si hay algo seleccionado, es decir, si cambio la condición y está seleccionada la primera fila no entro en el bucle, ¿me equivoco?

Saludos.

HdM

Buenas.

La condición del for debería ser i<=fila

Saludos.

- Nice to see you again -

|Miguel|

#4
Sigue sin funcionar.
En este fragmento:
Código (java) [Seleccionar]

System.out.println("entro en el try");
for(int i=0; i<=fila; i++){
            System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);

imprime la línea de "entro en el try", pero no la otra. Es decir, salta la excepción al intentar rsE.getString("APELLIDO"), supongo. Revisaré mi forma de controlar los resultSet a ver...

Dejo aquí el código completo, por si alguien tiene mucho tiempo libre XD
http://www.mediafire.com/?xnn2pfkdkxfz15e
Versión en .txt: http://www.mediafire.com/?4vtdket2nuer36w

jperezmonge

#5
Asi lo hago yo, a ver si te puede dar un enfoque distinto

Código (java) [Seleccionar]
jButtonEliminarUsuario.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {

ModeloJTableUsuario modelo = getModeloJTableUsuario();

int index = getJTableUsuario().getSelectedRow();

// Si se selecciona un elemento en la lista
if (  index >= 0 ) {
modelo.eliminarUsuario(index);
}
}
});

|Miguel|

jperezmonge, si no me equivoco, eso me borra sólo la fila del JTable, ¿no? Todo lo que estoy haciendo va contra una base de datos.

jperezmonge

#7
Ahhmmm, yo es que en el modelo del jTable cargo los datos de la base de datos a una colección y desde hay trabajo, lo siento te he ayudado hasta donde yo llego, si no te sirve de nada, lo siento.

|Miguel|

Gracias, no te preocupes... de todas formas con lo que has dicho estoy pensando otra posibilidad que tal vez funcione... a ver que pasa  :silbar:

jperezmonge

#9
De esta forma no debería de lanzarte excepción ni estar pendiente de si en la siguiente vuelta esta apuntando a null o no.

prueba a recorrer la consulta de este modo.

Código (java) [Seleccionar]
dbResulSet = dbStatement.executeQuery("SELECT * from disfruta where usuarioDni = '" + dni2 + "'");
//recorremos la consulta
while(dbResulSet.next()){
//obtengo el identificador
String dni  = dbResulSet.getString(1);
System.out.println(dni);
//obtengo el descripcion
int codigo = dbResulSet.getInt(2);
try {
myData.add(new Disfruta(dni, codigo));
} catch (Exception e) {
e.printStackTrace();
}

}