¿Cómo insertar un InputStream en un CLOB usando JDBC?

Estoy escribiendo un método que recibe un archivo de texto separado por comas como InputStream a través de un servicio web. Creé mi tabla usando el siguiente script SQL:

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

En mi prueba unitaria, estoy usando el siguiente código para generar el CSV. No puedo crear un archivo b / c de derechos de administrador en la máquina en la que se puede ejecutar la prueba:

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

Mi método actualmente se ve así:

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

Cuando ejecuto el método para probarlo, obtengo una excepción que dice "La carga útil del mensaje es de tipo: jetty.HttpParser" cuando se llama a setAsciiStream.

¿Alguna idea de cómo puedo convertir la secuencia para que pueda agregarse al SQL para el CLOB?

preguntado el 08 de enero de 11 a las 20:01

Nunca he oído hablar de enviar InputStreams a través de servicios web. ¿Por qué no envías una matriz de bytes en su lugar? -

Podría, pero no quiero dar marcha atrás ya que el servicio está funcionando. Inputstream tiene los datos porque puedo verlos cuando los depuro. El problema es obtener los datos de InputStream en PreparedStatement. -

Me las arreglé para que 'funcionara' convirtiendo el InputStream en un String y luego ejecutando "readyStmt.setString (1, theString);" en lugar de "setAsciiStream". Todavía no estoy seguro de si esta técnica es la forma "mejor / estándar" de lograr el objetivo. -

Esa excepción parece provenir de su controlador JDBC. ¿Qué controlador (/ grupo de conexiones) está utilizando? -

1 Respuestas

Puedes intentar InputStreamReader y setCharacterStream método de PreparedStatement ?

Respondido el 13 de enero de 11 a las 10:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.