2010-08-18 3 views
1

J'ai un programme Java qui crée un certain nombre de fichiers XML, puis les zips et les enregistre dans le système de fichiers. Plus tard dans le programme, je veux mettre ce même fichier zip dans une colonne blob de ma base de données Oracle. Le problème est que je ne suis pas sûr de savoir comment faire cela. Je n'ai pas besoin de le lire ou de faire quoi que ce soit avec les données, il suffit de le déplacer vers la base de données pour un stockage central persistant.Comment déplacer un fichier zip vers une colonne blob en Java?

Merci!

Répondre

0

Je pense que vous cherchez à utiliser la méthode setBytes():

Ainsi, un exemple pour un tableau représentant des e-mails où le corps est un flux d'octets ressemblerait à ceci:

 PreparedStatement ps = con.prepareStatement(
     "INSERT INTO Image (ID, Subject, Body) VALUES (2,?,?)"); 
     ps.setString(1, subject); 
     byte[] bodyIn = {(byte)0xC9, (byte)0xCB, (byte)0xBB, 
     (byte)0xCC, (byte)0xCE, (byte)0xB9, 
     (byte)0xC8, (byte)0xCA, (byte)0xBC, 
     (byte)0xCC, (byte)0xCE, (byte)0xB9, 
     (byte)0xC9, (byte)0xCB, (byte)0xBB}; 
     ps.setBytes(2, bodyIn); 
     int count = ps.executeUpdate(); 
     ps.close(); 

I Je suppose que vous pouvez facilement convertir l'appel getBytes() pour votre objet XML Zipped.

1

Il y a plusieurs façons de le faire, mais PreparedStatement.setBinaryStream est probablement le meilleur moyen.

public void saveFileToDatabase(File file) { 
    InputStream inputStream = new FileInputStream(file); 

    Connection conn = ...; 
    PreparedStatement pS = conn.prepareStatement(...); 
    ... 
    pS.setBinaryStream(index, inputStream, (int) file.length()); 
    ... 
    pS.executeUpdate(); 
} 

(Notez que, pour simplifier, ne comportait aucune des choses try/catch nécessaire pour fermer la Connection, PreparedStatement et InputStream, mais vous devez le faire.)

fait de cette façon , les données seront transmises du fichier à la base de données sans avoir à être chargées en mémoire en une seule fois.

+0

J'ai essayé (traitement des erreurs supprimé): public void updateBlob (id String, fichier sf) { InputStream est = new FileInputStream (sf); Chaîne sql = "INSERT INTO nomt ('bCol')" + "VALEURS (?) O t tnameId =?"; PreparedStatement stmt = null; Connexion conn = SqlUtil.getCurrentConnection(); stmt = conn.prepareStatement (sql); stmt.setBinaryStream (1, est, sf.length()); stmt.setString (2, id); stmt.executeUpdate(); a reçu l'erreur: java.lang.AbstractMethodError: org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream (ILjava/io/InputStream; J) V – Ironosity

+1

Essayez de diffuser le résultat '' long' de sf.length() 'à un 'int' ... il y avait une version de' setBinaryStream' qui prenait une longueur 'int', et ensuite JDBC 4.0 en ajoutait un qui prenait une longueur' long'. La méthode 4.0 peut être appelée contre une bibliothèque 3.0. Si cela ne fonctionne pas, vérifiez que Commons DBCP et le pilote Oracle sont des versions qui prennent en charge au moins JDBC 3.0. – ColinD

Questions connexes