web-dev-qa-db-fra.com

java.sql.SQLException: avant le début du jeu de résultats

J'ai essayé le code suivant pour récupérer une image stockée dans une base de données. J'ai créé une base de données appelée image_db qui contient une table appelée image_details. La table a deux champs, id et image_path et les deux sont de type mediumblob. J'ai stocké quelques images dans le champ image_path sous forme binaire. Maintenant, je veux récupérer et l'afficher.

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

    }
}

Je reçois l'exception suivante lors de l'exécution du code ci-dessus:

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)

Comment cela est-il causé et comment puis-je le résoudre?

21
nidheesh

Vous devez appeler rs.next () (et vérifier qu'il renvoie true) pour accéder à la première ligne du jeu de résultats:

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

De plus, l'index ne doit pas être 1, car votre requête ne sélectionne qu'une colonne.

Je ne comprends pas non plus le point de convertir un int en caractère. La méthode prend un int en argument. Une conversion d'octet serait au moins logique, mais les octets et les caractères ne sont pas la même chose en Java.

50
JB Nizet

Une fois que vous exécutez la requête sélectionnée, vous obtiendrez un objet ResultSet, puis répétez-la, vous n'obtiendrez pas cette exception . ResultSet rs = null;

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

        if(rs.next()){

            newTripUUID = rs.getBytes(1);

        }
1
NarayanaReddy