Duda Con Consulta
tengo una consulta a una base de datos: "Select tabla.campo from tabla where tabla.campo1 = 'X' ";
entonces lo que hago es extraer ese campo y guardar el resultado en 2 listas diferentes.
la duda es porque la hacer lo siguiente:
lista1.add(tabla.getString("campo"));
lista2.add(tabla.getString("campo"));
lista1.size();
lista2.size();
Ambas listas me salieron valor null o sea vacias.
sin embargo no debe de salir vacias porque yo tomo esa consulta la ejecuto en
el manejador de base de datos y si me devuelve los resultados.
como nota estoy utilizando LikendList de ArrayList.
ustedes sabran a que se deba esta situacion !!!!
- Inicie sesión o regístrese para enviar comentarios
Ok
No sé si el texto entre comillas es case sensitive pero tu a un campo lo llamas Campo1 y al otro campo1 prueba poniendo el número de la posicion del campo en tu consulta en este caso como tu select es solo sobre un atrbuto prueba poniendo
Corrección a la consulta, de
Corrección a la consulta, de todas maneras no lo puedo hacer por posición porque se obtienen varios campos.
Alguna otra forma.
solo se me ocurre
Que antes no hayas puesto un
suponiendo que tabla sea del tipo ResultSet
o
no importa que tengas varios campos, primero prueba que puedes recuperar el valor
Cuando agrego el campo a una
Cuando agrego el campo a una sola lista si funciona, pero al intentarlo a mismo tiempo en la lista2 es cuando ya no recupera la información, es como si no pudiera usar la lista dos veces es decir el tabla.getString() para obtener un mismo campo.
entonces
Si lo que quieres es tener identicos los Arrays deberias hacer una copia de lista1 a lista2. Aunque si esta muy extraño lo que mencionas
No sera cuestión de algun
No sera cuestión de algun método de la lista, lo que pasa es que me sigue generando problemas cuando la recorro y la voy llenando
con la información de mi consulta, y quiero obtener su tamaño me dice que esta vacia y eso no puede ser porque esa misma
consulta yo la ejecuto en el manejador de base de datos y si me devuelve un valor.
A ver
Pon un poco del código que tienes para ver detalladamente ¿qué pex? no olvides ponerlo entre las etiquetas de <code> y </code>
Estoy analizando de nuevo el
Estoy analizando de nuevo el código y quizá el problema sea porque primero lleno mi lista con los objetos que obtengo de mi consulta,posteriomente guardo el tamaño de esa lista en otra lista para finalmente recorrerla y que me devuelva los elementos que yo necesito.
Una solución que se me ocurre
Una solución que se me ocurre y que me gustaria saber su opinión es si utilizo en vez de una lista alguna otra o en lugar de linkedList alguna otra !!!!
La sugerencia que se me
La sugerencia que se me ocurre, es que crees una variable, ahí guardes el valor de tu
y después esa variable que creaste, se la insertes a tus listas, así matas 2 pájaros de un tiro, con el debugger verificas que te esté entregando valores tu consulta, y puedes insertar ésa variable a tus listas sin problemas..
Gracias por las respuestas,
Gracias por las respuestas, ya arregle el código para solo tener que insertar en una lista los campos,
ahora surge otro problema,
que después de llenar esa lista necesito saber su tamaño,
pero cuando lo trato de obtener no me regresa ningún valor,
como si la lista estuviera vacía, ahora si obtengo el tamaño
dentro del mismo for donde estoy llenando la lista ahí si me devuelve un valor,
pero porque no lo hace después de que llene la lista???
Esto es parte del código:
En este fragmento de codigo si obtengo el tamaño, pero si lo trato de obtener despues o afuera del for es cuando no me regresa nada,
Podrías postear tu método
Podrías postear tu método completo, para ver dónde y cómo declaras tu lista?
Claro que si
valor
Creo que es importante entre programadores usar una nomenclatura precisa.
después de llenar esa lista necesito saber su tamaño, pero cuando lo trato de obtener no me regresa ningún valor
Tomando literalmente lo que dices, eso es imposible. El método
devuelve un
, por lo tanto siempre vas a obtener un valor (no puedes obtener
por ejemplo, que eso es lo que normalmente se le dice "ningún valor"). Tal vez entonces te refieres a que
te devuelve 0, pero eso es muy distinto a que no te devuelve ningún valor.
Regresando a tu código... no entiendo por qué tienes el for anidado (no importa que esté vacío) en este último código que pegaste. Además esa no es la manera recomendada de iterar por una lista, a menos que requieras la referencia al índice, y aún así es mejor irlo incrementando. A partir de Java 5 tienes el foreach:
Si no necesitas el índice para nada pues ni siquiera lo tienes que definir ni incrementar.
Pero al final, supongo que tu problema es que haces algo así desde fuera de este método:
La verdad es que lo anterior sólo puede ocurrir si se arroja una excepción antes de entrar al ciclo, y por eso se devuelve vacío el arreglo. Realmente no estás manejando la excepción, solamente la imprimes a STDOUT pero pues si no revisas la salida del programa nunca te vas a dar cuenta de que tronó. En todo caso sería mejor declarar que tu método arroja SQLException.
Otras cosas que tienes mal:
No tienes un
para cerrar la conexión, de modo que solamente la cierras si todo sale bien. La conexión la debes cerrar SIEMPRE, por eso:
O si no vas a cacharla sino que la pasas a quien invoque tu método entonces:
Te estás tragando una SQLException y una IOException a la hora de crear la conexión y el statement. Si algo sale mal en ese primer bloque try-catch, el siguiente bloque arrojará NPE al tratar de invocar un método sobre instruccion que puede ser null. Y además tu código es vulnerable a ataque de inyección de SQL. Usa PreparedStatement y pásale los parámetros. Debes hacer esto:
Porque lo que estás haciendo es básicamente esto:
El problema es que si un usuario te manda como parámetro
entonces canceló todas tus condiciones y obtiene la tabla completa. O peor aún, si te pone
te tiran una tabla de la base de datos y nunca vas a saber cómo ocurrió eso. Es muy triste que en 2011 haya programadores que siguen creando código vulnerable a inyección de SQL.
Gracias por tus comentarios
Gracias por tus comentarios @ezamudio así como tu comentario fue "Es muy triste que en 2011 haya programadores que siguen creando código vulnerable" así mismo creo yo que hay programadores con mucha experiencia como tu que aportan buenas cosas para programar sistemas con buenos estándares.
voy a volver a analizar mi código, tomar como base tus comentarios y posteo mi resultado para que esto sea retroalimentativo.
no tanto para ti pero si para otros compañeros programadores que quiza esten iniciando en el mundo de java y para que no comentan los mismos errores.
Saludos.
esa es la idea
Todo lo que posteamos aquí se queda para la posteridad, por eso pedimos que cuando encuentran la solución a su problema lo vengan a postear aquí, porque a alguien le servirá en el futuro...
En cuanto mi comentario de lo triste que es que siga habiendo código vulnerable a inyección de SQL, es porque ese tema ya ha salido en muchas noticias, blogs tecnológicos y ha sido tratado (creía yo) hasta el cansancio... entiendo que software en PHP esté plagado de esos problemas pero en Java ya desde hace varios años tenemos facilidades como PreparedStatement para nunca caer en esas broncas.
Avances
Ya arregle el código con los ajustes que me comentas,
solo que ahora tengo otro problema al ejecutarlo,
al parecer es algo con el PreparedStatement porque
al pasarle como parametros la sql y mandar llamar el metodo
me devuelve un java.sql.SQLException:
Result set type is TYPE_FORWARD_ONLY,
entonces lo que hago es agregarle en los parametros
ResultSet.TYPE_SCROLL_SENSITIVE y ResultSet.CONCUR_UPDATABLE
pero ahora ya no me manda ninguna excepción y me muestra incompleta la pagina
en la que mando llamar el metodo, la cual es un jsp. Estos son los códigos:
METODO