2012-01-11 24 views
19

मैंने डेटाबेस में संग्रहीत छवि को पुनर्प्राप्त करने के लिए निम्न कोड का प्रयास किया है। मैंने image_db नामक डेटाबेस बनाया है जिसमें image_details नामक एक तालिका शामिल है। तालिका में दो फ़ील्ड हैं, id और image_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 कॉल करना होगा() (और जाँच लें कि यह सच रिटर्न) परिणाम सेट की पहली पंक्ति तक पहुँचने के लिए:

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

भी नहीं है कि सूचकांक 1 होना चाहिए, आपकी क्वेरी के बाद से ही एक कॉलम का चयन करता है।

मैं भी चार को int कास्टिंग करने में बिंदु को समझ नहीं पा रहा हूं। विधि तर्क के रूप में एक int लेता है। बाइट के लिए एक कलाकार कम से कम तार्किक होगा, लेकिन बाइट्स और चार जावा में एक ही चीज़ नहीं हैं।

+0

धन्यवाद @JB Nizet.it worked.But मैं एक अलग तरीके का इस्तेमाल किया पढ़ सकते हैं और छवि के रूप में प्रदर्शित करने के लिए:() विधि – nidheesh

+0

मैं ResultSet.getBytes इस्तेमाल किया छवि और 'छवि img = Toolkit.getDefaultToolkit (पढ़ने के लिए) .createImage (imagedata); ' छवि बनाने के लिए विधि। तब मैंने छवि आकार को सेट आकार के द्वारा छवि आकार में सेट करके छवि को प्रदर्शित करने के लिए एक नया फ्रेम उपयोग किया है। अब मैं गैलरी के रूप में डेटाबेस में संग्रहीत छवियों को प्रदर्शित करना चाहता हूं। क्या वहां कोई सुविधाजनक तरीका है वह कर रहा??? – nidheesh

1

एक बार यदि आप चयन क्वेरी निष्पादित करते हैं तो परिणामसेट ऑब्जेक्ट प्राप्त होगा, फिर इसे पुन: सक्रिय करें, आपको यह अपवाद नहीं मिलेगा। परिणामसेट आरएस = शून्य;

rs = statement.executeQuery ("UUID_BINARY()" चुनें);

 if(rs.next()){ 

      newTripUUID = rs.getBytes(1); 

     } 
संबंधित मुद्दे