Retroceder   Foros del Web > Programación para sitios web > Java y JSP

Respuesta
 
Herramientas Desplegado
Antiguo 23-nov-2005, 11:27   #1 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
JAVA y SQL

Hola , un par de preguntas varias sobre JVA y SQL, me gustaria saber si existen y cuales son las tipicas funciones que podemos encontrar cuando trabajamos con bbdd en otros lenguajes como PHP por ejemplo.

¿Existen las funciones de:
- Ultimo identificador insertado?
- obtencion de la fecha?
- saber el numero de registro que devuelva una query?


Por cierto , yo en php tenia montada una función a la que le pasaba la query, la ejecutaba y me devolvia el resultado en caso de ser un select, lo intento hacer en java de la siguiente forma:

public ResultSet BBDD(String query){
try{...
conn = DriverManager.getConnection (url, user, pass);
Statement stmt = conn.createStatement() ;
String query = "SELECT * FROM ACTOS" ;
ResultSet rs = stmt.executeQuery(query) ;
catch{...}
}
}

y no me deja devolver el resultSet rs

¿Alguien tiene alguna idea?

Muchas gracias por todo.
OrionKing está desconectado   Responder Citando
Antiguo 23-nov-2005, 12:38   #2 (permalink)
MikiBroki está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Mensajes: 848
Es que tienes mal el try..catch

public ResultSet BBDD(String query)
{
try{
...
conn = DriverManager.getConnection (url, user, pass);
Statement stmt = conn.createStatement() ;
String query = "SELECT * FROM ACTOS" ;
ResultSet rs = stmt.executeQuery(query) ;
}
catch(SQLException e)
{
}

}
__________________
Aprendiz en mucho, maestro en nada.
Si por cada solución recibida aportas otra, ganamos todos.
MikiBroki está desconectado   Responder Citando
Antiguo 24-nov-2005, 00:59   #3 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
Perdon... el try catch lo tengo bien solo que al copy pastear me he debido liar

try{
conn = DriverManager.getConnection (url, user, pass);
Statement stmt = conn.createStatement() ;
String query = "SELECT * FROM ACTOS" ;
ResultSet rs = stmt.executeQuery(query) ;
stmt.close();
conn.close();

}catch (SQLException ex) {
System.out.println("ERROR en consulta SQL.");
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());

} catch (ClassNotFoundException e){
System.out.println("Error de conexión :(");

}


pues eso , que soy un torpe...

Pero no puedo devolver el ResultSet.


Por cierto,
¿Existen las funciones de:
- Ultimo identificador insertado?
- obtencion de la fecha?
- saber el numero de registro que devuelva una query?

O las he de motar a mano

Última edición por OrionKing; 24-nov-2005 a las 01:04.
OrionKing está desconectado   Responder Citando
Antiguo 24-nov-2005, 07:39   #4 (permalink)
goncafa ha deshabilitado el karma
 
Avatar de goncafa
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.135
Enviar un mensaje por MSN a goncafa
Y donde ahces el return??

No lo veo ni el primer ni segundo codigo.

Por lo que veo ademas defines el ResultSet dentro del bloque try, lo que lo limita a ese ambito.

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
goncafa está desconectado   Responder Citando
Antiguo 24-nov-2005, 08:29   #5 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
Tienes toda la razon del mundo , pero lo quiero dentro del try para que me capture la excepcion en caso de error en la sentencia SQL.

Voy a provar de meter fuera lo del ResultSet a ver que tal.

Hasta pronto

Por cierto y por si a alguien le sirve de ayuda pra formatear la fecha a tu medida se hace así:

formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
fecha = new Date();
Result = formatter.format(fecha);


Ahora solo me queda el ultimo id insertado, es decir como se hace en java lasiguiente sentencia en PHP:
$ultimo_id = mysql_insert_id($conn);

Muchas gracias por la ayuda.

Última edición por OrionKing; 24-nov-2005 a las 08:51.
OrionKing está desconectado   Responder Citando
Antiguo 24-nov-2005, 09:41   #6 (permalink)
goncafa ha deshabilitado el karma
 
Avatar de goncafa
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.135
Enviar un mensaje por MSN a goncafa
Si quieres capyuarar las excepciones que pueda enviar tu ResultSet seria asi

Código PHP:
ResultSet rs null;

