webentwicklung-frage-antwort-db.com.de

java.sql.SQLException: Vor dem Start der Ergebnismenge

Ich habe den folgenden Code zum Abrufen eines in einer Datenbank gespeicherten Bildes ausprobiert. Ich habe eine Datenbank mit dem Namen image_db erstellt, die eine Tabelle mit dem Namen image_details enthält. Die Tabelle hat zwei Felder, id und image_path, und beide sind vom Typ mediumblob. Ich habe ein paar Bilder im image_path-Feld als binär gespeichert. Jetzt möchte ich es abrufen und anzeigen.

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

    }
}

Ich bekomme die folgende Ausnahme, wenn Sie den obigen Code ausführen:

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)

Wie wird das verursacht und wie kann ich es lösen?

21
nidheesh

Sie müssen rs.next () aufrufen (und prüfen, ob es true zurückgibt), um auf die erste Zeile der Ergebnismenge zuzugreifen:

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

Außerdem sollte der Index nicht 1 sein, da Ihre Abfrage nur eine Spalte auswählt.

Ich verstehe auch nicht den Punkt, wenn ich das Int auf einen Char verwende. Die Methode nimmt ein Int als Argument an. Eine Umwandlung in Byte wäre zumindest logisch, aber Bytes und Zeichen sind in Java nicht dasselbe.

50
JB Nizet

Sobald Sie die Auswahlabfrage ausführen, wird das ResultSet-Objekt abgerufen, und es iteriert dann, dass Sie diese Ausnahme nicht mehr erhalten ResultSet rs = null;

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

        if(rs.next()){

            newTripUUID = rs.getBytes(1);

        }
1
NarayanaReddy