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

[SOLUCIONADO] Excepciones y base de datos

Estas en el tema de Excepciones y base de datos en el foro de Java en Foros del Web. Hola a todos, tengo la siguiente consulta, resulta que trato de no trabajar en memoria con la base de datos, es decir no tener una ...
  #1 (permalink)  
Antiguo 15/04/2016, 18:51
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Excepciones y base de datos

Hola a todos, tengo la siguiente consulta, resulta que trato de no trabajar en memoria con la base de datos, es decir no tener una total dependencia a las colecciones, y hasta para crear y editar lo logro, estoy trabajando con una solución genérica, como ven:

Manejadora.java

Código Java:
Ver original
  1. public void add(T objeto)throws Exception {
  2.         if(this.checkUniqueKey(objeto)){  
  3.             throw new Exception(this.getFetchMessage());
  4.         }
  5.         else {
  6.             FacadeBroker.getInstance().guardame(this.getDates(objeto), this.getTable());
  7.         }
  8.     }
  9.     public void edit(T objeto)throws Exception {
  10.         T aux = this.findById(Conversiones.CInt(getDates(objeto)[0]));
  11.         if(!aux.equals(objeto)){
  12.             if(this.checkUniqueKey(objeto)){  
  13.                 throw new Exception(this.getFetchMessage());
  14.             }
  15.         }
  16.         FacadeBroker.getInstance().modificame(this.getDates(objeto), this.getTable());        
  17.     }

pero cuando se trata de borrar, no sé cómo poner la excepción en esta solución genérica:

Código Java:
Ver original
  1. public void delete(T objeto)throws Exception {
  2.         try {
  3.             FacadeBroker.getInstance().eliminame(this.getTable(), this.getDeleteCondition(objeto));
  4.         }
  5.         catch(Exception ex){
  6.             System.out.println(ex.getMessage());
  7.         }
  8.     }
  9.  
  10. protected boolean checkDelete(){ return false; }
  11. protected String getDeleteCondition(T objeto) { return null; }
  12. protected String getTable() { return null; }

ManCargos.java

Código Java:
Ver original
  1. @Override
  2.     protected String getTable() {
  3.         return "cargos";
  4.     }
  5. @Override
  6.     protected boolean checkDelete() {
  7.         return true;
  8.     }
  9. @Override
  10.     protected String getDeleteCondition(Cargo objeto) {
  11.         String query = " where carId =" +objeto.getId();
  12.         if(this.checkDelete()){
  13.             query +=" and carId not in (select distinct carId from personas)";
  14.         }
  15.         return query;
  16.     }

La idea que las cargos no se borren si están asignados a personas, pero ¿cómo trato la excepción para el caso de las bajas?

Espero sus respuestas y saludos.
  #2 (permalink)  
Antiguo 17/04/2016, 21:22
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Excepciones y base de datos

Hola, me pueden dar alguna de de cómo lanzar la excepción cuando el cargo esta siendo uso por una persona?? la consulta sql anda, pero el hacer andar el mensaje es el problema.

alguna ayuda? por favor.

Espero sus respuestas y saludos.
  #3 (permalink)  
Antiguo 17/04/2016, 23:44
 
Fecha de Ingreso: abril-2016
Mensajes: 8
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Excepciones y base de datos

mm no podrías consultar si el cargo esta usado en un persona no elimine y lance el mensaje dado que ahi te traería null? y cuando esta eliminando por alguna cuestión alguien lo uso en una persona, así que le pones en un trycatch para captar el error.
(no se si te sirve)
  #4 (permalink)  
Antiguo 18/04/2016, 11:08
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Excepciones y base de datos

Hola Darkmarus, gracias por responder, verás en la clase MyBroker es que tengo la consulta:

MyBroker.java

Código Java:
Ver original
  1. @Override
  2.     public void eliminame (String nombre, String condicion) {
  3.         try {
  4.             objBD.comando("delete from " + nombre + condicion);
  5.         }
  6.         catch (Exception e) {
  7.            System.out.println(e.getMessage());
  8.         }
  9.     }

y en MyConex.java tengo lo del PreparedStatement

MyConex.java

Código Java:
Ver original
  1. public void comando(String comando)
  2.     {
  3.     try
  4.         {
  5.             query =objconex.conexion().prepareStatement(comando);
  6.             query.executeUpdate();
  7.             query.close();
  8.     }
  9.         catch (SQLException e)
  10.         {
  11.             System.out.println(e.getMessage());
  12.     }
  13.     }

sólo que en Manejadora es que hago las validaciones, no sé en base a tu sugerencia como hago para crear la excepción como lo hago en add y edit??

Espero sus respuestas y saludos.
  #5 (permalink)  
Antiguo 18/04/2016, 21:17
 
Fecha de Ingreso: abril-2016
Mensajes: 8
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Excepciones y base de datos

mm voy a intentar hacer de esa forma XD dado que he trabajado mas usando plugin que de manera genérica, si me sale bien mi planteamiento te la respondo.
  #6 (permalink)  
Antiguo 19/04/2016, 18:47
 
