做一个插入操作.在本机(操作系统为winxp)Oracle9I测试通过.在服务器上(操作系统为linux)Oracle10g,dxvo.getContent()为英文字母时测试通过.dxvo.getContent()有中文时报错.谢谢各位看看.
代码如下:
String sql="insert into tbinfo values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
conn=DB.getConnection();            
stmt = (Statement) conn.createStatement();
StringReader   rcon   =   new   StringReader(dxvo.getContent());   PreparedStatement ps=conn.prepareStatement(sql);
ps.setLong(1, Sms_mt_tmp_dxvo.getId());
...
...
ps.setCharacterStream(7, rcon, dxvo.getContent().length());//这样写的理由是:用了PreparedStatement 防止插入超长内容时会报错.
ps.execute();报错如下:.ORA-01461: can bind a LONG value only for insert into a LONG columnjava.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:304)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:271)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:622)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:180)
at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:542)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1027)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2887)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:2978)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)

解决方案 »

  1.   

    ORA-01461: can bind a LONG value only for insert into a LONG column 明显是类型不匹配嘛,检查一下服务器中的表的数据类型,另外linux和windows的数据类型也不尽相同的。
      

  2.   

    应该就是ID那个字段出错了吧。
    ps.setLong(1, Sms_mt_tmp_dxvo.getId()); 
      

  3.   

     dxvo.getContent()为String   存到数据库段的类型为VARCHAR2
     
     当dxvo.getContent()里面有中文的时候就报错.
    本机没问题.就服务器上不行.
      

  4.   

    如果数据库都是varchar2,那java程序完全没必要用stream,就用setString就ok.超长字符串也不是varchar2能处理的,要用clob才行。另外,驱动版本不同也会导致stream出问题,9i,10g1,10g2都不一样的。
      

  5.   

    LONG column 你知道啥叫Long 吗?这个在 Oracle里面可不是 数字long而是一个blob的类型哦。你换成 Number类型吧!
      

  6.   

    如果是文本,那就用CLOB,如果是图片,就用BLOB,不要用什么Long字段类型了。