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

esto que hago esta bien o rompe alguna regla

Estas en el tema de esto que hago esta bien o rompe alguna regla en el foro de Java en Foros del Web. hola que tal el codigo siguiente lo tengo dentro de una clase, tenia otro codigo y me funcionaba bien, pero para adaptarlo con ciertos estandares ...
  #1 (permalink)  
Antiguo 21/10/2005, 16:16
 
Fecha de Ingreso: septiembre-2005
Mensajes: 11
Antigüedad: 18 años, 8 meses
Puntos: 0
esto que hago esta bien o rompe alguna regla

hola que tal el codigo siguiente lo tengo dentro de una clase, tenia otro codigo y me funcionaba bien, pero para adaptarlo con ciertos estandares lo tuve que cambiar a este codigo, pero me manda error, quisiera saber si estoy rompiendo alguna regla, yo llamo esta clase desde una pagina JSP

public boolean getConexion(String Servidor,String BaseDD,String Usuario,String Pass){
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLSer verDriver");
Con = DriverManager.getConnection("jdbc:microsoft:sqlser ver://localhost;DatabaseName=mibase","usu","pass");
St = Con.createStatement();
return true;
}
catch(Exception e){
return false;
}
}

public int Consulta(String msgError,String columnas,String tabla,String datos[],ResultSet Rs) throws ClassNotFoundException{
try{
int i;
String str;
str ="Select " + columnas;
str = str + " From " + tabla;
for (i=0;i<=datos.length;i++){
if (i == 0 && datos[i]!="")
str=str + " where " + datos[i];
if (datos[i]!="" && i != datos.length)
str= str + " AND " + datos[i];
}
Rs=St.executeQuery(str.toString());
msgError="";
return 0;
}
catch (SQLException e){
msgError = e.getMessage();
return e.getErrorCode();
}
}
  #2 (permalink)  
Antiguo 22/10/2005, 19:52
Avatar de hernux  
Fecha de Ingreso: agosto-2001
Ubicación: Buenos Aires, Argentina
Mensajes: 37
Antigüedad: 22 años, 8 meses
Puntos: 0
Hola,

Lo unico que veo aparentemente, es que estas armando mal el sql, no me convence mucho el for()...

1- el operador != no es valido con strings...
2- vos tomas en cuenta que es el primero cuando i vale 0... no conozco tu programa pero podria suceder que el primer elemento del array no contenga nada y el segundo si, con lo cual, i ya no seria 0 , y sin embargo seria el primer elemento.
3- no te interesan los elementos que no tengan contenidos, y lo estas validando 2 veces, solo hace falta hacerlo una vez. (para ahorrar recursos)
4- no estas usando else en el if, con lo cual, en la primer recorrida se tomara como valido en los 2 if, y habra codigo duplicado

Yo lo cambiaría por algo asi:


for (i=0,int ivalido=0; i <= datos.length; i++){
// solo acepto los datos que tienen contenidos
if (datos[i] != null && !datos[i].trim().equals("")){
// si es el primer elemento , agrego el where
if (ivalido = 0)
str += " where ";

// sino agrego el and
else
str += " and ";

// ahora si, agrego la clausula
str += datos[i];

// incremento ivalido
ivalido++;
}
}

...
aunque eso solo deberia traerte resultados incorrectos, pero no tirar error... si seguis con problemas... podrias postear el error que te da? asi vemos cual es el problema...
__________________
suerte
y hasta la proxima
SI TUX QUIERE!!!!

Hernán Casadesús
Herac Team Leader
  #3 (permalink)  
Antiguo 24/10/2005, 09:05
 
Fecha de Ingreso: septiembre-2005
Mensajes: 11
Antigüedad: 18 años, 8 meses
Puntos: 0
hola hernux gracias por responder, en pocas palabras lo que quiero hacer es esto:

Para consultar una base de datos quiero hacer una clase generica, o sea, yo le quiero mandar como parametros, las columnas que quiero, la tabla y las condiciones (where), dentro de la clase yo armaria la consulta, la clase me debe de regresar un numero, si me regresa 0 no hubo error y si hay error me regresa el numero de error, tambien quiero que me regrese el ResultSet, el cual es un parametro por referencia(eso creo segun he leido, los objetos pasan por referencia). entonces cuando no me marca error la clase y quiero usar el ResultSet en la pagina ahi me muestra un error(muestro mas adelante), ya resolviendo que me regrese los valores, trabajaria en armar bien mi consulta.

El error es el siguiente:

type Informe de Excepción

mensaje

descripción El servidor encontró un error interno () que hizo que no pudiera rellenar este requerimiento.

excepción

org.apache.jasper.JasperException
org.apache.jasper.servlet.JspServletWrapper.servic e(JspServletWrapper.java:370)
org.apache.jasper.servlet.JspServlet.serviceJspFil e(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspSe rvlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet .java:802)


