2012-01-11 19 views
19

Tôi đã thử đoạn mã sau để truy xuất hình ảnh được lưu trữ trong cơ sở dữ liệu. Tôi đã tạo một cơ sở dữ liệu có tên là image_db có chứa một bảng gọi là image_details. Bảng có hai trường, idimage_path và cả hai loại là mediumblob. Tôi đã lưu trữ một vài hình ảnh trong trường image_path dưới dạng nhị phân. Bây giờ tôi muốn truy xuất & hiển thị nó.java.sql.SQLException: Trước khi bắt đầu tập kết quả

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

    } 
} 

tôi nhận được ngoại lệ sau khi chạy đoạn code trên:

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) 

như thế nào điều này gây ra và làm thế nào tôi có thể giải quyết nó?

Trả lời

47

Bạn phải gọi rs.next() (và kiểm tra xem nó trả về true) để truy cập hàng đầu tiên của tập kết quả:

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

Cũng không phải là chỉ số nên là 1, từ truy vấn của bạn chỉ chọn một cột.

Tôi cũng không hiểu điểm khi truyền int vào char. Phương thức này lấy int làm đối số. Một phép đúc thành byte sẽ ít nhất là hợp lý, nhưng các byte và char không giống nhau trong Java.

+0

Cảm ơn @JB Nizet.it worked.But tôi sử dụng một phương pháp khác nhau để đọc và hiển thị hình ảnh như: – nidheesh

+0

i sử dụng ResultSet.getBytes() phương pháp để đọc các hình ảnh và 'Image img = Toolkit.getDefaultToolkit () .createImage (imagedata); ' phương pháp để tạo ra hình ảnh. Sau đó tôi đã sử dụng một khung mới để hiển thị hình ảnh bằng cách thiết lập kích thước của nó để kích thước hình ảnh bằng phương pháp setPrefferedSize. Bây giờ tôi muốn hiển thị hình ảnh được lưu trữ trong cơ sở dữ liệu như một gallery.Is có bất kỳ phương pháp thuận tiện cho làm điều đó ??? – nidheesh

1

Một khi nếu bạn thực hiện truy vấn chọn sẽ nhận được đối tượng ResultSet sau đó lặp lại nó, bạn sẽ không nhận được ngoại lệ này. ResultSet rs = null;

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

 if(rs.next()){ 

      newTripUUID = rs.getBytes(1); 

     } 
Các vấn đề liên quan