try {
    
conn DriverManager.getConnection (urluserpass);
    
Statement stmt conn.createStatement() ;
    
String query "SELECT * FROM ACTOS" ;
    
rs stmt.executeQuery(query);
} catch(
Exception e) {
    
rs null;
}

return 
rs
Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
goncafa está desconectado   Responder Citando
Antiguo 24-nov-2005, 10:07   #7 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
Hey muchas gracias

Ahora mismo lo pruebo.

POr cierto para capturar el ultimo id insertado he escrito el siguiente codigo.

PreparedStatement SlastID = conn.prepareStatement("SELECT LAST_INSERT_ID()");

while (lastID.next()){
questionID = lastID.getInt(1);
}

Pero me devuelve un 0.
y no el ultimo id insertado.

Ya empiezo a desesperar

Muchas gracias por la ayuda.
OrionKing está desconectado   Responder Citando
Antiguo 24-nov-2005, 10:15   #8 (permalink)
goncafa ha deshabilitado el karma
 
Avatar de goncafa
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.135
Enviar un mensaje por MSN a goncafa
Falta la linea donde ejcutas la query.

Código PHP:
lastID SlastID.executeQuery(); 
Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
goncafa está desconectado   Responder Citando
Antiguo 24-nov-2005, 10:34   #9 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
DIOOOOOSSSS!!!!! que torpe he vuelto a copy pastear maaaaallll!!!!!


Si que lo tenia puesto pero me da 0
try{...
conn = DriverManager.getConnection (url, user, pass);
Statement stmt = conn.createStatement() ;
retorno=stmt.executeUpdate(query) ;
PreparedStatement SlastID = conn.prepareStatement("SELECT LAST_INSERT_ID() ");
System.out.println("LLega aqui conn ");
ResultSet lastID = SlastID.executeQuery();
System.out.println("LLega aqui resultset ");

while (lastID.next()){
questionID = lastID.getInt(1);
System.out.println("entroooo ");
}

System.out.println("LLega aqui ");
System.out.println("ulti "+ questionID);
stmt.close();
conn.close();
}catch (SQLException ex) {
System.out.println("ERROR en consulta SQL.");
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());

} catch (ClassNotFoundException e){

System.out.println("error :(");

}
return retorno;

Ya no se que mirar
OrionKing está desconectado   Responder Citando
Antiguo 24-nov-2005, 10:44   #10 (permalink)
goncafa ha deshabilitado el karma
 
Avatar de goncafa
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.135
Enviar un mensaje por MSN a goncafa
mmm

Prueba a cambiar esta sentencia SQL

SELECT LAST_INSERT_ID()

por esta

SELECT LAST_INSERT_ID() AS LASTID

Si asi tampoco funciona, trata de decirle a que tabla quieres rescatar su ultimo ID asi


SELECT LAST_INSERT_ID() FROM NOMBRE_TABLA

donde NOMBRE_TABLA es la tabla que te interesa saber de su ultimo id.

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo

Última edición por goncafa; 24-nov-2005 a las 10:53.
goncafa está desconectado   Responder Citando
Antiguo 24-nov-2005, 11:05   #11 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141


Muy bien, me ha ido perfecto, muchas gracias de verdad.

Hasta pronto Y por cierto... mañana POR FIN ES VIERNES!
OrionKing está desconectado   Responder Citando
Antiguo 24-nov-2005, 14:02   #12 (permalink)
GreenEyed tiene algunos puntos positivos de karma
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.515
Por refinarlo un poco, el tratamiento de las excepciones que tienes no es correcto, puesto que si te da una excepcion SQL no cierras la conexión.

GreenEyed está desconectado   Responder Citando
Antiguo 25-nov-2005, 02:01   #13 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
Es verdad . Ademas cuando devulevo el ResultSet tampoco la cierro por que si lo hago cuando intento recorrer el recordset me dice que intento acceder despues de cerrar.... ¿Como lo hago para cerrarla despues de leer si leo despues de salir?

Public ResultSet selecciona(String query){
ResultSet rs = null;
try{
.....
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection (url, user, pass);
Statement stmt = conn.createStatement() ;
rs=stmt.executeQuery(query) ;

//stmt.close(); Si cierro aqui cuando intento recuperar el resultset
//conn.close(); me dice que no puede pq lo he cerrado

}catch (SQLException ex) {
System.out.println("ERROR en consulta SQL.");
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());

} catch (ClassNotFoundException e){

System.out.println("Error");

}
return rs;
}


