jsp插入clob字段,出现的异常
下面是我用jsp插入oracle 9i 的clob 的程序片段.
String Sql= "INSERT INTO website.ynews(id,title,content,classid) VALUES(newsid.nextval,?,?,?) ";
stmt=con.prepareStatement(Sql);
stmt.setString(1, txtshowname);
StringBufferInputStream sbin = new StringBufferInputStream(note);
stmt.setAsciiStream(2,sbin,note.length());
stmt.setString(3, classid);
con.setAutoCommit(true);
stmt.execute();
con.commit();
stmt.close();
插入短的文本可以,但一旦长一些,比如2000字左右就会报下面的异常.
javax.servlet.ServletException: Io 异常: Char 数组不够长: javaCharsToUtf8Bytes
连接用的是Tomcat 的连接池.
大家帮帮忙, 我弄这个弄了好多天了.或者帮我改改这段代码,只能能插入clob字段就行.万分感谢!!!!
------解决方案--------------------这个字段类型最多只能存2000个字
如果真的有这么多字数的话,那只能判断一下,超出部分存在下一个字段了
------解决方案--------------------转相关资料:
假设col2是CLOB:
写操作:
String sql = "insert into tb_commendtemp (col1,col2) values( '111 ',?) ";
string s = "长文本 ";
StringBufferInputStream sbin = new StringBufferInputStream(s);
PreparedStatement ps = query.getPreStmt(sql);
ps.setAsciiStream(1,sbin,s.length());
int i = ps.executeUpdate();
ps.close();
sbin.close();
if(i> 0) ok;
如果是二进制文件就用FileInputStream写进去
读的时候只要
rs.getAsciiStream();
rs.getUnicodeStream();
rs.getBinaryStream();
看它们的名字就知道是得到什么类型的的数据流了.
如果存放的是二进制文件,比如图形,执行文件,压缩文件最好还是blob保险.
写和读也要用二进制流,
DataInputStrean和DatOutputStream.有时用UNICODE的字符流也能行,但
不保险.如果是文本,用Clob和LONG都行.读和写用
BuffreedReader和PrintWriter更方便.
要想在一个网页上同时显示从程序中推出的文字和图象,这项技术目前在国内
可以值100万.
因为目前浏览器要想同时显示HTML文档和image文档,你到目前在国内还没有
发现,要用到server push技术.你想想一下电子邮件的文档头,是复合型的,把
数据用Base 64编码就可以通过特定的文档类型同时显示文字和图片了.可是浏览器目前还做不到.
blob:二进制,如果exe,zip
clob:单字节码,比如一般的文本文件.
nlob:多字节码,如UTF格式的文件.
如果带格式的文件如果WORD,EXECL等如果要保持格式不被破坏,最好以BLOB
方式,它近似于以byte的原始方式存放,缺点当然是操作时效率低(慢).
操作CLOB,别的可以看我上面的写和读的例子,只要注意把
写pstmt.setBinaryStream()改成rs.setAsciiStream();
读pstmt.getBinaryStream()改成rs.getBinaryStream();
在从文件读成流的时候用Reader而不要用DataInuputStream
------解决方案--------------------学习
------解决方案--------------------给你参考下,希望有用(网上的代码).
strSQL = "insert into product(ID,slID,pID,postID,name,num,unit,localPrice,otherPrice,agioPrice,phone,staTime,endTime,flag_1,flag_2,rule,summaryMemo,detailMemo) values(......+empty_clob()) ";
其中detailMemo是clob型
pstmt = con.prepareStatement(strSQL);
int inserNum = pstmt.executeUpdate();
int inserNum_1 = 0;
strSQL = "select detailMemo from product where ID= ' "+ID+ " ' for update ";
pstmt = con.prepareStatement(strSQL);
ResultSet rs1 = pstmt.executeQuery();
if(rs1 != null && rs1.next())
{
oracle.sql.CLOB clob =