Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Problemas al salvar un Array en una BD JDBC

Estas en el tema de Problemas al salvar un Array en una BD JDBC en el foro de Java en Foros del Web. Hola a todos, estoy haciendo un ejercicio tonto que seria una especie de programa para controlar altar y bajas de una academia (alumnos y cursos) ...
  #1 (permalink)  
Antiguo 19/02/2015, 02:17
 
Fecha de Ingreso: octubre-2014
Mensajes: 16
Antigüedad: 9 años, 6 meses
Puntos: 0
Problemas al salvar un Array en una BD JDBC

Hola a todos,

estoy haciendo un ejercicio tonto que seria una especie de programa para controlar altar y bajas de una academia (alumnos y cursos)

Existen X cursos ya creados y se pueden seleccionar en un combobox y segun lo que selecciones, muestra en un jList los alumnos que hay en ese curso, permite editar sus datos, etc...

Tengo el codigo ya acabado y el programa funciona perfecto salvo un detalle que me esta volviendo loco.

El programa tiene que poder cargar y salvar los datos tanto de un fichero (xml) como de una BD con JDBC... pero no se pueden tener las dos formas a la vez (lo que solucione con un if/else y un simple booleano)

La parte de cargar y guardar datos a un fichero xml funciona perfecto, pero me da problemas la parte de la BD, concretamente el salvar los datos (el cargarlos tambien me funciona bien)

Ahora os pondre los codigos, pero basicamente, el programa manda un arraylist de alumnos al metodo, el cual conecta con la BD y, por medio de un bucle for, va creando filas en la BD con los datos de cada alumno.

El codigo del metodo es este:

Código Java:
Ver original
  1. public void setAlumnos(List<Alumno> lista) {
  2.         try (Connection conn = this.getConexion()) {
  3.             String sqlAlumnos = "INSERT INTO ALUMNOS (DNI, NOMBRE, APELLIDO, FECHA) VALUES (?, ?, ?, ?)";
  4.             PreparedStatement com = conn.prepareStatement(sqlAlumnos);
  5.            
  6.               /*
  7.              Antes del codigo de guardado, deberiamos de comprobar si existe la BD y en caso afirmativo, vaciarla primero.
  8.              if () {
  9.  
  10.              }
  11.              */
  12.             for (Alumno alumno : lista) {
  13.                 com.setString(1, alumno.getDniAlumno());
  14.                 com.setString(2, alumno.getNombreAlumno());
  15.                 com.setString(3, alumno.getApellidoAlumno());
  16.                 com.setDate(4, (Date) alumno.getFechaMatriculacion());
  17.                 com.executeUpdate();
  18.                 com.close();
  19.             JOptionPane.showMessageDialog(null, "Datos cargados correctamente.");
  20.             }
  21.  
  22.         } catch (Exception ex) {
  23.             JOptionPane.showMessageDialog(null, "No se han podido guardar los datos.");
  24.         }
  25.     }

EL fallo es que siempre entra en catch. He podido comprobar que el codigo llega correctamente hasta el com.executeUpdate(); ya que si comento esa parte y justo antes hago un System.out del alumno, me lo muestra correctamente.

Los datos de la BD, conexion y demas funciona bien ya que el metodo que carga los datos a un ArrayList si que funciona bien.

Alguien sabe que puedo estar haciendo mal?

Ademas, como veis tengo un if comentado, ya que hay quiero meter un codigo que detecte si hay alguna fila en la tabla y de ser asi, limpie la tabla entera pero aun estoy con ello xD
  #2 (permalink)  
Antiguo 19/02/2015, 03:07
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Problemas al salvar un Array en una BD JDBC

Lo primero que tienes mal es no tener en cuenta el error, ¿de qué te sirve capturarlo si no sabes qué problema es?

Una cosa es que al usuario no le muestres la traza porque a él no le dice nada, y otra es que tú como programador ignores la excepción que te dice cuál es el error.

