java.sql.SQLException:在开始结果集之前

我已经尝试了以下代码来检索存储在数据库中的图像。 我创建了一个名为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(); } } 

运行上面的代码时出现以下exception:

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

这是怎么造成的,如何解决?

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

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

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

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

一旦你执行了select查询就会获得ResultSet对象,然后迭代它就不会得到这个exception。 ResultSet rs = null;

rs = statement.executeQuery(“select UUID_BINARY()”);

  if(rs.next()){ newTripUUID = rs.getBytes(1); }