causa raíz

java.lang.NullPointerException
org.apache.jsp.C_jsp._jspService(org.apache.jsp.C_ jsp:62)
org.apache.jasper.runtime.HttpJspBase.service(Http JspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet .java:802)
org.apache.jasper.servlet.JspServletWrapper.servic e(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFil e(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspSe rvlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet .java:802)


nota La traza completa de la causa de este error se encuentra en los archivos de diario de Apache Tomcat/5.5.11.
  #4 (permalink)  
Antiguo 24/10/2005, 11:58
Avatar de hernux  
Fecha de Ingreso: agosto-2001
Ubicación: Buenos Aires, Argentina
Mensajes: 37
Antigüedad: 22 años, 8 meses
Puntos: 0
Efectivamente, los parametros pasan por referencia, pero ese no es el problema que estas teniendo... Te esta tirando un nullPointerException, lo que significa que estas tratando de ejecutar un metodo en un objeto que es null.

en el codigo que presentas, veo que accedes a variables globales, y no verificas si son null o no.. tambien recorres un array sin verificarlo.. lo que te diria es que rodees el for con un if.. o sea asi:

if (datos != null){
for [...]{}
}

y tambien verifiques la variable St.. o sea, antes de St.executeQuery(), o mejor aún, al principio del método para evitar procesar los datos.... podrias poner:

if (St == null){
return 1;
}

tambien podes si queres recuperarte del error.. o sea, en lugar de return 1, podrias conectarte a la base y crear un St valido, si el global es null.

De todas formas, mi consejo es que no uses un Statement global, ya que este es único por consulta.. y jsp es un sistema multithreaded, con lo cual, si dos threads acceden al mismo tiempo a tu metodo Consulta, entonces entrarán en conflicto ya que uno pisará los cambios del otro... ademas es mejor que liberes el statement... usando St.close() despues de el executeQuery...
__________________
suerte
y hasta la proxima
SI TUX QUIERE!!!!

Hernán Casadesús
Herac Team Leader

Última edición por hernux; 24/10/2005 a las 12:08
  #5 (permalink)  
Antiguo 24/10/2005, 17:01
 
Fecha de Ingreso: septiembre-2005
Mensajes: 11
Antigüedad: 18 años, 8 meses
Puntos: 0
mira en la JSP me regresa un null (que segun me lo regresa la clase), entonces si en la clase en el return le pongo que me regrese el numero de Registros me regresa 21 que es en realidad los que estan en la base de datos, por lo que creo que si obtiene registros, pero lo que no me esta regresando es el ResultSet por referencia, cuando tenia un return Rs, tambien me regresaba bien los registros, pero no quiero el Rs con return, si no que sea por referencia, ahorita como lo tengo es mas o menos asi:

Rs=St.executeQuery(str.toString());
while(Rs.next()){
i=i+1;
}
return i;

esto es en la clase, aqui solo cuento el numero de registros
y asi mando llamar la clase

int Num = Var.Consulta(gMsgError,columnas,tabla,strDatos,Rs) ;
out.println(Rs);
out.println(Num);

y lo que imprime es:

null
21

entonces creo que me regresa bien el 21 y el null es por que no me regresa bien el Rs por referencia.

como ves ?
  #6 (permalink)  
Antiguo 24/10/2005, 19:44
Avatar de hernux  
Fecha de Ingreso: agosto-2001
Ubicación: Buenos Aires, Argentina
Mensajes: 37
Antigüedad: 22 años, 8 meses
Puntos: 0
hola,
primero que nada, no necesitas recorrer el recorset para contarlo.. .. jdbc ya te dice cuantos resultados tiene.. usas para eso si no me equivoco el metodo getFetchSize() .. aunque no recuerdo si era este, hace mucho que no uso JDBC ... ahora uso ojb o hibernate.

sobre tu segundo problema.. el null pointer.. no estoy seguro, habria que ver como funcionan los parametros de salida, pero supongo que tal vez, el problema es que no le estas pasando nada por referencia... a lo que me refiero, es a que en este punto:

int Num = Var.Consulta(gMsgError,columnas,tabla,strDatos,Rs) ;

rs es null, y por lo tanto, no es una referencia válida, entonces, java no tiene forma de asociarlo con el recordset que se crea dentro del metodo Consulta.

Como te dije, no estoy seguro, pero se puede verificar probando algo simple.. usando un array.. en lugar de pasarle un Rs, pasale un array de ResultSets.. o sea, algo asi:

en el jsp:
ResultSet[] ars = new ResultSet[0];
int Num = Var.Consulta(gMsgError,columnas,tabla,strDatos,ars ) ;
ResultSet rs = ars[0];

y en tu clase:

public int Consulta(String msgError,String columnas,String tabla,String datos[],ResultSet[] Rs) throws ClassNotFoundException{
[...]
Rs[0] = St.executeQuery(str);
[...]
}

espero que te sirva...
__________________
suerte
y hasta la proxima
SI TUX QUIERE!!!!

Hernán Casadesús
Herac Team Leader
  #7 (permalink)  
Antiguo 25/10/2005, 00:40
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
getFetchSize() no devuelve el numero de registros que da una consulta, devuelve el numero de registros que por defecto se trae de golpe por defecto el driver JDBC al hacer un consulta.

De hecho, dado que hay bases de datos que no son capaces de contar cuantos registros devuelve una consulta hasta haberlos recuperado todos, al menos hasta hace poco no habia ningun metodo directo de devolver cuantos registros devuelve una consulta.

Hibernate, JDO y otras herramientas te lo devuelven, pero por que en realidad ya se los bajan ellos (aunque solo sean las claves primarias) y los cuentan.
  #8 (permalink)  
Antiguo 25/10/2005, 06:51
Avatar de hernux  
Fecha de Ingreso: agosto-2001
Ubicación: Buenos Aires, Argentina
Mensajes: 37
Antigüedad: 22 años, 8 meses
Puntos: 0
bueno, yo dije que no recordaba bien cual era, pero si existe un metod que lo hace... no recuerdo cual pero yo estoy seguro de que lo hacia.. conozco la diferncia entre hibernate, JDO, OJB y JDBC.. pero hay algo que es muy cierto.. la unica forma de que jdbc no pueda saber cuantos registros hay en una consulta, es que uses un punter "Forward Only" en cuyo caso, no podrias tampoco recorrer 2 veces con un while..

como dije antes, no recuerdo mucho porque hace ya muchos años que deje de usar jdbc de esta forma... de hecho, los ultimos 2 años que use jdbc antes de comenzar a utilizar herramientas de persistencia, fue trabajando con el Patron DAO... o sea, que el recordset solo lo usaba para hacer consulstas ForwardOnly, y apenas llegaba recorria el while de la misma forma que aca, pero no para contar sino para convertir cada registro en un Objeto y agregarlo a un ArrayList. En cuyo caso, saber la cantidad era tan simple como list.size() :-p

pero despues comence a utilizar OJB para proyectos pequeños y Hibernate para proyectos grandes con EJB...
__________________
suerte
y hasta la proxima
SI TUX QUIERE!!!!

Hernán Casadesús
Herac Team Leader
  #9 (permalink)  
Antiguo 25/10/2005, 07:24
Avatar de hernux  
Fecha de Ingreso: agosto-2001
Ubicación: Buenos Aires, Argentina
Mensajes: 37
Antigüedad: 22 años, 8 meses
Puntos: 0
Estaba pensando en lo que dice greeneyed:

"dado que hay bases de datos que no son capaces de contar cuantos registros devuelve una consulta"

tal vez yo lo hacia utilizando los metodos de la implementación y no de la interfaz.. o sea, casteando el Resultset a una clase y sacando de ahi.. claro que esto no es lo mejor porque te atas a una base haciendo poco portable el codigo...

Sin embargo, tambien tengo que destacar con respecto a esto: "hasta haberlos recuperado todos" ... eso es completamente cierto, y hasta donde yo se, ninguna base de datos puede calcular la cantidad de resultados antes de tenerlos todos, por eso es que solo podes conocer la cantidad si utilizas un puntero dinamico o estatico, pero no forwardonly, donde se van bajando los registros a medida que se los necesita.
__________________
suerte
y hasta la proxima
SI TUX QUIERE!!!!

Hernán Casadesús
Herac Team Leader
  #10 (permalink)  
Antiguo 25/10/2005, 09:56
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Correcto. Yo sólo decía que usando JDBC puro no se puede, de la misma forma que usando JDBC1.0 puro no debias leer cada columna más de una vez y en el orden en el que salian, por que hay bases de datos que de otra forma no lo soportan y cascan. Como bases de datos que solo soportan cursores del tipo "forward_only", etc.

Sabiendo que base de datos vas a usar, pues es más fácil y puedes hacer más cosas, pero si te ciñes al JDBC puro, pues hay más restricciones.
  #11 (permalink)  
Antiguo 25/10/2005, 13:21
Avatar de hernux  
Fecha de Ingreso: agosto-2001
Ubicación: Buenos Aires, Argentina
Mensajes: 37
Antigüedad: 22 años, 8 meses
Puntos: 0
por esto es que prefiero usar DAO
__________________
suerte
y hasta la proxima
SI TUX QUIERE!!!!

Hernán Casadesús
Herac Team Leader
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 22:54.