2012-01-11 17 views
19

Ho provato il seguente codice per recuperare un'immagine memorizzata in un database. Ho creato un database chiamato image_db che contiene una tabella denominata image_details. La tabella ha due campi, id e image_path ed entrambi sono di tipo mediumblob. Ho memorizzato alcune immagini nel campo image_path come binario. Ora voglio recuperare & mostrarlo.java.sql.SQLException: Prima dell'inizio del set di risultati

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(); 

    } 
} 

ottengo la seguente eccezione quando si esegue il codice di cui sopra:

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) 

Come è causato e come posso risolverlo?

risposta

47

È necessario chiamare rs.next() (e verificare che restituisce true) per accedere alla prima riga del set di risultati:

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

Inoltre non che l'indice dovrebbe essere 1, dal momento che la query solo seleziona una colonna.

Inoltre non capisco il punto nel trasmettere l'int a un carattere. Il metodo accetta un int come argomento. Un cast to byte sarebbe almeno logico, ma byte e char non sono la stessa cosa in Java.

+0

Grazie @JB Nizet.it worked.But ho usato un metodo differente per leggere e visualizzare l'immagine come: – nidheesh

+0

ho usato ResultSet.getBytes() per leggere l'immagine e 'dell'immagine Img = Toolkit.getDefaultToolkit () .createImage (imagedata);' metodo per creare l'immagine. Poi ho usato un nuovo frame per visualizzare l'immagine impostandone le dimensioni alla dimensione dell'immagine tramite il metodo setPrefferedSize. Ora mi piacerebbe visualizzare le immagini memorizzate nel database come una galleria. C'è un metodo conveniente per facendo questo??? – nidheesh

1

Una volta eseguita la query di selezione otterrà oggetto ResultSet, quindi itererà che non otterrete questa eccezione. ResultSet rs = null;

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

 if(rs.next()){ 

      newTripUUID = rs.getBytes(1); 

     } 
Problemi correlati