J'ai essayé le code suivant pour récupérer une image stockée dans une base de données. J'ai créé une base de données appelée image_db
qui contient une table appelée image_details
. La table a deux champs, id
et image_path
et les deux sont de type mediumblob
. J'ai stocké quelques images dans le champ image_path
sous forme binaire. Maintenant, je veux récupérer et l'afficher.
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();
}
}
Je reçois l'exception suivante lors de l'exécution du code ci-dessus:
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)
Comment cela est-il causé et comment puis-je le résoudre?
Vous devez appeler rs.next () (et vérifier qu'il renvoie true) pour accéder à la première ligne du jeu de résultats:
if (rs.next() {
InputStream stream = rs.getBinaryStream(1);
...
De plus, l'index ne doit pas être 1, car votre requête ne sélectionne qu'une colonne.
Je ne comprends pas non plus le point de convertir un int en caractère. La méthode prend un int en argument. Une conversion d'octet serait au moins logique, mais les octets et les caractères ne sont pas la même chose en Java.
Une fois que vous exécutez la requête sélectionnée, vous obtiendrez un objet ResultSet, puis répétez-la, vous n'obtiendrez pas cette exception . ResultSet rs = null;
rs = statement.executeQuery ("select UUID_BINARY ()");
if(rs.next()){
newTripUUID = rs.getBytes(1);
}