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

Problema actualizando campos blob

Estas en el tema de Problema actualizando campos blob en el foro de Java en Foros del Web. Hola a todos. Tengo una base de datos MySql con un campo varchar que guarda una ruta de una imagen. Queria agregar un campo blob ...
  #1 (permalink)  
Antiguo 06/11/2008, 17:40
 
Fecha de Ingreso: noviembre-2008
Mensajes: 115
Antigüedad: 15 años, 5 meses
Puntos: 4
Problema actualizando campos blob

Hola a todos.

Tengo una base de datos MySql con un campo varchar que guarda una ruta de una imagen. Queria agregar un campo blob que guardara la imagen en si, por lo que agregue el campo y trataba de actualizarlo desde java, pero me da un error diciendo que el resultset no es actualizable, pero si lo es, por que probe a borrar una fila y lo hace. Ya lei el api que me dice el error, pero no encontre nada que me ayude. Decir que el campo fotoAutor ahora mismo es null en todas las filas. Os dejo el codigo que uso y el error que me da a ver si encontramos que es lo que esta mal

Muchas gracias por adelantado

public void blob(){
InputStream inputImage = null;
try {
Class.forName("com.mysql.jdbc.Driver").newInstance ();
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/biblioteca", "root", "josue");
Statement sentencia = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
String sql = "SELECT * FROM autor";
ResultSet rs = sentencia.executeQuery(sql);
// rs.last();
// rs.deleteRow();
while(rs.next()){
File file = new File(rs.getString("rutaFotoAutor"));
inputImage = new FileInputStream(file);
rs.updateBlob("fotoAutor", inputImage);
rs.updateRow();
}
} catch (InstantiationException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
} catch (FileNotFoundException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
} finally {
try {
inputImage.close();
} catch (IOException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
}
}
}

com.mysql.jdbc.NotUpdatable: Result Set not updatable.This result set must come from a statement that was created with a result set type of ResultSet.CONCUR_UPDATABLE, the query must select only one table, can not use functions and must select all primary keys from that table. See the JDBC 2.1 API Specification, section 5.6 for more details.This result set must come from a statement that was created with a result set type of ResultSet.CONCUR_UPDATABLE, the query must select only one table, can not use functions and must select all primary keys from that table. See the JDBC 2.1 API Specification, section 5.6 for more details.
  #2 (permalink)  
Antiguo 07/11/2008, 16:32
 
Fecha de Ingreso: noviembre-2008
Mensajes: 115
Antigüedad: 15 años, 5 meses
Puntos: 4
Respuesta: Problema actualizando campos blob

Pues ya lo solucione. Ahora mismo no se de donde saque la solucion, por que estuve cogiendo de una busqueda y otra. Por si acaso a alguien le puede servir dejo aqui el codigo de como lo hice, tanto para guardarla en la base de datos como para recuperarla despues a un fichero.

Para guardar:
public void setBlob(){
InputStream inputImage = null;
try {
OperacionesConexiones oc = new OperacionesConexiones(driver, cadenaConexion);
Connection con = oc.crearConexion(user, pass);
Statement sentencia = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
String sql = "SELECT * FROM libro";
ResultSet rs = sentencia.executeQuery(sql);
PreparedStatement pstmt = con.prepareStatement("UPDATE libro SET fotoLibro =? WHERE idLibro = ?",
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
while(rs.next()){
File file = new File(rs.getString("rutaFotoLibro"));
inputImage = new FileInputStream(file);
pstmt.setBinaryStream(1, inputImage, file.length());
pstmt.setInt(2, rs.getInt("idLibro"));
pstmt.executeUpdate();
}


} catch (FileNotFoundException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
} finally {
try {
inputImage.close();
} catch (IOException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
}
}
}

Para recuperarla

public void getBlob(){
{

FileOutputStream fichero = null;
try {
OperacionesConexiones oc = new OperacionesConexiones(driver, cadenaConexion);
Connection con = oc.crearConexion(user, pass);
Statement sentencia = con.createStatement();
String sql = "SELECT * FROM libro where idLibro=20";
ResultSet resultados = sentencia.executeQuery(sql);
while (resultados.next()) {
Blob bob = resultados.getBlob("fotoLibro");
byte[] buffer = bob.getBytes(1, (int) bob.length());
File archivoSalida = new File("imagen.jpg");
fichero = new FileOutputStream(archivoSalida);

fichero.write(buffer); //Escribimos el buffer
fichero.close();
}
} catch (IOException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
}

finally {
try {
fichero.close();
} catch (IOException ex) {
Logger.getLogger(OperacionesPersonalizadas.class.g etName()).log(Level.SEVERE, null, ex);
}
}
}

}
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 16:37.