Duda Con Consultas
Hola buenas tardes, estoy haciendo un sistema para consultar información vía web, lo estoy desarrollando con Java y debo utilizar una base de datos en Access, esto no lo puedo cambiar por petición del cliente. Lo que estoy haciendo es que para generar los reportes,la información la obtengo a través de métodos, creo un método específico para cada tipo de reporte, y el problema está en que en un solo método tengo problemas al utilizar consultas que contengan Group by o Distinct, estas consultas las pruebo previamente en el manejador y funcionan, pero cuando las implemento en el método de java no me devuelve información. Al obtener los datos de un método los muestro a través de un JSP.
Estos son los códigos para ver si alguien podría indicarme a que se debe que esas consultas no funcionan y como debo resolverlo. Gracias.
Método de Java:
JSP:
- Inicie sesión o regístrese para enviar comentarios
JDBC
sin ver tu código, por la descripción del problema que das, me suena a que tu bronca es con el driver JDBC que estás usando. Cuando dices "en el manejador" supongo que es algun programa que se conecta directo a Access y ahí sí funcionan los queries, pero desde Java no funcionan, esto es probable que sea porque el driver JDBC que estás usando para conectarse a access hace algo con los queries que tienen group by etc y access no los recibe bien.
Y viendo muy por encimita tu código, la bronca podría ser con el SQL como queda generado, porque no estás usando queries parametrizados, sino concatenando la sentencia SQL y eso te hace vulnerable a inyección de SQL etc.
Seguridad
Ante todo te recuerdo que debes estar pendiente a la seguridad , según veo tus consultas sql son vulnerables, deberías usar parámetros en vez de concatenación haces un +matricula+, eso no es correcto, lo correcto sería variable.setString(int var,String var); y usar el signo ? . Así evitarás inyecciones, aparte creo que sería mejor que usaras un switch para los multi-condicionales .
Independientemente de lo que
Independientemente de lo que ya se comentó, y aprovechando tu hueco de seguridad, haz una salida por consola de tu consulta cuando tenga todos los parámetros insertados, o sea, antes de ejecutarla, copia dicha consulta desde la consola, ejecútala en tu navegador de base de datos, si te trae registros, la falla va más por el lado, ya sea del driver como bien dice @ezamudio, o en su defecto, por la conexión (ya sabes, que esté apuntando bien a la URL de la base de datos, que el usuario y pass sea correcto y eso) ya que te asegures que el driver es el correcto, la conexión a la base si se realiza, y las consultas generadas por tus métodos si regresan resultados, cambia TODO según los comentarios anteriores..
sto es probable que sea
sto es probable que sea porque el driver JDBC que estás usando para conectarse a access hace algo con los queries que tienen group by etc y access no los recibe bien.
Respecto a tu comentario @ezamudio hay alguna forma de solventar este problema, existe alguna herramienta para resolver problemas con el JDBC o porque se da este tipo de problemas, o sera que access presenta mas poblemas de lo normal con Java,???? y es que forzamente tengo que utilizar group by ......
Cambiare mis Consultas SQL a
Cambiare mis Consultas SQL a como menciona ,@ezamudio y @Jefri y posteare el código resultante.
De igual forma agradezco el aporte de @neko069
Gracias.
JDBC no es más que la
JDBC no es más que la especificación para conexiones a bases de datos, por sí mismo no hace nada.
Cada fabricante de bases de datos (dígase Oracle, IBM, PostgreSQL, MySQL, y en éste caso (el intento de base de datos)Microsoft access) deben proveer la implementación específica para que Java pueda interactuar con su base de datos.
Porqué el rollo? bueno, pues las consultas, si tienen problemas, serían más por el lado del cómo creas y ejecutas las consultas en sí, a diferencia de lo que planteas, el hecho de resolver problemas con JDBC sobre el driver de access .... aunque siendo de microsoft, pues sabe...
Aquí te dejo una liga donde explican cómo hacer la conexión, dando de alta el driver odbc en windows, y después en Java, utilizando un driver para conectarse al odbc.
Y aquí te dejo una liga con un listado de los proveedores de drivers para conexión a bases de datos mediante Java, ya nada más búscale cuál(es) es(son) compatible(s) para access y pues haces la prueba, digo, por decir que sea el jar que tienes para conectividad la causa del problema.
por experiencia...
Posiblemente tengas los problemas que dice con access debido a que las consultas en este manejador (si se puede llamar asi) son algo raras :S
si por ejemplo quieres lo siguiente:
SELECT AVG(calificacion) FROM alumnoGROUP BY materia
te marcara un error de sintaxis por que no lo se pero lo marca, y te dice algo asi como que todos los parametros de agrupacion deben pertenecer a la sentencia con lo cual lo corriges asi:
SELECT materia,AVG(calificacion) FROM alumnoGROUP BY materia
la verdad yo te recomendaría que propusieras la migración a otra base de datos como SQLite, ya que la conexion con ODBC-JDBC es algo inestable.
@cerimice es increible
@cerimice es increible cuando te suceden este tipo de detalles los cuales corriges y sigues trabajando pero sin saber exactamente que hacer, aquí lo importante es conocer opiniones para mejorar nuestras aplicaciones, se te agradece el comentario y sigo trabajando en la solución
creo quee...
creo que por ello estamos aqui posteando nuestras cositas jejejeje seguir adelante, saludos
ya estuve revise y revise mi
ya estuve revise y revise mi código y siento que por ahí no va el problema, también he revisado mi conexión JDBC y
tampoco es el problema porque hay consultas que si se ejecutan sin ningún problema.
en especifico esta es la consulta que me origina problema, me podrían ayudar a echarle un ojo a ver si por
ahí este algún detalle que este ocasionando que no me devuelva ningún valor y que si la ejecuto en modo consola en mi base de datos si me devuelve valores.
O sea cómo, si la ejecutas en
O sea cómo, si la ejecutas en tu aplicación no te devuelve nada, y si la ejecutas por fuera sí te regresa valores?
) para que veas cómo queda tu consulta, ya con los valores que le pasas como "programa" y "periodo" y pégala en tu cliente de base de datos, a ver si te devuelve valores...
Haz una salida por consola ( con
Si la ejecuto en mi
Si la ejecuto en mi aplicación no me devuelve ninguna valor esa consulta, en cambio si lo ejecuto
en base de datos es decir en access directamente si me devuelve registros.
El problema es al ejecutar la consulta en mi aplicación, no se si sea java que no acepta por algún motivo
Distintc porque esa misma consulta la hago con gruop by y tampoco genera nada.
PreparedStatement
No concatenes SQL, usa PreparedStatement. Y espero que no tengas ese punto y coma al final del statement en JDBC porque podria ser lo que hace que no obtengas nada (se ejecuta el query, pero luego se ejecuta lo que sigue que es nada, y eso es lo que obtienes; si el driver JDBC esta jodido eso podria estar haciendo).
Que tal @ezamudio respecto a
Que tal @ezamudio respecto a tu comentario ya use PreparedStatement y nada al parecer el error esta en el uso de java con Access por no se que motivo si uso DISTINCT o GRUOP BYE no ejecuta la consulta. ahora intente usar
Top y tampoco.