小弟,最近在写一个把文件的内容读入数据库时,遇到了用JDBC连接方式不能对大型BLOB字段的数据进行操作,请问在使用JDBC连接方式情况下有什么方法解决这个问题呢?谢谢了!

解决方案 »

  1.   

    不会的,只要db2支持blob,java就能用。
    你往里面写文件的时候,要注意blob的大小,超过了这个大小你要把剩余的数据写到新的一条记录里。换句话说,你要把文件数据给slip成blob的限制大小,把这些数据片按序存放。
      

  2.   

    我是这样的
     int rows = dsLog.getRowCount();
        String[] strSql = new String[rows];
        Vector[] v = new Vector[rows];
        int i=0;
        dsLog.first();
        while(dsLog.inBounds()){
          strSql[i] = "Insert into " + EntranceClassB.pubsysinfo.GetSysSchema() +
              ".RegAnaLog( "
              + " SeqNo, "
              + " UserID, "
              + " ForecastTime, "
              + " RegType, "
              + " Re, "
              + " AnaResult, "
              + " R2) "
              + " values( "
              + " COALESCE((select MAX(SeqNo) from "
              + EntranceClassB.pubsysinfo.GetSysSchema()
              + ".RegAnaLog), 0)+1, "
              + dsLog.getInt("UserID") + ", "
              + ClientSysPub.SetMark(dsLog.getString("ForecastTime"))+ ", "
              + ClientSysPub.SetMark(dsLog.getString("RegType")) + ", "
              + ClientSysPub.SetMark(dsLog.getString("Re")) + ", "
              + " ?, "
              //+ ClientSysPub.SetMark(sContent) + ", "
              + dsLog.getBigDecimal("R2").setScale(4,java.math.BigDecimal.ROUND_FLOOR) + ") ";      byte[] ba = dsLog.getString("AnaResult").getBytes();
          v[i] = new Vector();
          v[i].add(ba);
          dsLog.next();
          i++;
        }
    我用的是Vector存取的,规定最大的是10M
      

  3.   

    没看明白你的,你看下面怎么存取图片。
    //stmt = con.prepareStatement("INSERT INTO BOOKCOVERS VALUES(?,?)");
    //File imageFile = new File("c:\\test.jpg");
    //InputStream inputStream = new FileInputStream(imageFile);
    //stmt.setString(1,"0738425826");
    //stmt.setBinaryStream(2,inputStream,(int)(imageFile.length()));
    //stmt.executeUpdate();
    stmt = con.prepareStatement("SELECT BOOKCOVER FROM BOOKCOVERS WHERE BOOKISBN=?");
    stmt.setString(1, "0738425826");
    ResultSet resultSet = stmt.executeQuery();
    while (resultSet.next()) {
    // materialization of the Blob
    Blob blob = resultSet.getBlob(1);
    InputStream inputStream = blob.getBinaryStream();
    File fileOutput = new File("e:\\songshe\\clonetest.jpg");
    FileOutputStream fo = new FileOutputStream(fileOutput);
    int c;
    while ((c = inputStream.read()) != -1)
    fo.write(c);
    fo.close();
    System.out.println("Blob retrieved");
    }blob这个数据类型本身是有限制的,
    就像byte的范围是-127-128一样。超过了这个大小你就要拆分。你的10M肯定超出了bolb的取值范围,把你数据进行拆分存储。
      

  4.   

    好像没超过,这是db2 blob的介绍:
    BLOB(n)  若n<=2GB, 则使用BLOB(n)看看你们的表中n的大小吧,文件大小不能超过n,超过了就得拆分存储了。
      

  5.   

    我的没有啊
    还有,我的代码是先把文件的内容以字节形式存入byte[],你看下面的代码:
    byte[] ba = dsLog.getString("AnaResult").getBytes();//从数据得到AnaResult字段的值存入
    再把ba写入Vector中,再来进行操作数据库的
      

  6.   

    在db2里面有个参数设置,具体什么忘了,好像是dataspace 可以满足你的要求