【适用范围】
EOS5.x
【内容】
和oracle clob类型字段pk了2天,终于搞定。附件是我仿照bl_filetoclob整理的将大字符串(String)保存到clob字段的运算逻辑。下载地址:
附件下载
注意事项:
1、java.sql.Clob 与oracle.sql.CLOB的区别。java1.4自带的jdbc Clob接口比jdbc驱动的CLOB接口少了很多方法。建议使用Oracle的JDBC的API。 如果要用Oracle的JDBC的API还需要在studio中将oracle的驱动引进来。不然会报错。
2、注意此方法中关于事务的处理。 flag = conn.getAutoCommit(); if(flag) conn.setAutoCommit(false); 这段代码是我反编译eosbizlets-found.jar包下面的com.primeton.eos.bizlets.database.OracleLOBManipulator的时候找到的。我的理解是如果 调用此运算逻辑的业务逻辑中有事务的话,那么此运算逻辑的AutoCommit就设为false。运算事务由业务逻辑的事务进行统一控制。如果调用运算逻辑 的业务逻辑没有用到事务,那么AutoCommit就为true。不知道这样理解是否正确。
3. 我写完这个运算逻辑后发现原来com.primeton.eos.bizlets.database.OracleLOBManipulator下面有一个StringToCLOB方法,所要做的事情基本是一样的。
4. 参考资料 http://www.javaeye.com/topic/254,帖子很不错。
5.在weblogic9.2环境中使用时,曾经遇到ClassCastException的错误:
java.lang.ClassCastException: weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB incompatible with oracle.sql.CLOB
at com.primeton.webwf.util.ClobToDBManager.BL_updateClob(ClobToDBManager.java:126) ... 37 more
上网一查,如果用weblogic的数据库连接池,那么返回的数据类型经过了一次包装也就是返回weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB,因此出现类型转换错误。于是结合com.primeton.eos.bizlets.database.OracleLOBManipulator中的方法对运算逻辑进行了调整。
因为调用到了weblogic的包,因此直接放到studio中会出现错误,因此需要在studio中将\bea\weblogic81\server\lib路径下的weblogic.jar引入。请不要将weblogic.jar放
在如primeton5.1.2\jboss-3.2.5\server\default\lib下面,否则会出错。
【备注】
1)根据注意事项的第五条说明,2007年12月7日更新了附件代码
2) Clob字段可以正常导入数据实体,默认的EOS数据类型为“长字符串”,需要改为“字符串大对象”;
3) 使用BL_insertEntity可以正常插入数据,使用BL_queryEntityAllWithPageExt等查询构件也能正常的将内容查出。我们发现,Oracle数据库不能一次性往clob字段里插入过多的数据量,如果插入的数据量超过一定限度,数据库会抛错“Io exception: Connection reset”,这时,还是要换stringtoclob的方案,如果是SQL Server或DB2,则没有这个问题。
4) 修改时不能使用BL_updateEntity,会导致clob字段内容丢失的情况,应该使用BL_StringToCLOB或者是上述的BL方法,推荐使用这个BL方法。
5)使用这个BL方法时,注意参数中的主键值事先要存在,即这个BL方法是根据一个已有的主键值做更新操作。 |