¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Capturando SQLException y lanzando RuntimeException con la consulta fallida en Java: ¿Es posible recuperarla de un PreparedStatement?

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 4 Vistas
0
Cargando...

Al realizar una consulta SQL, me gustaría capturar cualquier SQLException y lanzar una RuntimeException que contenga la consulta fallida, como sigue:

try {

String QUERY_STRING = "SELECT * FROM table WHERE id = ? ";

stmt.setString(1, 100);

Preparedstatement stmt = con.prepareStatement( QUERY_STRING )

stmt.executeUpdate( );

}

catch (SQLException exc) {

throw new RuntimeException( <query> );

}

donde la consulta sería "SELECT * FROM TABLE WHERE id = 100". Sin embargo, parece que no es posible recuperar esta consulta de un PreparedStatement?

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

2 Respuestas

0
Cargando...

Hay dos formas de resolver este problema:-

(1) La forma más sencilla es encapsular los parámetros y la cadena de consulta en la excepción. No resolverá tu problema al 100%, pero al menos será lo suficientemente descriptivo para manejar el error. Fragmento de código a continuación-

String param = 100;

String QUERY_STRING = "SELECT * FROM table WHERE id = ? ";

try {

stmt.setString(1, param);

Preparedstatement stmt = con.prepareStatement( QUERY_STRING )

stmt.executeUpdate( );

}

catch (SQLException exc) {

throw new RuntimeException(QUERY_STRING + “ parámetros son: ” + param );

}

(2) Puedes crear un método de utilidad en el que pasarás la cadena de consulta y la lista de parámetros. Simplemente reemplaza todos los ‘?’ con el parámetro correspondiente. Fragmento de código a continuación-

String param = 100;

String QUERY_STRING = "SELECT * FROM table WHERE id = ? ";

try {

stmt.setString(1, param);

Preparedstatement stmt = con.prepareStatement( QUERY_STRING )

stmt.executeUpdate( );

}

catch (SQLException exc) {

String query = getQueryString(QUERY_STRING, param);

throw new RuntimeException(query);

}

Nota: para un método generalizado, pasa el segundo argumento de tipo Lista, para que se puedan colocar en la consulta cualquier longitud arbitraria de parámetros.

Espero que resuelva tu problema.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola,

La razón por la que esto no funciona es que una declaración preparada se envía realmente a la base de datos con un ? en el parámetro para permitir que el servidor de la base de datos compile la consulta solo una vez y use la sustitución de variables (busca Oracle Shared Pool para comprender mejor por qué esto es importante para el rendimiento) en lugar de una recompilación completa con cada nueva consulta que utiliza diferentes parámetros.

Entonces, la respuesta corta es que no puedes obtener la cadena completa de la consulta SQL desde la declaración preparada (sin escribir/encontrar una clase proxy que funcione para primitivos y cadenas).

La respuesta más larga es que puedes hacer esto envolviendo la Declaración Preparada con un proxy de depuración, pero incluso eso podría no permitirte obtener toda la salida correcta.

La forma más fácil para que manejes la situación y obtengas un resultado legible cada vez es simplemente crear un mapa que coincida con los setters y luego hacer una simple sustitución del ? en la cadena de consulta que luego agregas a la excepción que lanzas como mensaje.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?