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

PreparedStatement

Estas en el tema de PreparedStatement en el foro de Java en Foros del Web. Hola.. tengo un detalle con un codigo para obtener datos de apartir de un query mediante prepared statement. el codigo es el siguiente: Connection con ...
  #1 (permalink)  
Antiguo 10/03/2009, 20:59
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 0
PreparedStatement

Hola.. tengo un detalle con un codigo para obtener datos de apartir de un query mediante prepared statement. el codigo es el siguiente:

Connection con = new Connection();
PreparedStatement ps = null;
ResultSet rs = null;
String qry=" Select * from Usuarios u where u.cuenta= ? AND u.clave = ? and activa=1 order by u.cveUsuario ";
try {
con.open();
ps = con.prepareStatement(qry);
ps.setString(1,"edoQro");
ps.setString(1,"1");
rs=ps.executeQuery();
while (rs.next()) {
Usuarios an = new Usuarios();

an.setNivel(rs.getInt("Nivel"));
an.setCuenta(rs.getString("Cuenta"));
an.setClave(rs.getString("Clave"));
an.setNombre(rs.getString("Nombre"));
an.setIdServidor(rs.getInt("idServidor"));
an.setCveUsuario(rs.getInt("CveUsuario"));
an.setFua(rs.getDate("FUA"));
an.setEmail(rs.getString("EMAIL"));
an.setMenus(new ArrayList<Menu>());
List<MenuUsuario> menus = (MenuUsuarioDAO.getInstance().obtenerMenuUsuario(a n.getCveUsuario()));
for (Iterator iter = menus.iterator(); iter.hasNext();) {
MenuUsuario element = (MenuUsuario) iter.next();
an.getMenus().add(MenuDAO.getInstance().get(elemen t.getIdMenu()));
}

salida.add(an);
}
rs.close();
rs=null;
con.close();
con=null;
ps.close();
ps=null;

Bueno el detalle es que la ejecucion no devuelve datos, el query esta perfectamente bien puesto que lo he probado, de hecho si armo el quey con datos fijos en en la cadena qry funciona, sin embargo al preparar el preparestatement y asignarle los valores que deben de sutituir al los ? falla.

Agradeceria sus respuestas bastante. Alguna idea del porque no devuelve nada.
Gracias.
  #2 (permalink)  
Antiguo 10/03/2009, 22:28
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: PreparedStatement

Hola:

Veo una cosa rara y es esto

ps.setString(1,"edoQro");
ps.setString(1,"1");

Cada interrrogante es una posición y deberías rellenarlos todos con con

pr.set... (1,
pr.set... (2,

Además, no tienen que ser siempre setString(), habría que usar el tipo de dato concreto que sea la columna en la base de datos. No sé si clave es un String o un entero, pero si fuese un entero, sería

pr.setString(1,"edoQro");
pr.setInt(2,1);

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 11/03/2009, 08:46
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: PreparedStatement

Hola, si las dos columnas de la base de datos son de tipo cadena, chuidiang corregi lo que mencionaste y no obtiene datos aun así. Aclaro no ocurre ningún error simplemente no obtiene datos de la base, les paso el codigo otravez.

Connection con = new Connection();
PreparedStatement ps = null;
ResultSet rs = null;
String qry=" Select * from Usuarios u where u.cuenta= ? AND u.clave = ? and activa=1 order by u.cveUsuario ";
try {
con.open();
ps = con.prepareStatement(qry);
ps.setString(1,"edoQro");
ps.setString(2,"1");
rs=ps.executeQuery();
while (rs.next()) {
Usuarios an = new Usuarios();

an.setNivel(rs.getInt("Nivel"));
an.setCuenta(rs.getString("Cuenta"));
an.setClave(rs.getString("Clave"));
an.setNombre(rs.getString("Nombre"));
an.setIdServidor(rs.getInt("idServidor"));
an.setCveUsuario(rs.getInt("CveUsuario"));
an.setFua(rs.getDate("FUA"));
an.setEmail(rs.getString("EMAIL"));
an.setMenus(new ArrayList<Menu>());
List<MenuUsuario> menus = (MenuUsuarioDAO.getInstance().obtenerMenuUsuario(a n.getCveUsuario()));
for (Iterator iter = menus.iterator(); iter.hasNext();) {
MenuUsuario element = (MenuUsuario) iter.next();
an.getMenus().add(MenuDAO.getInstance().get(elemen t.getIdMenu()));
}

salida.add(an);
}
  #4 (permalink)  
Antiguo 11/03/2009, 09:45
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: PreparedStatement

Wenas

No te devuelve nada seguro?? la parte de la query es como la estas haciendo.

Si estuvieras razon y no te devolviera datos, no entraria por la parte del while. Entonces ejecutaria

salida.add(an);

Y te daria un buen cascotazo, la variable an esta declarada dentro del while.

Otra cosa que no entiendo es que estas trabajando con objetos DAO (o es que sencillamente los llamas asi?), usease, hibernate. Por que entonces preparedstatement??

Hay algo que no cuadra. Pon el codigo del metodo completo.

Saludos.
  #5 (permalink)  
Antiguo 11/03/2009, 10:14
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: PreparedStatement

Ok aqui va el método completo.

public Usuarios LoginPrepared(String usuario,String paswd) throws ValidaException {
List<Usuarios> salida = new ArrayList<Usuarios>();
Connection con = new Connection();
PreparedStatement ps = null;
ResultSet rs = null;
int indice=1;
String qry=" Select * from Usuarios u where u.cuenta= ? AND u.clave = ? and activa=1 order by u.cveUsuario ";
try {
con.open();
ps = con.prepareStatement(qry);
ps.setString(indice++,"edoQro");
ps.setString(indice++,"1");
rs=ps.executeQuery();
while (rs.next()) {
Usuarios an = new Usuarios();

an.setNivel(rs.getInt("Nivel"));
an.setCuenta(rs.getString("Cuenta"));
an.setClave(rs.getString("Clave"));
an.setNombre(rs.getString("Nombre"));
an.setIdServidor(rs.getInt("idServidor"));
an.setCveUsuario(rs.getInt("CveUsuario"));
an.setFua(rs.getDate("FUA"));
an.setEmail(rs.getString("EMAIL"));
an.setMenus(new ArrayList<Menu>());
List<MenuUsuario> menus = (MenuUsuarioDAO.getInstance().obtenerMenuUsuario(a n.getCveUsuario()));
for (Iterator iter = menus.iterator(); iter.hasNext();) {
MenuUsuario element = (MenuUsuario) iter.next();
an.getMenus().add(MenuDAO.getInstance().get(elemen t.getIdMenu()));
}

salida.add(an);
}
rs.close();
rs=null;
con.close();
con=null;
ps.close();
ps=null;

if (salida != null && salida.size() > 0)
return salida.get(0);
else
return null;

} catch (Exception e) {
e.printStackTrace();
throw new ValidaException(ValidaException.DATOS, "error.generico.consulta" + e.getMessage());
}
finally{

}

}

el query esta perfectamente bien, pues si le pongo los parámetros fijos en el string si trae los datos, pero tratandolos con ? no devuelve datos, y en efecto no entra dentro del while devolviendo un objeto null, la variable an esta declarada dentro del while por que por cada registro que traiga el query se crea un objeto de tipo Usuarios y con el salida.add(an) se agrega el objeto a la lista Salida de tipo usuarios ( List<Usuarios> salida = new ArrayList<Usuarios>(); ). Los DAO son simples clases con stters y getters asi las normbraron en la organización.

Bueno creo que el detalle esta en el preparedstatement al momento de armarlo con los setString, el problema es que lo he analizado y comparado con otros ejemplos y esta correcto, sin embargo no entiendo el por que no trae datos. Agradezco su ayuda. Alguna idea.
  #6 (permalink)  
Antiguo 11/03/2009, 10:41
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: PreparedStatement

Vale. Pero si siempre es la misma query para que quieres un preparedstatement??

no seria mas facil ejecutar un statement normal y corriente con
Select * from Usuarios u where u.cuenta= 'edoQro' AND u.clave = '1' and activa=1 order by u.cveUsuario

O es :

ps.setString(indice++,usuario);
ps.setString(indice++,passwd);
Por otro lado, el contexto de la variable an queda solamente en los limites del while, asi que no se puede usarse fuera del while. Con poner:

Usuarios an = null;
while (rs.next()) {
an = new Usuarios();


Solucionado.

Saludos.
  #7 (permalink)  
Antiguo 11/03/2009, 10:52
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: PreparedStatement

Creo que no me expliqué bien, el query no es fijo, puede variar dependiendo de los datos que se ingresen en el formulario, yo escribi

ps.setString(indice++,"edoQro");
ps.setString(indice++,"1");

solo para gacer pruebas, pero realmente se tiene que sustituir por las variables usuario y passwd respectivamente, repito, ni siquiera entra al while por lo que la parte de an=new usuario ni siquiera se ejecuta me explico y la variable an en ningun momento se utiliza fuera del while como se ve en el codigo, no puedo hacer un statement normal pues me lo pidieron especificamente con prepared statement. Alguna otra idea, me imagino que no arma bien el query con el preparedstatement, pero no entiendo por que no trae datos al momento de ejecutar el query. y vuelvo a repetir el query es correcto, los parametros son de tipo cadena, pero en ningun momento entra al while.

AYUDA!!!!!!!!!!!!!!!!!!!!!!!!
  #8 (permalink)  
Antiguo 11/03/2009, 11:04
Avatar de drac94  
Fecha de Ingreso: mayo-2008
Ubicación: México
Mensajes: 383
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: PreparedStatement

checa el driver, tal vez la version que usas no soporte los preparedStatement, por que a tu codigo no le veo problema alguno, saludos
  #9 (permalink)  
Antiguo 11/03/2009, 11:14
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: PreparedStatement

He checado driver y pues si soporta preparedStatement, de hecho para la aplicación se ejecutan inserts y updates con preparedstatement sin ningun problema, pero al ejecutar un select no me trae nada de datos a pesar de que todo este bien. Alguna otra idea.... urgente!!!!
  #10 (permalink)  
Antiguo 11/03/2009, 11:35
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: PreparedStatement

Hola:

No estoy seguro que estés ejecutando ese código. Como dice rocklove, an está declarado dentro del while, por lo que no puedes usarlo fuera y de hecho, ni siquiera debería compilar.

Si compila, es porque tienes ese an declarado en otro sitio (quizás como atributo de la clase) y NO lo estas rellenando, ya que estás rellenando el interno del bucle. Además, al añadir an fuera del bucle, estás añadiendo una sola vez un an que no está relleno.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #11 (permalink)  
Antiguo 11/03/2009, 11:42
Avatar de drac94  
Fecha de Ingreso: mayo-2008
Ubicación: México
Mensajes: 383
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: PreparedStatement

la variable an esta declarada dentro del while pero nunca se sale del contexto, pues salida.add(an) se encuentra tmb dentro del while

Código PHP:
while (rs.next()) {
    
Usuarios an = new Usuarios();

    
an.setNivel(rs.getInt("Nivel"));
    
an.setCuenta(rs.getString("Cuenta"));
    
an.setClave(rs.getString("Clave"));
    
an.setNombre(rs.getString("Nombre"));
    
an.setIdServidor(rs.getInt("idServidor"));
    
an.setCveUsuario(rs.getInt("CveUsuario"));
    
an.setFua(rs.getDate("FUA"));
    
an.setEmail(rs.getString("EMAIL"));
    
an.setMenus(new ArrayList<Menu>());
    List<
MenuUsuariomenus =   (MenuUsuarioDAO.getInstance().obtenerMenuUsuario(a n.getCveUsuario()));
    for (
Iterator iter menus.iterator(); iter.hasNext();) {
        
MenuUsuario element = (MenuUsuarioiter.next();
        
an.getMenus().add(MenuDAO.getInstance().get(elemen t.getIdMenu()));
    }
    
salida.add(an);

  #12 (permalink)  
Antiguo 11/03/2009, 11:47
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: PreparedStatement

public Usuarios LoginPrepared(String usuario,String paswd) throws ValidaException {
List<Usuarios> salida = new ArrayList<Usuarios>();
Connection con = new Connection();
PreparedStatement ps = null;
ResultSet rs = null;
int indice=1;
String qry=" Select * from Usuarios u where u.cuenta= ? AND u.clave = ? and activa=1 order by u.cveUsuario ";
try {
con.open();
ps = con.prepareStatement(qry);
ps.setString(indice++,"edoQro");
ps.setString(indice++,"1");
rs=ps.executeQuery();
while (rs.next()) {
Usuarios an = new Usuarios();

an.setNivel(rs.getInt("Nivel"));
an.setCuenta(rs.getString("Cuenta"));
an.setClave(rs.getString("Clave"));
an.setNombre(rs.getString("Nombre"));
an.setIdServidor(rs.getInt("idServidor"));
an.setCveUsuario(rs.getInt("CveUsuario"));
an.setFua(rs.getDate("FUA"));
an.setEmail(rs.getString("EMAIL"));
an.setMenus(new ArrayList<Menu>());
List<MenuUsuario> menus = (MenuUsuarioDAO.getInstance().obtenerMenuUsuario(a n.getCveUsuario()));
for (Iterator iter = menus.iterator(); iter.hasNext();) {
MenuUsuario element = (MenuUsuario) iter.next();
an.getMenus().add(MenuDAO.getInstance().get(elemen t.getIdMenu()));
}

salida.add(an);
}
rs.close();
rs=null;
con.close();
con=null;
ps.close();
ps=null;

if (salida != null && salida.size() > 0)
return salida.get(0);
else
return null;

} catch (Exception e) {
e.printStackTrace();
throw new ValidaException(ValidaException.DATOS, "error.generico.consulta" + e.getMessage());
}
finally{

}

}


Ok aqui esta el codigo nuevamente. como dije anteriormente an esta declarado dentro del while por que se supone que por cada registro que se obtenga se crea un objeto de este tipo y al final antes de salir del while se añade a una lista del tipo similar. en ningun momento se usa an fuera del while como se ve en el codigo. creo que todas las respuestas recibidas se centran en an y que esta fuera, pero, eso no es problema, de hecho no hay ninguna exception, por lo cual es correcto manejarlo asi. El problema que tengo es que al momento de ejecutar el query no me trae datos. el query es correcto, como podria observar el query ya armado, es decir cuando los ? son sustituidos por los valores pasados en ps.setString... es posible...

Gracias de antemano.
  #13 (permalink)  
Antiguo 11/03/2009, 12:39
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: PreparedStatement

Bien chicos.. asunto resuelto... el administrador de la base de datos me acaba de comentar que los campos son de tipo char(25) cuando mi jefe me habia dicho que eran varchar(25), de esta forma siendo char los espacios vacios los toma como caracter en blanco y asi jamas iban a coincidir con los parametros que yo le pasaba al query.. asi que solo le agregué un par de trims al query... "Select * from Usuarios u where trim(u.cuenta)= ? AND trim(u.clave) =? and activa=1 order by u.cveUsuario " y listo!!!.... desventaja de ser nuevo en el proyecto y no conocer la base de datos....

Mil gracias.. por las respuestas... have a nice day!!!
  #14 (permalink)  
Antiguo 12/03/2009, 05:52
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: PreparedStatement

Nunca te acostaras sin saber una cosa mas.

Nosotros rompiendonos la cabeza con las llaves (por sierto, tenias razon, sorry) y sin ver el problema.

Saludos.
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 20:02.