2012-01-11 106 views
19

我试过以下代码来检索存储在数据库中的图像。我创建了一个名为image_db的数据库,其中包含一个名为image_details的表。该表有两个字段,idimage_path,都是mediumblob类型。我在image_path字段中存储了几个图像作为二进制。现在我想检索&显示它。java.sql.SQLException:在开始结果集之前

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) 

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

回答

47

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

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

也不该指数应该是1,因为你的查询只选择一列。

我也不明白将int转换为char的意思。该方法采用int作为参数。强制转换为字节至少是逻辑的,但字节和字符在Java中不是同一个东西。

+0

由于@JB Nizet.it worked.But我用不同的方法来读取并显示为图像: – nidheesh 2012-01-12 17:52:36

+0

我用ResultSet.getBytes()方法来读出的图像和“图片IMG = Toolkit.getDefaultToolkit( ).createImage(图象 - );”方法来创建图像。然后我使用了一个新的框架来显示图像,通过将其大小设置为图像大小通过setPrefferedSize方法。现在我想显示存储在数据库中的图像作为gallery.Is有任何方便的方法这样做? – nidheesh 2012-01-12 18:19:44

1

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

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

 if(rs.next()){ 

      newTripUUID = rs.getBytes(1); 

     } 
相关问题