LA llamo aqui:

Res=basePortada.selecciona(query4);


while ( Res.next()) {
int i1 = Res.getInt("IDAnun") ;
int id = Res.getInt("_idregistro") ;
String s2 = Res.getString("Nombre") ;
System.out.println("NUm anun: "+ i1 + " nombre" + s2 + " Idregistro: " + id) ;
}

Lo hace bien pero no cierro nada.
La verdad es que no se me ocurre como cerrarla despues de leer.
¿Paso tambien la conexion y la cierro a mano o o lo dejo en manos del garabgecolector?



Asias


Última edición por OrionKing; 25-nov-2005 a las 02:22.
OrionKing está desconectado   Responder Citando
Antiguo 25-nov-2005, 04:18   #14 (permalink)
GreenEyed tiene algunos puntos positivos de karma
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.515
Mensaje

La conexión la deberias mantener abierta mientras usas el ResultSet, asi que el esquema asi como lo tienes no es muy fiable. Y las conexiones a base de datos NUNCA deben dejarse en manos del Garbage Collector, NUNCA .
Lo habitual es un pseudo-codigo tal que asi
Código:
Connection theConnection = null;
try
{
  theConnection = // obtener conexion
  theConnection.setAutoCommit(false);
  ... // Trabajar con conexion
  theConnection.commit();
}
catch(Exception e)
{
 if(theConnection!=null)
 {
  try
  {
   theConnection.rollback()
  }
  catch(SQLException e)
  {
   // Informar de error haciendo rollback
   // BDD podría quedar inconsistente así 
   // que es un error GRAVE
  }
 }
}
finally
{
 // Aqui cerramos los result set, statements
 // o demas objetos dependientes de la conexion
 // Siempre dentro de su propio try/catch, como
 // el de la conexion
 if(theConnection!=null)
 {
  try
  {
   theConnection.close()
  }
  catch(SQLException e)
  {
   // Informar de error cerrando conexion
   // La conexión podría quedar abierta así
   // que es un error GRAVE
  }
 }
}
Este codigo incluye tratamiento de transacciones, que a veces se puede obviar (si haces solo un select, por ejemplo). Y lo habitual es copiar todos los resultados del ResultSet en un vector, cerrar el ResultSet, cerrar la conexión y despues devolver el Vector (o List). Esa es la forma más segura y con el codigo de arriba bien escrito, no se te queda una conexión o resultset abierto de ninguna forma.

En una aplicación web que tiene que estar ejecutandose 24h al dia sin parar y recibiendo muchas peticiones con posibles fallos temporales en la red etc... es muy importante hacerlo como toca o acabas creando demasiadas conexiones, dejando cursores abiertos o similares y entonces pum

Nota: El código de arriba lo he hecho de cabeza, asi que no es de extrañar que haya algun error por el que no compile o así, pero tampoco voy a hacerlo todo
GreenEyed está desconectado   Responder Citando
Antiguo 28-nov-2005, 02:22   #15 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
Una pregunta , para devolver el ResultSet en un Array o lista en lugar del ResultSet, que estructura utilizarias? Hay algun metodo que lo haga o he de generar el codigo a mano?

Es que soy nuevo en java y hay un millon de metodos... bueno no tantos leí que 15.000


Gracias
OrionKing está desconectado   Responder Citando
Antiguo 28-nov-2005, 04:26   #16 (permalink)
GreenEyed tiene algunos puntos positivos de karma
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.515
Para devolver en lugar del ResultSet.... pues depende de lo que vayas a usar y que informacion a pasar. Si solo vas a pasar una lista de valores y la vas a recorrer toda, pues un List, si devuelves un par de valores y uno esta indexado... un Map... si devuelves valores más complejos, entonces lo suyo es hacer un objeto complejo por cada fila y devolver un List o Map de los objetos complejos.

Depende mucho de cada situación. Aunque yo ultimamente uso Hibernate y no manejo los resultset directamente, así que alguien que si lo haga quizá te pueda decir más.
GreenEyed está desconectado   Responder Citando
Antiguo 28-nov-2005, 06:19   #17 (permalink)
goncafa ha deshabilitado el karma
 
