将Java字符串转换为CLOB
我有下表: 问题是,当我尝试使用JDBC向该字段插入字符串时,总是会出现以下错误:将Java字符串转换为CLOB,java,oracle,jdbc,clob,Java,Oracle,Jdbc,Clob,我有下表: 问题是,当我尝试使用JDBC向该字段插入字符串时,总是会出现以下错误: java.sql.SQLException: Data size bigger than max size for this type: 6019 我现在该怎么办 生成插入的java代码如下所示: Connection conn2 = null; if(connection==null||connection.isClosed()) { System.out.println("Connec
java.sql.SQLException: Data size bigger than max size for this type: 6019
我现在该怎么办
生成插入的java代码如下所示:
Connection conn2 = null;
if(connection==null||connection.isClosed())
{
System.out.println("Connection is null");
conn2 = connectDB();
}
//REPLACE is non-standard SQL from MySQL, it's counter part of INSERT IGNORE
String sql = "";
sql = "INSERT INTO TEST."+tablename+" ("+fields+") VALUES ("+fields.replaceAll("[^,]+", "?")+")";
System.out.println("SQL: "+sql);
PreparedStatement pstmt = conn2.prepareStatement(sql);
// start parsing
int event = r.getEventType();
while (true) {
// for each wanted element
if (event == XMLStreamConstants.START_ELEMENT
&& r.getName().toString().equalsIgnoreCase("row")) {
System.out.println("Table : "+tablename+" / Row : "+rowCount );
if (attributeCount == 0)
attributeCount = r.getAttributeCount();
//put each parameter to SQL
int f=1;
for (String field : fieldsArray){
String value = r.getAttributeValue("",field);
if("body".equalsIgnoreCase(field) && value != null) {
pstmt.setCharacterStream(f++, new CharArrayReader(value.toCharArray()), value.length());
} else {
pstmt.setString(f++, value);
}
}
pstmt.addBatch();
rowCount++;
if(rowCount%rowspercommit==0){
System.out.println("Importing at row "+rowCount+" ... ");
pstmt.executeBatch();
conn2.commit();
}
} // end for each row.
我不确定创建表是如何的,因为有人为我做了这件事
使用上面的当前代码,我现在得到以下信息:
Exception in thread "main" java.lang.NullPointerException
at oracle.jdbc.dbaccess.DBData.clearItem(DBData.java:431)
at oracle.jdbc.dbaccess.DBDataSetImpl.clearItem(DBDataSetImpl.java:3528)
at oracle.jdbc.driver.OraclePreparedStatement.checkBindTypes(OraclePreparedStatement.java:3271)
at oracle.jdbc.driver.OraclePreparedStatement.setStreamItem(OraclePreparedStatement.java:1178)
at oracle.jdbc.driver.OraclePreparedStatement.setCharacterStream(OraclePreparedStatement.java:3539)
at XMLDumpImporter.importXMLFile(XMLDumpImporter.java:179)
at XMLDumpImporter.importXMLFolder(XMLDumpImporter.java:117)
at XMLDumpImporter.main(XMLDumpImporter.java:48)
第行:
if("body".equalsIgnoreCase(field) && value != null) {
pstmt.setCharacterStream(f++, new CharArrayReader(value.toCharArray()), value.length());
这完全没有意义,因为可能是空的似乎您正在使用
setString
而不是setCharacterStream
来设置clob的值。如果使用的是setString
,则驱动程序可能会将该值转换为varchar2
,其大小限制为4000个字符
哈克蒂·哈克:
int fieldIndex = 0;
for(String fieldName : fieldsArray) {
String value = r.getAttributeValue("",field);
if(value != null && "body".equalsIgnoreCase(fieldName)) {
pstmt.setCharacterStream(++fieldIndex, new StringReader(value), value.length());
} else {
pstmt.setString(++fieldIndex, value);
}
}
相关文件:
- 或
setString
而不是setCharacterStream
来设置clob的值。如果使用的是setString
,则驱动程序可能会将该值转换为varchar2
,其大小限制为4000个字符
哈克蒂·哈克:
int fieldIndex = 0;
for(String fieldName : fieldsArray) {
String value = r.getAttributeValue("",field);
if(value != null && "body".equalsIgnoreCase(fieldName)) {
pstmt.setCharacterStream(++fieldIndex, new StringReader(value), value.length());
} else {
pstmt.setString(++fieldIndex, value);
}
}
相关文件:
- 或
字符串中的内容,你可以将字符串
包装成CharArrayReader
或ByteArrayInputStream
有时它会在线程“main”java.lang.NullPointerException:if(“body”)中给我错误异常.equalsIgnoreCase(fieldName)){pstmt.setCharacterStream(fieldName,new CharacterReader(value.ToCharray()),value.length());}检查值是否为空,并按照fitI实际检查值==空且从未命中的方式进行操作。。。奇怪的我不知道这个空值是从哪里来的。当你有一个字符串时,你能使用setCharacterStream吗?我修改了上面的代码,我应该如何使用setCharacterStream?@EquinoX-如果你已经有字符串中的内容,你可以将字符串
包装成CharArrayReader
或ByteArrayInputStream
有时它会在线程“main”java.lang.NullPointerException:if(“body”)中给我错误异常.equalsIgnoreCase(fieldName)){pstmt.setCharacterStream(fieldName,new CharacterReader(value.ToCharray()),value.length());}检查值是否为空,并按照fitI实际检查值==空且从未命中的方式进行操作。。。奇怪的我不知道这个空值是从哪里来的