java.sql.SQLException:结果集开始之前[重复]

Posted

技术标签:

【中文标题】java.sql.SQLException:结果集开始之前[重复]【英文标题】:java.sql.SQLException: Before start of result set [duplicate] 【发布时间】:2012-02-08 05:17:48 【问题描述】:

我已尝试使用以下代码检索存储在数据库中的图像。我创建了一个名为image_db 的数据库,其中包含一个名为image_details 的表。该表有两个字段,idimage_path,两者都是mediumblob 类型。我在image_path 字段中存储了一些图像作为二进制文件。现在我想检索并显示它。

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

    

运行上述代码时出现以下异常:

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)

这是怎么引起的,我该如何解决?

【问题讨论】:

【参考方案1】:

您必须调用 rs.next()(并检查它是否返回 true)才能访问结果集的第一行:

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

也不是索引应该是 1,因为您的查询只选择一列。

我也不明白将 int 转换为 char 的意义。该方法将 int 作为参数。转换为字节至少是合乎逻辑的,但字节和字符在 Java 中不是一回事。

【讨论】:

感谢@JB Nizet。它起作用了。但我使用不同的方法来读取和显示图像: 我使用 ResultSet.getBytes() 方法读取图像和 'Image img = Toolkit.getDefaultToolkit().createImage(imagedata);'创建图像的方法。然后我使用新框架通过 setPreferedSize 方法将其大小设置为图像大小来显示图像。现在我想将存储在数据库中的图像显示为画廊。有什么方便的方法这样做???【参考方案2】:

如果您执行选择查询,您将获得一个 ResultSet 对象。遍历它,你不会得到这个异常。

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

        if(rs.next())

            newTripUUID = rs.getBytes(1);

        

【讨论】:

以上是关于java.sql.SQLException:结果集开始之前[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:结果集开始之前[重复]

我在尝试从其他方法访问此返回的 resultSetCustomer. 时收到错误“java.sql.SQLException:结果集结束后”

java连接Oracle数据库,从ResultSet中提取数据出现java.sql.sqlException结果集已耗尽

oracle数据库java.sql.SQLException: 结果集已耗尽,总是跳不出while(rs.next())循环,请求高手帮忙解决!

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标