Fecha de Ingreso: abril-2016
Mensajes: 8
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Excepciones y base de datos

mm no se como intentas eliminar dado que la base de datos te aria saltar la excepcion por intentar borrar una row utilizada en otra tabla, eso es integridad de la base de datos asi que con un catch capturas el error en esa ejecución

Código Java:
Ver original
  1. public void eliminar(long id) throws SQLException {
  2.  
  3.         String sql = "delete from encabezado_ingreso where id_ingreso=";
  4.         sql += id;
  5.         PreparedStatement ps = null;
  6.         try {
  7.             ps = conn.prepareStatement(sql);
  8.             ps.executeUpdate();
  9.         } catch (SQLException ex) {
  10.             System.out.println("Error al borrar");
  11.         }finally{
  12.             if (ps!=null) {
  13.                 ps.close();
  14.             }
  15.         }
  16. }

bueno aunque para obviar este tipo de problemas casi nunca se borra de la base de datos solo se hace una eliminación lógica con un tipo booleano como atributo
(me disculpo por no haber respondido ayer, me entretuve con un código en C# )
  #7 (permalink)  
Antiguo 19/04/2016, 19:05
 
Fecha de Ingreso: abril-2016
Mensajes: 8
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Excepciones y base de datos

y en la misma excepcion te dice el error

  #8 (permalink)  
Antiguo 19/04/2016, 20:33
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Excepciones y base de datos

Ok, no te preocupes, pensando un poco en mi código lo que debería tener es algo que me indique si mi consulta me devuelve algo o no, debería ser una función booleana, y en el delete ponerlo antes del delete, pero cómo??

espero sus respuestas y saludos.
  #9 (permalink)  
Antiguo 19/04/2016, 21:23
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Excepciones y base de datos

hola Darkmarus, finalmente pude arreglarlo, resulta que tenía que hacer esto:

En MyConex.java tenía que cambiar el método a una función que devuelva un entero:

Código Java:
Ver original
  1. public int comando(String comando) {
  2.     try {
  3.             query =objconex.conexion().prepareStatement(comando);
  4.             int i = query.executeUpdate();
  5.             query.close();
  6.             return i;
  7.     }
  8.         catch (SQLException e)
  9.         {
  10.             System.out.println(e.getMessage());
  11.             return 0;
  12.     }
  13.     }

luego en MyBroker.java debía cambiar el método a una función booleana:

Código Java:
Ver original
  1. @Override
  2.     public boolean eliminame (String nombre, String condicion) {
  3.         try {
  4.             return objBD.comando("delete from " + nombre + condicion) == 1;
  5.         }
  6.         catch (Exception e) {
  7.            System.out.println(e.getMessage());
  8.            return false;
  9.         }
  10.     }

al igual que en FacadeBroker.java

Código Java:
Ver original
  1. @Override
  2.     public boolean eliminame(String nombre,String condicion) {
  3.         return this.objB.eliminame(nombre, condicion);
  4.     }

y en IBroker.java

Código Java:
Ver original
  1. boolean eliminame (String nombre, String condicion);

Después en Manejadora.java tenía que cambiar el método y agregar un string para el mensaje de la excepción:

Código Java:
Ver original
  1. public void delete(T objeto)throws Exception {
  2.         if(!FacadeBroker.getInstance().eliminame(this.getTable(), this.getDeleteCondition(objeto))){
  3.             throw new Exception(this.getDeleteMessage());
  4.         }
  5.     }
  6.  
  7. protected String getDeleteMessage() { return null; }

Por último en ManCargos.java redefiní el mensaje de baja:

Código Java:
Ver original
  1. @Override
  2.     protected String getDeleteMessage() {
  3.         return "Tiene Personas usando ese Cargo";
  4.     }

Y así me anduvo esto, muchas gracias, aunque este tema es Excepciones y Base de Datos.
Hay otra cosa que quiero preguntarte, pero en el sgte mensaje.
  #10 (permalink)  
Antiguo 19/04/2016, 21:35
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Excepciones y base de datos

Mira lo otro que quiero consultar y preguntar es sobre suministro de valores para los parámetros del PreparedStatement: ¿esto es necesario o no? porque en php si usas pdo es necesario, pero te pregunto en java en que le aporta, te pongo el link de esto:

http://programacion.net/articulo/acc...ases_de_datos_[jdbc]_93/8#suminstrar

Espero sus respuestas y saludos.

PD: ¿cómo pones las imagenes en los mensajes de foros del web?
  #11 (permalink)  
Antiguo 20/04/2016, 01:15
 
Fecha de Ingreso: abril-2016
Mensajes: 8
Antigüedad: 8 años, 7 meses
Puntos: 0
De acuerdo Respuesta: Excepciones y base de datos

creo que este articulo responde a tu pregunta

<a>http://www.tecnologiadigerida.com/2008/04/uso-correcto-del-preparedstatement</a>

[URL="http://www.tecnologiadigerida.com/2008/04/uso-correcto-del-preparedstatement"]http://www.tecnologiadigerida.com/2008/04/uso-correcto-del-preparedstatement[/URL]


Última edición por Darkmarus; 20/04/2016 a las 01:33
  #12 (permalink)  
Antiguo 21/04/2016, 22:42
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Excepciones y base de datos

Hola Darkmarus, gracias por responder verás intento hacer genérico la parte de los parámetros pero me da estos errores:

insert into cargos (carId,carNombre) values (?,?)
Parameter index out of range (0 < 1 ).
Parameter index out of range (1 > number of parameters, which is 0).

El código de eso está en la clase MyBroker.java

Código Java:
Ver original
  1. public void guardame(ArrayList<String> rows, String nombre) {
  2.         try {
  3.             this.objBD.getQuery().getConnection().prepareStatement(this.sqlInsert(nombre));
  4.             this.doInsert(rows);
  5.             this.objBD.getQuery().execute();
  6.         }
  7.         catch(Exception ex){
  8.             System.out.println(ex.getMessage());
  9.         }
  10.     }
  11.     private String sqlInsert(String nombre){
  12.         ArrayList<String> columnas=objBD.obtenerColumnas(objBD.obtenerResultSet("select * from "+nombre));
  13.         String Consulta = "insert into " + nombre + " (";
  14.             for (String columna : columnas) {
  15.                 if (Consulta.endsWith("(")==false)
  16.                     Consulta += ",";
  17.                 Consulta += columna;
  18.             }
  19.             Consulta += ") values (" ;
  20.             for (String columna : columnas) {
  21.                 if (Consulta.endsWith("(")==false )
  22.                     Consulta += ",";
  23.                 Consulta += "?";
  24.             }
  25.             Consulta += ")";
  26.             System.out.println(Consulta);
  27.             return Consulta;
  28.     }
  29.     private void doInsert(ArrayList<String> rows){
  30.         for(int i =0 ; i < rows.size(); i++){
  31.             try {
  32.                 objBD.getQuery().setString(i, rows.get(i));                
  33.             }
  34.             catch (SQLException ex) {
  35.                 System.out.println(ex.getMessage());
  36.             }
  37.         }
  38.     }

Espero sus respuestas y saludos.
  #13 (permalink)  
Antiguo 24/04/2016, 18:59
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Excepciones y base de datos

Hola a todos, después de unos de volver a tocar código pude resolver uno de los problemas de MyBroker:

Código Java:
Ver original
  1. @Override
  2.     public void guardame(ArrayList<String> rows, String nombre) {
  3.         try {
  4.             this.objBD.getQuery().getConnection().prepareStatement(this.sqlInsert(nombre));
  5.             this.doInsert(rows);
  6.             this.objBD.getQuery().execute();
  7.         }
  8.         catch(Exception ex){
  9.             System.out.println(ex.getMessage());
  10.         }
  11.     }
  12.     private String sqlInsert(String nombre){
  13.         ArrayList<String> columnas=objBD.obtenerColumnas(objBD.obtenerResultSet("select * from "+nombre));
  14.         String Consulta = "insert into " + nombre + " (";
  15.             for (String columna : columnas) {
  16.                 if (Consulta.endsWith("(") == false)
  17.                     Consulta += ",";
  18.                 Consulta += columna;
  19.             }
  20.             Consulta += ") values (" ;
  21.             for (String columna : columnas) {
  22.                 if (Consulta.endsWith("(") == false)
  23.                     Consulta += ",";
  24.                 Consulta += "?";
  25.             }
  26.             Consulta += ")";
  27.             System.out.println(Consulta);
  28.             return Consulta;
  29.     }
  30.     private void doInsert(ArrayList<String> rows){
  31.         System.out.println("Tamanio: " + rows.size());
  32.         System.out.println("");
  33.         for(int i = 1 ; i < rows.size(); i++){
  34.             System.out.println("Element: " + i);
  35.             try {
  36.                 objBD.getQuery().setObject(i, rows.get(i));                
  37.             }
  38.             catch (Exception ex) {
  39.                 System.out.println(ex.getMessage());
  40.             }
  41.             System.out.println("");
  42.         }
  43.     }

En MyConex.java hice un get del PreparedStatement:

Código Java:
Ver original
  1. private PreparedStatement query;
  2.     public MyConex() { }
  3.    
  4.     public PreparedStatement getQuery() {
  5.         return query;
  6.     }

Y ahora me sale sólo este error:

insert into cargos (carId,carNombre) values (?,?)
Tamanio: 2

Element: 1
Parameter index out of range (1 > number of parameters, which is 0).

Estaba pensando que también puede darme ese error porque el carId es un entero y carNombre es un string, pero en esta línea: objBD.getQuery().setObject(i, rows.get(i)); cómo puedo hacer para lograr que este insert sea genérico de esta forma??

Espero sus respuestas y Saludos
  #14 (permalink)  
Antiguo 18/05/2016, 19:05
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Excepciones y base de datos

Al final solucioné mi problema, mil gracias por las respuestas. Saludos!

Etiquetas: excepciones, jar, 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 10:16.