2011-01-08 2 views
3

Я пишу метод, который получает текстовый файл с разделителями-запятыми в качестве InputStream через веб-службу. Я создал таблицу, используя следующий SQL скрипта:Как вставить InputStream в CLOB с помощью 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 
); 

В моем модульном тестировании Я использую следующий код для создания CSV. Я не могу создать файл б/с правами администратора на компьютере тест может быть запущен на:

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

Мой метод в настоящее время выглядит следующим образом:

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

Когда я выполнить метод, чтобы проверить его Я получаю исключение, которое гласит: «Сообщение полезной нагрузки имеет тип: jetty.HttpParser» при вызове setAsciiStream.

Любая идея, как я могу преобразовать поток, чтобы его можно было добавить в SQL для CLOB?

+0

Я никогда не слышал о передаче InputStreams через веб-службы. Почему бы вам не отправить байтовый массив? – Lukasz

+0

Я мог бы, но я не хочу возвращаться, так как служба работает. Входной поток имеет данные, потому что я могу его увидеть, когда я его отлаживаю. Проблема заключается в получении данных из InputStream в PreparedStatement. – TERACytE

+0

Мне удалось заставить его «работать», преобразовая InputStream in в String и затем выполнив «readyStmt.setString (1, theString)»; вместо «setAsciiStream». Я до сих пор не уверен, что этот метод является «лучшим/стандартным» способом достижения цели. – TERACytE

ответ

1

Вы можете попробовать InputStreamReader и setCharacterStream способ PreparedStatement?

Смежные вопросы