2011-01-08 3 views
3

Je suis en train d'écrire une méthode qui reçoit un fichier texte séparé par des virgules en tant que InputStream via un service Web. J'ai créé ma table en utilisant le script SQL suivant:Comment insérer un InputStream dans une CLOB en utilisant JDBC?

CREATE SEQUENCE FILE_NUMBER_SEQ 
INCREMENT BY 1 
START WITH 1 
MINVALUE 1 
NOMAXVALUE; 

CREATE TABLE FILES 
(
    ID  NUMBER NOT NULL , 
    FILE  CLOB NOT NULL 
); 

Dans mon test unitaire J'utilise le code suivant pour générer le CSV. Je ne peux pas créer un fichier b/c des droits d'administrateur sur la machine, le test peut être exécuté sur:

String simulatedCSVFile = new String("col1,col2\\ndata1,data2"); 
    InputStream stream = new ByteArrayInputStream(
           simulatedCSVFile.getBytes("UTF-8")); 

Ma méthode ressemble actuellement à ceci:

public void uploadCSVFile(InputStream stream) { 
    try { 

     Connection conn = null; 
     PreparedStatement preparedStmt = null; 

     conn = db.getDataSource().getConnection(); 
     conn.setAutoCommit(false); 

     String sql = "INSERT INTO FILES(ID,FILE) VALUES(FILE_NUMBER_SEQ.NEXTVAL,?)"; 
     preparedStmt = conn.prepareStatement(sql); 
     preparedStmt.setAsciiStream(1, stream); 
     int count = preparedStmt.executeUpdate(); 
    } 
} 

Lorsque j'exécute la méthode pour tester J'obtiens une exception qui lit "La charge utile du message est de type: jetty.HttpParser" lorsque setAsciiStream est appelée.

Une idée de comment je peux convertir le flux afin qu'il puisse être ajouté au SQL pour le CLOB?

+0

Je n'ai jamais entendu parler d'envoyer des flux d'entrée via les services Web. Pourquoi ne pas envoyer un tableau d'octets à la place? – Lukasz

+0

Je pourrais, mais je ne veux pas revenir en arrière puisque le service fonctionne. L'Inputstream a les données parce que je peux le voir quand je le débogue. Le problème consiste à obtenir les données de InputStream dans PreparedStatement. – TERACytE

+0

J'ai réussi à le faire fonctionner en convertissant InputStream en String puis en exécutant prepareStmt.setString (1, theString); au lieu de "setAsciiStream". Je ne suis toujours pas sûr si cette technique est la meilleure façon d'atteindre cet objectif. – TERACytE

Répondre

1

Pouvez-vous essayer InputStreamReader et setCharacterStream méthode de PreparedStatement?

Questions connexes