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 !!!!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

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 lista1.add(tabla.getString(1));

Imagen de CesarAlducin

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

tabla.next()

suponiendo que tabla sea del tipo ResultSet
o  while(tabla.next()

no importa que tengas varios campos, primero prueba que puedes recuperar el valor

Imagen de CesarAlducin

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

Imagen de CesarAlducin

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>

Imagen de CesarAlducin

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.

Imagen de CesarAlducin

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 !!!!

Imagen de neko069

La sugerencia que se me

La sugerencia que se me ocurre, es que crees una variable, ahí guardes el valor de tu tabla.getString( "campo" ) 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..

Imagen de CesarAlducin

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:

sqlString = "SELECT DISTINCT horarios.GrupH, plan_est.cve_mat, plan_est.materia, plan_est.sem, (personal.nombre+' '+personal.ap_pat+' '+personal.ap_mat) AS nombreCompleto FROM [C:\\BD\\rechum\\Admin.mdb].PERSONAL INNER JOIN ([C:\\BD\\HorariosDocentes\\horarios.mdb].Horarios INNER JOIN plan_est ON Horarios.clvm=plan_est.cve_mat) ON PERSONAL.nup=Horarios.nup WHERE Horarios.clvc='"+programa+"' AND Horarios.periodo='"+periodo+"' AND plan_est.ext_cur<>'*';";
                        tabla = instruccion.executeQuery(sqlString);
                        while(tabla.next()){
                                MetodosAuxiliares info= new MetodosAuxiliares();
                                info.setGrupo(tabla.getString("GrupH"));
                                info.setClaveMateria(tabla.getString("cve_mat"));
                                info.setMateria(tabla.getString("materia"));
                                info.setSemestres(tabla.getString("sem"));
                                info.setMaestro(tabla.getString("nombreCompleto"));
                                smpgi.add(info);
                                MetodosBusquedas datos= new MetodosBusquedas();
                                datos.setHombresNI(smpgi.size());
                                reporteAR.add(datos);
                        }

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,

Imagen de neko069

Podrías postear tu método

Podrías postear tu método completo, para ver dónde y cómo declaras tu lista?

Imagen de CesarAlducin

Claro que si

public static LinkedList<MetodosBusquedas> getReporteAR(String programa2, String periodo2){    
                Connection canal= null;        
            ResultSet tabla= null;
            Statement instruccion=null;    
            String programa=programa2, periodo=periodo2;
            String sqlString="", materia="", semestre="", grupo="";
            int rows=0, contador=0;
           
            LinkedList<MetodosBusquedas> reporteAR = new LinkedList();
            LinkedList<MetodosAuxiliares> smpgi= new LinkedList();
            LinkedList inscritos= new LinkedList();
           
            try {  //conectar a la b.d.
                canal = Conector.getConexion("ux");
                instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        }catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {} catch(IOException e){};
               
                try{
                                               
                        sqlString = "SELECT DISTINCT horarios.GrupH, plan_est.cve_mat, plan_est.materia, plan_est.sem, (personal.nombre+' '+personal.ap_pat+' '+personal.ap_mat) AS nombreCompleto FROM [C:\\BD\\rechum\\Admin.mdb].PERSONAL INNER JOIN ([C:\\BD\\HorariosDocentes\\horarios.mdb].Horarios INNER JOIN plan_est ON Horarios.clvm=plan_est.cve_mat) ON PERSONAL.nup=Horarios.nup WHERE Horarios.clvc='"+programa+"' AND Horarios.periodo='"+periodo+"' AND plan_est.ext_cur<>'*';";
                        tabla = instruccion.executeQuery(sqlString);
                        while(tabla.next()){
                                MetodosAuxiliares info= new MetodosAuxiliares();
                                info.setGrupo(tabla.getString("GrupH"));
                                info.setClaveMateria(tabla.getString("cve_mat"));
                                info.setMateria(tabla.getString("materia"));
                                info.setSemestres(tabla.getString("sem"));
                                info.setMaestro(tabla.getString("nombreCompleto"));
                                smpgi.add(info);
                               
                                MetodosBusquedas datos= new MetodosBusquedas();
                                datos.setHombresNI(smpgi.size());
                                reporteAR.add(datos);
                               
                                for(int i=0;i<smpgi.size();i++){
                                       
                                }
                        }                                                                                                                                      
                        canal.close();
                }catch(SQLException e){ System.out.println(e); };              
                return reporteAR;
Imagen de ezamudio

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 size() devuelve un int, por lo tanto siempre vas a obtener un valor (no puedes obtener null por ejemplo, que eso es lo que normalmente se le dice "ningún valor"). Tal vez entonces te refieres a que smpgi.size() 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:

int indice=0;
for (MetodosAuxiliares m : smpgi) {
  //hacer algo con m
  indice++;
}

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:

List<MetodosBusquedas> l = getReporteAR("x", "y");
l.size(); //devuelve 0

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 finally para cerrar la conexión, de modo que solamente la cierras si todo sale bien. La conexión la debes cerrar SIEMPRE, por eso:

Connection canal = null;
try {
  canal=//obtener conexion
} catch (SQLException ex) {
  //manejarla
} finally {
  if (canal != null) try {
    canal.close();
  } catch (SQLException e2) {
    //ni esto se pudo...
  }
}

O si no vas a cacharla sino que la pasas a quien invoque tu método entonces:

public void miMetodo() throws SQLException {
  Connection canal = null;
  try {
    conn = //obtenerla
  } finally {
    if (conn != null) conn.close();
  }
}

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:

PreparedStatement ps = canal.prepareStatement("SELECT bla FROM ble WHERE bli=?");
ps.setString(1, "blu");
tabla = ps.executeQuery();

Porque lo que estás haciendo es básicamente esto:

String x = "blu"; //nos lo pasan, probablemente algo que tecleó un usuario
Statement st = canal.createStatement("SELECT bla FROM ble WHERE bli='" + "'");
tabla = ps.executeQuery();

El problema es que si un usuario te manda como parámetro ' OR 1=1;-- entonces canceló todas tus condiciones y obtiene la tabla completa. O peor aún, si te pone '; DROP TABLE Horarios;-- 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.

Imagen de CesarAlducin

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.

Imagen de ezamudio

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.

Imagen de CesarAlducin

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

public static LinkedList<MetodosBusquedas> getReporteAR(String programa2, String periodo2) throws ClassNotFoundException, SQLException, IOException{   
                Connection canal= null;
                PreparedStatement ps=null, ps2=null;        
            ResultSet tabla= null, tabla2=null;    
            String programa=programa2, periodo=periodo2;
            String sqlString="", materia="", semestre="", grupo="", sqlString2="", total="";
            int rows=0, rows2=0;
           
            LinkedList<MetodosBusquedas> reporteAR = new LinkedList();
            LinkedList<MetodosAuxiliares> smpgi= new LinkedList();
            LinkedList inscritos= new LinkedList();
           
            canal = Conector.getConexion("ux");
               
                try{
                        ps = canal.prepareStatement("SELECT DISTINCT horarios.GrupH, plan_est.cve_mat, plan_est.materia, plan_est.sem, (personal.nombre+' '+personal.ap_pat+' '+personal.ap_mat) AS nombreCompleto FROM [C:\\BD\\rechum\\Admin.mdb].PERSONAL INNER JOIN ([C:\\BD\\HorariosDocentes\\horarios.mdb].Horarios INNER JOIN plan_est ON Horarios.clvm=plan_est.cve_mat) ON PERSONAL.nup=Horarios.nup WHERE Horarios.clvc=? AND Horarios.periodo=? AND plan_est.ext_cur<>'*';",ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
                        ps.setString(1, programa);
                        ps.setString(2,periodo);
                        tabla = ps.executeQuery();
                        tabla.last();
                        rows=tabla.getRow();
                        tabla.beforeFirst();                   
                        for(int n=0;n<rows;n++){
                                if(tabla.next()){
                                        materia=tabla.getString("cve_mat");
                                        semestre=tabla.getString("sem");
                                        grupo=tabla.getString("GrupH");
                                       
                                        MetodosAuxiliares info= new MetodosAuxiliares();
                                        info.setGrupo(grupo);
                                        info.setClaveMateria(materia);
                                        info.setMateria(tabla.getString("materia"));
                                        info.setSemestres(semestre);
                                        info.setMaestro(tabla.getString("nombreCompleto"));                                    
                                        smpgi.add(info);
                                       
                                        MetodosBusquedas datos= new MetodosBusquedas();
                                                               
                                        ps2=canal.prepareStatement("SELECT COUNT(historia.matricula) AS total FROM alumnos INNER JOIN (historia INNER JOIN grupos ON historia.matricula=grupos.matricula) ON historia.matricula=alumnos.matricula WHERE historia.carrera=? AND historia.periodo=? AND historia.sem=? AND historia.grupo=? AND alumnos.sit_esc<>'B' AND grupos.cve_materia=? AND grupos.periodo=?;",ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
                                        ps2.setString(1, programa);
                                        ps2.setString(2, periodo);
                                        ps2.setString(3, semestre);
                                        ps2.setString(4, grupo);
                                        ps2.setString(5, materia);
                                        ps2.setString(6, periodo);
                                        tabla2 = ps2.executeQuery();
                                        if(tabla2.next()){
                                                inscritos.add(tabla2.getString("total"));
                                        }
                                        String val=(String)inscritos.get(n);
                                        datos.setMatricula(val);
                                        datos.setHombresRI(inscritos.size());                                                                          
                                        datos.setHombresNI(smpgi.size());
                                        reporteAR.add(datos);
                                }
                        }
                        ps.close();
                        ps2.close();                   
                }              
                finally {
                        if (canal != null)
                                try { canal.close();
                                } catch (SQLException e2) { }
                }
                return reporteAR;
        }
JSP

 <%
                                                try{
                                                        LinkedList<MetodosBusquedas> lista= ResultadoBusquedas.getReporteAR(programa, periodo);
                                                        for(int i=0;i<lista.size();i++){
                                                                bandera=1;
                                          %>
                              <tr>
                                <td><%=lista.get(i).getSemestre()%></td>
                                <td><%=lista.get(i).getMateria()%></td>
                                <td><%=lista.get(i).getDocente()%></td>
                                <td><%=lista.get(i).getMatricula()%></td>
                                <td><%=lista.get(i).getHombresNI()%></td>
                                <td><%=lista.get(i).getHombresRI()%></td>
                                <td>&nbsp;</td>
                                <td>&nbsp;</td>
                                <td>&nbsp;</td>
                                <td>&nbsp;</td>
                                <td>&nbsp;</td>
                                <td>&nbsp;</td>
                                <td>&nbsp;</td>
                              </tr>
                                        <%              }
                            if(bandera==0 && !programa.equals("")){
                                out.println("<script>alert('No se encontraron registros');</script>");
                            }
                                                }catch(java.lang.ClassNotFoundException e){out.println(e);}
                                                catch(SQLException e2) {out.println(e2);}
                                                catch(IOException e3){out.println(e3);}
                                        %>