2012-01-11 15 views
19

He intentado el siguiente código para recuperar una imagen almacenada en una base de datos. Creé una base de datos llamada image_db que contiene una tabla llamada image_details. La tabla tiene dos campos, id y image_path, y ambos son de tipo mediumblob. He almacenado algunas imágenes en el campo image_path como binarias. Ahora quiero recuperar & mostrarlo.java.sql.SQLException: Antes del inicio del conjunto de resultados

package cbir.imageAddition; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.*; 

enter code here 

public class ImageRetrieve { 

    public ImageRetrieve() throws SQLException, IOException, ClassNotFoundException 
    { 

     Connection con = null; 
     Statement st = null; 
     ResultSet rs = null; 
     String url = "jdbc:mysql://localhost:3306/"; 
     String db = "image_db"; 
     String driver = "com.mysql.jdbc.Driver"; 
     String user = "root"; 
     String pass = "root"; 

      Class.forName(driver); 
      con = DriverManager.getConnection(url + db, user, pass); 
      //System.out.println("Connection url : "+url + db); 

      st = con.createStatement(); 
      String sql = "select image_path from image_details where id=1"; 
      rs = st.executeQuery(sql); 

    InputStream stream = rs.getBinaryStream(2); 
    ByteArrayOutputStream output = new ByteArrayOutputStream(); 
    int a1 = stream.read(); 
    while (a1 >= 0) { 
     output.write((char) a1); 
     a1 = stream.read(); 
    } 
    Image myImage = Toolkit.getDefaultToolkit().createImage(output.toByteArray()); 
    output.close(); 

    } 
} 

tengo la siguiente excepción cuando se ejecuta el código anterior:

awtJan 12, 2012 12:55:48 AM cbir.imageAddition.add_image_window jButton5ActionPerformed 
SEVERE: null 
java.sql.SQLException: Before start of result set 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) 
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841) 
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5650) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5610) 
    at cbir.imageAddition.ImageRetrieve.<init>(ImageRetrieve.java:49) 
    at cbir.imageAddition.add_image_window.jButton5ActionPerformed(add_image_window.java:280) 
    at cbir.imageAddition.add_image_window.access$400(add_image_window.java:26) 
    at cbir.imageAddition.add_image_window$5.actionPerformed(add_image_window.java:89) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6504) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6269) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4860) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4686) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2713) 
    at java.awt.Component.dispatchEvent(Component.java:4686) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:680) 
    at java.awt.EventQueue$4.run(EventQueue.java:678) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:677) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java..EventDispatchThread.run(EventDispatchThread.java:90) 

cómo es esto provocó y cómo puedo solucionarlo?

Respuesta

47

Debe llamar rs.next() (y comprobar que devuelve verdadero) para acceder a la primera fila del conjunto de resultados:

if (rs.next() { 
    InputStream stream = rs.getBinaryStream(1); 
    ... 

Además, no es que el índice debe ser de 1, ya que su consulta sólo selecciona una columna

Tampoco entiendo el sentido de convertir el int a un char. El método toma un int como argumento. Un molde a byte sería al menos lógico, pero los bytes y char no son lo mismo en Java.

+0

Gracias @JB Nizet.it worked.But i utiliza un método diferente para leer y mostrar la imagen como: – nidheesh

+0

i utilizado ResultSet.getBytes() para leer la imagen y 'Image img = Toolkit.getDefaultToolkit () .createImage (imagedata); ' Método para crear una imagen. Luego, utilicé un nuevo marco para mostrar la imagen al establecer su tamaño en el tamaño de la imagen mediante el método setPrefferedSize. Ahora me gustaría mostrar las imágenes almacenadas en la base de datos como una galería. ¿Hay algún método conveniente para ¿¿¿haciendo eso??? – nidheesh

1

Una vez que ejecute la consulta de selección obtendrá el objeto ResultSet y luego lo repetirá, no obtendrá esta excepción. ResultSet rs = null;

rs = statement.executeQuery ("seleccionar UUID_BINARY()");

 if(rs.next()){ 

      newTripUUID = rs.getBytes(1); 

     } 
Cuestiones relacionadas