Dengues Studio: Google Group:http://groups.google.com/group/dengues; QQ Group:24885404.
近来用Dengues测试了一个Oracle的Blob类型数据转移,即同一数据库下的表之间的Blob类型字段,不同数据库不同表的Blob字段。但是在测试后者的时候,会发生:ORA-00942: 表或视图不存在。后来发现使用java.sql.PreparedStatement pstmt;pstmt.setObject(2,blob);这个方法在传入的是blob实例的时候再执行.
先用下面方法新建一个表:在SQL*Plus里面执行:
create table T_IMAGE(T_IMAGE_ID varchar(20),T_IMAGE_BLOB BLOB);

并插入Blob:
 1 public static void createBLOB() {
 2         OutputStream bos = null;
 3         FileInputStream inputStream = null;
 4         ResultSet rs2 = null;
 5         PreparedStatement ps2 = null;
 6         Connection conn = null;
 7         try {
 8             Class.forName("oracle.jdbc.driver.OracleDriver");
 9             conn = DriverManager.getConnection(
10                     "jdbc:oracle:thin:@localhost:1521:dengues""root""root");
11 
12             conn.setAutoCommit(false);
13             // 第一步:插入一个空的BLOB
14             String sql1 = "insert into T_IMAGE(T_IMAGE_ID,T_IMAGE_BLOB) values ('24',EMPTY_BLOB())";
15             PreparedStatement ps1 = conn.prepareStatement(sql1);
16             ps1.executeUpdate();
17             System.out.println("insert success.");
18             ps1.close();
19 
20             // 第二步:取出该CLOB
21             String sql2 = "select T_IMAGE_BLOB from T_IMAGE where T_IMAGE_ID='24' for update";
22             ps2 = conn.prepareStatement(sql2);
23             rs2 = ps2.executeQuery();
24             while (rs2.next()) {
25                 oracle.sql.BLOB blob = (oracle.sql.BLOB) rs2.getBlob(1);
26                 bos = blob.getBinaryOutputStream();
27                 inputStream = new FileInputStream("c:/ibm.xml");
28                 byte[] b = new byte[blob.getBufferSize()];
29                 int len = 0;
30                 while ((len = inputStream.read(b)) != -1) {
31                     bos.write(b, 0, len);
32                 }
33                 bos.flush();
34                 bos.close();
35             }
36             rs2.close();
37             inputStream.close();
38             ps2.close();
39             conn.setAutoCommit(true);
40             conn.commit();
41             conn.close();
42         } catch (Exception e) {
43             e.printStackTrace();
44         }
45     }
46 

但是将这条记录转换到另一个数据库testdb,先取出dengues数据库里面的数据,并使用pstmt.setObject(2,blob)但是这样执行pstmt.executeUpdate()。就会出现异常。估计这个是Oracle驱动的一个Bug。
为了改正这个问题:pstmt.setObject(2,cBLOB(blob));
下面是cBLOB的实现:
 1 public static Object cBLOB(Object in) {
 2         Object blob = in;
 3         try {
 4             if (in instanceof oracle.sql.BLOB) {
 5                 oracle.sql.BLOB bo = ((oracle.sql.BLOB) in);
 6                 InputStream bis = bo.getBinaryStream();
 7                 BufferedInputStream ins = new BufferedInputStream(bo
 8                         .getBinaryStream());
 9                 int bufferSize = (int) bo.length();
10                 byte[] bt = new byte[bufferSize];
11                 try {
12                     ins.read(bt, 0, bufferSize);
13                 } catch (IOException e) {
14                     e.printStackTrace();
15                 }
16                 bis.close();
17                 blob = bt;
18             }
19         } catch (Exception e) {
20             e.printStackTrace();
21         }
22         return blob;
23     }
就是将这个BLOB实例转换为一个byte[]返回给传入.



Dengues论坛(http://groups.google.com/group/dengues/),一个很好的Eclipse开发者乐园.

只有注册用户登录后才能发表评论。


网站导航:
 
Dengues Studio: Google Group:http://groups.google.com/group/dengues; QQ Group:24885404.