EJB里面不能直接对Oracle的BLOB和CLOB字段的,它只能是单独再用一个JAVABEAN来存取的,因为这其中要用到输入和输出对象(即java.io.*).在EJB当中是不能用其来操作的。

解决方案 »

  1.   

    我用byte[]做参数据和方式可以存入数据,但是取不出来!
      

  2.   

    兄弟,谁说取不出来,竟然能够存,还有取不出来的事情吗?要不给你个例子看看,就可以了。
     public boolean setBlob(String filename,String tablename,String blobname,String keyname,String keyid){
        boolean flag = false;
        Connection con = null;
        java.sql.PreparedStatement ps = null;
        java.sql.ResultSet rs = null;
        try{
          File file = new File(filename);//建立一个文件对象
          FileInputStream fis=new FileInputStream(file);//建立一个文件输入流对象
          byte[] fbyte=new byte[(int)file.length()];//建立一个字节数组
          int i=fis.read(fbyte);//将文件读入到字节组中
          con = this.getConnection();
          con.setAutoCommit(false);
          String sqlString = String.valueOf(new StringBuffer().append("select ")
                             .append(blobname+" from "+tablename).append(" where ")
                             .append(keyname).append("=").append(keyid+" for update"));
          //blob对象数据从SELECT语句中选出,要修改BLOB,必须添加"FOR UPDATE"语句("否则会出现BLOB未锁定...等错误")
          //还有其他的方法,比如HOLDLOCK也行,...加锁
          ps = con.prepareStatement(sqlString);
          rs = ps.executeQuery();
          if(rs.next()){
            oracle.sql.BLOB blob = ((oracle.jdbc.OracleResultSet)rs).getBLOB(blobname);
            java.io.OutputStream outx = blob.getBinaryOutputStream();
            outx.write(fbyte);
            outx.flush();
            ps.execute("commit");
            con.setAutoCommit(true);
            flag = true;
          }else{
            flag = false;
          }
          return flag;
        }catch(Exception e){
          return false;
        }finally{
          try{
            rs.close();
          }catch(Exception e){}
          try{
            ps.close();
          }catch(Exception e){}
          try{
            con.close();
          }catch(Exception e){}
        }
      }
      

  3.   

    public boolean getBlob(String filename,String tablename,String blobname,String keyname,String keyid){
        boolean flag = false;
        Connection con = null;
        java.sql.PreparedStatement ps = null;
        java.sql.ResultSet rs = null;
        java.io.InputStream in = null;
        java.io.OutputStream out = null;
        oracle.sql.BLOB blob  = null;
        byte[] data;
        try{
          con = this.getConnection();
          String sqlstring = "select * from "+tablename+" where "+keyname+"="+keyid;
          ps = con.prepareStatement(sqlstring);
          rs = ps.executeQuery();
          if(rs.next()){
            blob = ((oracle.jdbc.OracleResultSet)rs).getBLOB(blobname);
            in = blob.getBinaryStream();
            out = new java.io.FileOutputStream(filename);
            int bufferSize = blob.getBufferSize();
            data = new byte[bufferSize];
            int bytesRead = 0;
            while ((bytesRead = in.read(data)) != -1) {
                                    out.write(data, 0, bytesRead);
                                    //System.out.println(bytesRead);
                            }
                            ps.clearParameters();
                            data = null;
                            in.close();
                            out.close();
                            //con.commit();
                           flag = true;
          }
          return flag;
        }catch(Exception e){
          return false;
        }finally{
          try{
            in = null;
            out = null;
            blob = null;
            rs = null;
            ps =null;
            con = null;
          }catch(Exception e){}
        }
      }
      

  4.   

    to: lovevicky511(郭志军):
    我有点明白我的错误所在了!但我在试一下,你的程序看起来是对的!重写了Set和Get方法!我没有有想到!等我试一下更希望更多的朋友提出自己的看法!
      

  5.   

    还有一个问题
    ejb2.0不是不能使用java.io.*类吗?
      

  6.   

    我这就是例子啊,你还想什么例子啊,EJB中是不可以用到java.io.*这个包中的函数和方法是不能用到的。
      

  7.   

    我现在用的是LONG RAW 类型实现的!很别方便!
    CLOB和BLOB没有搞定!
      

  8.   

    在做有关rmi时也遇到此问题,当时是把file放到一个byte array
    不知有没有好办法