Avatar de goncafa
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.135
Enviar un mensaje por MSN a goncafa
Vectores

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
goncafa está desconectado   Responder Citando
Antiguo 30-nov-2005, 09:23   #18 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
Hola a todos . Una pregunta:
¿Alguien sabe como se escapan las comillas en java hay alguna función que lo haga?

Gracias.
OrionKing está desconectado   Responder Citando
Antiguo 30-nov-2005, 09:40   #19 (permalink)
goncafa ha deshabilitado el karma
 
Avatar de goncafa
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.135
Enviar un mensaje por MSN a goncafa
con backslash \ ese es el simbolo de escape de cualquier caracter especial como las comillas simples o dobles. \' \" \\ etc

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
goncafa está desconectado   Responder Citando
Antiguo 30-nov-2005, 11:31   #20 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
Ya, pero al intentar sustituir " ' " por " \' " me ignora
utilizo pepe.replaceall(" ' "," \' ") pero me deja igual la cadena.

He visto que el primer parametro es una expresion regular y le paso el caracer ' y lo sustituyo por \' pero me ignora

En la definicion de expresiones regulares que viene como ayuda en el beans he visto que le puedo pasar un caracter...nu se.

¿Que hago mal?

Hasta pronto.
OrionKing está desconectado   Responder Citando
Antiguo 30-nov-2005, 12:11   #21 (permalink)
goncafa ha deshabilitado el karma
 
Avatar de goncafa
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.135
Enviar un mensaje por MSN a goncafa
Utiliza sentencias SQL precompiladas con PreparedStatement, con eso te olvidas de las comillas y todo eso, la API JDBC se encarga de ahcerlo por ti, y de acuerdo al motor de base de datos que usas, pues no en todos se escapan los caracteres especiales de igual manera.

por ejemplo, si tienes esto.
Código PHP:
String nombre "O'rian";
String sql "INSERT INTO TABLA (NOMBRE) VALUES ('" nombre "')";
con.createStatement().execute(sql); 
Ese codigo te daria error por que O'rian tiene una comilla simple y la sentencia SQL se hecharia a perder, por ende, deberias escapas esa comilla o reemplazarla por otro caracter. Sin embargo si usas sentencia precompiladas como esta.

Código PHP:
String nombre "O'rian";
String sql "INSERT INTO TABLA (NOMBRE) VALUES (?)";
PreparedStatement pstm con.preparedStatement(sql);
pstm.insertString(1nombre);
pstm.execute(); 
Ese codigo no dara ningun problema, es la API JDBC quien se encarga de todo el trabajo duro y te olvidas de los caracteres de escape.

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
goncafa está desconectado   Responder Citando
Antiguo 01-dic-2005, 04:53   #22 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
Muchas gracias. El JAVA tiene de todo
OrionKing está desconectado   Responder Citando
Antiguo 05-dic-2005, 02:47   #23 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
Hola he estado mirando:

String nombre = "O'rian";
String sql = "INSERT INTO TABLA (NOMBRE) VALUES (?)";
PreparedStatement pstm = con.preparedStatement(sql);
pstm.insertString(1, nombre);
pstm.execute();

y la sentencia pstm.insertString(1, nombre); no existe, ¿he hecho algo incorrecto?
OrionKing está desconectado   Responder Citando
Antiguo 05-dic-2005, 02:54   #24 (permalink)
OrionKing ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2005
Mensajes: 141
POr cierto tengo errores a la hora de leer los RsultSets de las querys a causa de los acentos , ya que me los muestra como simbolos extraños, ¿como puedo solucionar este error?


El codigo que hago servir es el siguiente:

Statement stmt2 = conn.createStatement() ;
String query = "SELECT * FROM poblacion_fc order by idPoblacion" ;
ResultSet rs = stmt2.executeQuery(query) ;

while ( rs.next()) {

int idProv = rs.getInt("idProvincia") ;
String s2 = rs.getString("Poblacion") ;
int idPob= rs.getInt("idPoblacion") ;
}

He leído por ahí que a lo mejor es un problema del mapa de caracteres de JAVA, pero no se como ponerlo en castellano, ni donde mirar para saber cual tengo, ni si es es ese realmente el problema, empiezo a despesperar.

Gracias a todos

Última edición por OrionKing; 05-dic-2005 a las 03:14.
OrionKing está desconectado   Responder Citando
Antiguo 05-dic-2005, 05:51   #25 (permalink)
goncafa ha deshabilitado el karma
 
Avatar de goncafa
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile