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

JAVA y SQL

Estas en el tema de JAVA y SQL en el foro de Java en Foros del Web. Hola , un par de preguntas varias sobre JVA y SQL, me gustaria saber si existen y cuales son las tipicas funciones que podemos encontrar ...
  #1 (permalink)  
Antiguo 23/11/2005, 12:27
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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.
  #2 (permalink)  
Antiguo 23/11/2005, 13:38
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
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)
{
}

}
  #3 (permalink)  
Antiguo 24/11/2005, 01:59
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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/11/2005 a las 02:04
  #4 (permalink)  
Antiguo 24/11/2005, 08:39
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
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
  #5 (permalink)  
Antiguo 24/11/2005, 09:29
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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/11/2005 a las 09:51
  #6 (permalink)  
Antiguo 24/11/2005, 10:41
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
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
  #7 (permalink)  
Antiguo 24/11/2005, 11:07
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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.
  #8 (permalink)  
Antiguo 24/11/2005, 11:15
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
Falta la linea donde ejcutas la query.

Código PHP:
lastID SlastID.executeQuery(); 
Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
  #9 (permalink)  
Antiguo 24/11/2005, 11:34
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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
  #10 (permalink)  
Antiguo 24/11/2005, 11:44
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
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/11/2005 a las 11:53
  #11 (permalink)  
Antiguo 24/11/2005, 12:05
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0


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

Hasta pronto Y por cierto... mañana POR FIN ES VIERNES!
  #12 (permalink)  
Antiguo 24/11/2005, 15:02
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
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.

  #13 (permalink)  
Antiguo 25/11/2005, 03:01
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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/11/2005 a las 03:22
  #14 (permalink)  
Antiguo 25/11/2005, 05:18
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
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
  #15 (permalink)  
Antiguo 28/11/2005, 03:22
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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
  #16 (permalink)  
Antiguo 28/11/2005, 05:26
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
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.
  #17 (permalink)  
Antiguo 28/11/2005, 07:19
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
http://www.forosdelweb.com/showpost....39&postcount=2

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
  #18 (permalink)  
Antiguo 30/11/2005, 10:23
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Hola a todos . Una pregunta:
¿Alguien sabe como se escapan las comillas en java hay alguna función que lo haga?

Gracias.
  #19 (permalink)  
Antiguo 30/11/2005, 10:40
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
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
  #20 (permalink)  
Antiguo 30/11/2005, 12:31
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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.
  #21 (permalink)  
Antiguo 30/11/2005, 13:11
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
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
  #22 (permalink)  
Antiguo 01/12/2005, 05:53
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Muchas gracias. El JAVA tiene de todo
  #23 (permalink)  
Antiguo 05/12/2005, 03:47
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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?
  #24 (permalink)  
Antiguo 05/12/2005, 03:54
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
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/12/2005 a las 04:14
  #25 (permalink)  
Antiguo 05/12/2005, 06:51
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
Sorry, fue erro mio, el metodo es setString no insertString

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
  #26 (permalink)  
Antiguo 07/12/2005, 03:52
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Hola a todos , espero que todavia haya alguien por ahí que no tenga puente... como yo mas que nada para que me pueda responder una duda.

Al realizar setString me da un error, me dice que no hay parametros predefinidos, la excepcion asociada es la siguiente:
SQLException: No parameters defined during prepareCall()
SQLState: S1009
VendorError: 0


Codigo:(me muestra hasta el antes2)

String inserta = "INSERT INTO poblaciones (id_provincia,nombre,CP) VALUES ("+idProv+",'"+s2+"','"+CodiP+"')";

System.out.println("antes1");
PreparedStatement pstm = conn2.prepareStatement(inserta);
System.out.println("antes2");

pstm.setString(2, s2);
System.out.println("antes3");
pstm.execute();
System.out.println("despues");


Nu se que puede ser.
Gracias por todo.
  #27 (permalink)  
Antiguo 07/12/2005, 05:05
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Pues lo que dice el error . En esa consulta no tienes ningun parametro pre-definido si no que le estas concatenando los valores.

Repasate como funcionan los PreparedStatement, que me parece que no te ha quedado muy claro.
http://java.sun.com/j2se/1.4.2/docs/...Statement.html
http://www.programacion.com/bbdd/tut...bc/8/#prepared
  #28 (permalink)  
Antiguo 07/12/2005, 05:43
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Tienes razon la verdad es que no tengo ni idea de como van , muchas gracias, ahora me los miro
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

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 05:22.