2013-07-05 2 views
1

Я пытаюсь сохранить файл XML в базу данных, но когда я пытаюсь установить CLOB для CallableStatement я получаю это исключение:java.sql.SQLRecoverableException: 10 символа данных CL не может быть прочитан

java.sql.SQLRecoverableException: 10 char of CLOB data cannot be read 

Когда я просматриваю файл в Notepad ++ со всеми показанными символами, я не вижу никаких специальных символов. Кодировка базы данных - AL32UTF8. Как я могу найти эти 10 символов, которые нельзя прочитать? Это определенно не 10-й символ, как можно думать, потому что 10-й символ в файле «s». Первая строка:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

Фрагмент кода:

CallableStatement cs = con.prepareCall("{ call scenario.add(?,?,?,?,?) }"); 
cs.registerOutParameter(1, Types.INTEGER); 
cs.setLong(2, cfg.getScenarioId()); 
cs.setString(3, cfg.getType()); 
cs.setClob(4, new InputStreamReader(new FileInputStream(file), "UTF-8"), (int) file.length()); 
cs.setString(5, cfg.getFileName()); 

сбой приложения на setClob (то же самое происходит, если использовать setCharacterStream()).

+0

Является ли файл фактически UTF-8 или может иметь некоторые символы ISO-8859-1 - даже те, которые визуализируют, может быть, символ валюты, - который не может быть преобразован красиво? Во всяком случае, похоже, что это может быть проблема кодирования символов. –

+0

Да, это на самом деле UTF-8. На самом деле я нашел проблему - это 2 слова на русском языке, у обоих есть 5 букв. Но теперь я не понимаю, почему они вызывают проблему. Я сохраняю файл в UTF-8, если я пытаюсь прочитать его с другой кодировкой, я получаю беспорядок вместо этих двух слов, в UTF-8 все нормально. Таким образом, они UTF-8, но CLOB не хочет их читать. Зачем? – mykola

ответ

0

Ну, я нашел решение. Я все еще не понимаю, что не так с CLOB, но все данные прекрасно сохраняются как объекты. Я использовал эту функцию, чтобы получить содержимое файла:

private String getContent(File file) throws IOException { 
    StringWriter writer = new StringWriter(); 
    IOUtils.copy(new FileInputStream(file), writer, "UTF-8"); 
    String result = writer.toString(); 
    return result; 
} 

, а затем только что сохраненный строки результата как объекта:

CallableStatement cs = con.prepareCall("{ call scenario.add(?,?,?,?,?) }"); 
cs.registerOutParameter(1, Types.INTEGER); 
cs.setLong(2, cfg.getScenarioId()); 
cs.setString(3, cfg.getType()); 
String fileContent = getContent(file); 
cs.setObject(4, fileContent); 
cs.setString(5, cfg.getFileName()); 

И это работает!

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