我的数据库里面原来有一个表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保存到硬盘,然后再从硬盘读取会数据库呢?
谢谢。
我只好用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保存到硬盘,然后再从硬盘读取会数据库呢?
谢谢。
解决方案 »
- 这个功能能实现么
- 拜托来人啊 快帮我看看 如何通过http:// 路径方式掉用 webservices 函数
- 请问我一个listener的类如何去读取web.xml
- 100分求问
- JDBC驱动和JSP连接MYSQL问题
- 在线等!!如何在URL中传递单引号?回答即得分。
- EC3.0现在插件全不全?有没有中文版
- java如何生成exe文件
- 让你心动:)
- freemarker通过模板文件生成excel文件 excel2007提示格式不一致怎样处理
- 在线等 十万火急 新手求助 JSP ServletContext 报空指针错误 !!!!!!!!
- 想把页面分成两部分,一部分负责选择,另一部分根据选择显示信息
我想问问,可否把表A的AA列,添加到B表作为一列呢?如果可以的话,应该怎样操作?可以用写成SQL语句来操作吗?
好像只有这个解决办法了。
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()的位置,就完全不报异常了。