我的数据库里面原来有一个表A,里面有一个image列AA,现在另一个表B里面也有一个image列BB,要用到A表AA列的某些数据。我的手提电脑上装的Sql Server 2000,我用Sql语句执行了这个操作,但总是说“对于局部变量,text、ntext 和 image 数据类型无效。”。
我只好用JAVA编了一个方法来处理上面的image内容,也还是出现问题。
我把image内容从A表取出,放到InputStream中,然后再放入B表的BB列。代码如下:String strsql0="select snInA, right(docName, 3) attExt, AA" +
    " from A where tableName='B' order by snInA";
String strsql1="update B set BBExt=?, BB=? where sn=";
ResultSet rs=db.executeQuery(strsql0, message);
Connection conn=db.getConnection();
PreparedStatement pst;
try{
    InputStream is=null;
    String sn="";
    String ext="";
    while (rs.next()){
        sn=rs.getString("snInA");
        pst=conn.prepareStatement(strsql1+sn);
        ext=rs.getString("attExt");
        pst.setString(1, ext);
        is=rs.getBinaryStream("AA");
        System.out.println("empSn, ext, is.length="+sn+", "+ext+", "+is.available());
        pst.setBinaryStream(2, is, is.available());
        if (pst.executeUpdate()<1)            //*
            throw new Exception("更新数据表出错!\n"+strsql1);
        ok=true;
        pst.close();
    }
    if (is!=null)
        is.close();
}catch(Exception e){
    e.printStackTrace();
}
运行到*处,报异常:流值不是指定的长度。指定长度为 7,845,实际长度为 22,118。
后来查了一下,如果把is保存到硬盘的话,生成的文件的大小,正好是22118。
但为什么保存到数据库的内容长度就是7845呢?而保存到硬盘之后,就变成了22118字节呢?
因为这种不确定性,is.available()我可不可以设一个较大的值呢来保存这个is的内容,而不管它原来的大小呢?
还是,最终只能,先把is保存到硬盘,然后再从硬盘读取会数据库呢?
谢谢。

解决方案 »

  1.   

    糟了,没人回答。是不是大家都没遇到过这种情况?
    我想问问,可否把表A的AA列,添加到B表作为一列呢?如果可以的话,应该怎样操作?可以用写成SQL语句来操作吗?
    好像只有这个解决办法了。
      

  2.   

    今天终于把这个未完成的功能翻了出来,而且还顺利的解决了。原来,是我把几行代码的顺序没有写好,如果改为下面的顺序,就可以了。        while (rs.next()){
            sn=rs.getString("snInA");
            ext=rs.getString("attExt");            //1
            is=rs.getBinaryStream("AA");           //2        pst=conn.prepareStatement(strsql1+sn);
            pst.setString(1, ext);
            System.out.println("empSn, ext, is.length="+sn+", "+ext+", "+is.available());
            pst.setBinaryStream(2, is, is.available());    //3
            if (pst.executeUpdate()<1)            //*
                throw new Exception("更新数据表出错!\n"+strsql1);
            ok=true;
            pst.close();
        }但运行时仍然会在*处报错(说is.available()大小与实际不符),但却可以执行完成。
    后来我发现原来的表A里面,每个记录都有记录下保存的文件的大小的,我就把size也select出来,取代了is.available()的位置,就完全不报异常了。