1

xml ファイルをデータベースに保存しようとしていますが、CallableStatement に CLOB を設定しようとすると、次の例外が発生します。

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

すべての記号が表示されている Notepad++ でファイルを調べると、特殊文字が表示されません。データベースのエンコーディングは AL32UTF8 です。これらの読めない 10 文字を見つけるにはどうすればよいですか? ファイルの 10 番目の文字は「s」であるため、10 番目の文字ではありません。最初の文字列:

<?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() を使用した場合も同様です)。

4

1 に答える 1

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

そしてそれはうまくいきます!

于 2013-07-05T16:43:39.760 に答える