El error es bastante evidente, pero mejor que lo veas por ti mismo en la excepción, aprender a tratar correctamente errores y logs también es programar.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 19/02/2015, 03:58
 
Fecha de Ingreso: octubre-2014
Mensajes: 16
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Problemas al salvar un Array en una BD JDBC

Cita:
Iniciado por Xerelo Ver Mensaje
Lo primero que tienes mal es no tener en cuenta el error, ¿de qué te sirve capturarlo si no sabes qué problema es?

Una cosa es que al usuario no le muestres la traza porque a él no le dice nada, y otra es que tú como programador ignores la excepción que te dice cuál es el error.

El error es bastante evidente, pero mejor que lo veas por ti mismo en la excepción, aprender a tratar correctamente errores y logs también es programar.
Tambien a traves de un ex.getMessage() capture el error en su momento, perdon por no ponerlo...

EL error es :

Se ha abortado la sentencia porque habría causado un valor de clave duplicado en una restricción de clave única o primaria o en un índice único identificado por 'SQL150218101140550' definido en 'ALUMNOS'.

Pero debe ser que no entiendo bien la logica de lo que creo que estoy haciendo, porque no encuentro ese valor duplicado xD

EN teoria, carga la lista, y por cada elemento alumno coge sus parametros y los inserta en una fila...
El unico parametro que daría error de ese tipo es el del DNI ya que es la clave primaria, pero por como se construye la lista, es IMPOSIBLE dos alumnos con el mismo DNI por lo que no entiendo porque repite valores, algo se me esta escapando...
  #4 (permalink)  
Antiguo 19/02/2015, 04:18
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problemas al salvar un Array en una BD JDBC

Cita:
Se ha abortado la sentencia porque habría causado un valor de clave duplicado en una restricción de clave única o primaria o en un índice único identificado por 'SQL150218101140550' definido en 'ALUMNOS'.
Nunca habia visto ese error sql tan detallado. Si pones un ex.printStackTrace() te pintara por consola mas infomacion.

En cualquier caso lo que te esta diciendo es, basicamente, que estas insertanto un alumno con un DNI que ya existe.
El alumno con el DNI existe ya previamente en tu base de datos, ya que el programa que tienes es imposible que pueda hacer mas de una iteracion del bucle, ya que estas cerrando el statement y cuando intente introducir el segundo alumno te va a fallar con otra excepciùon diferente.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 19/02/2015, 04:25
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Problemas al salvar un Array en una BD JDBC

Pienso lo mismo que Profesor_Falken, yo había visto el cierre del statement, pero para el problema de la clave duplicada, puede ser

1. Que ya hayas creado ese registro en alguna prueba anterior
2. Que no estés creando correctamente el List<Alumno>, por ejemplo no creando un objeto Alumno nuevo cada vez que añades un alumno a la lista.
3. Improbable, pero que las restricciones en la BBDD no sean las que crees

http://docs.oracle.com/javase/tutori.../prepared.html
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #6 (permalink)  
Antiguo 19/02/2015, 04:32
 
Fecha de Ingreso: octubre-2014
Mensajes: 16
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Problemas al salvar un Array en una BD JDBC

Vale, soy imbécil... XD
Veis esa parte comentada de vaciar la tabla?

Y use efectivamente lo que decís, como estoy haciendo pruebas no se me ha ocurrido otra cosa que hacer la prueba primero cargando el ArrayList a partir de la BD y luego intentar guardarlo...
Creo que no necesita más explicación la tontería que estaba haciendo jajajaja

Solo tendría que limpiar la BD primero y luego ya salvar los datos, que tengo que ver también como hacerlo jajaja

Gracias por abrirme los ojos, hay veces que te ciegas buscando un error de código y miras y miras, y al final es un error tontisimo como este

Etiquetas: bd, jdbc, programa, salvar, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:30.