当前位置:编程学习 > JAVA >>

求教,是不是在setBinaryStream中出的问题?

来自TARENA的教程上的一个例子:

package core20.sql3;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.allanlxf.util.JdbcUtil;

/**
 * Add your description here.
 * 
 * @author alan
 * @version 1.0
 * 
 */
public class ImageLibraryService {
public void addImage(long id, String imageName, String path)
throws SQLException {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
con = JdbcUtil.getConnection();// 这个连接是正确的
con.setAutoCommit(false);

String sql = "INSERT INTO ImageLibrary(id, name, image)";
sql += " VALUES(?,?,empty_blob())";
ps = con.prepareStatement(sql);

ps.setLong(1, id);
ps.setString(2, imageName);

ps.executeUpdate();
JdbcUtil.close(ps, null);

ps = con.prepareStatement("SELECT image FROM ImageLibrary WHERE id = ? FOR UPDATE");
ps.setLong(1, id);
rs = ps.executeQuery();

if (rs.next()) {
Blob image = rs.getBlob(1);

OutputStream out = image.setBinaryStream(0);

BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
BufferedInputStream bufferedIn = new BufferedInputStream(
new FileInputStream(path));
int c;
while ((c = bufferedIn.read()) != -1) {
bufferedOut.write(c);
}
bufferedIn.close();
bufferedOut.close();
}
con.commit();
} catch (Exception e) {
e.printStackTrace();
try {
con.rollback();
} catch (SQLException ex) {
}
throw new SQLException(e.getMessage());
} finally {
JdbcUtil.close(rs, ps, con);
}
}

public void restoreImage(long id, String fileName) throws SQLException {
Connection con = null;
Statement st = null;
ResultSet rs = null;

try {
con = JdbcUtil.getConnection();

String sql = "SELECT image FROM ImageLibrary WHERE id = " + id;
st = con.createStatement();
while (rs.next()) {
Blob image = rs.getBlob("image");

BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(fileName));
BufferedInputStream in = new BufferedInputStream(
image.getBinaryStream());

int c;
while ((c = in.read()) != -1) {
out.write(c);
}
in.close();
out.close();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(rs, st, con);
}
}

public static void main(String[] args) throws Exception {
ImageLibraryService service = new ImageLibraryService();

if (args.length == 3) {
service.addImage(Long.parseLong(args[0]), args[1], args[2]);
} else {
service.restoreImage(Long.parseLong(args[0]), args[1]);
}
}

}


执行的时候用添加参数1 top1 top1.jpg

结果就出这个问题,那老师在演示时就完全没有这样的问题。不知道是怎么回事。

java.lang.NullPointerException
at com.allanlxf.util.JdbcUtil.close(JdbcUtil.java:27)
at core20.sql3.ImageLibraryService.addImage(ImageLibraryService.java:45)
at core20.sql3.ImageLibraryService.main(ImageLibraryService.java:120)
Exception in thread "main" java.lang.NullPointerException
at com.allanlxf.util.JdbcUtil.close(JdbcUtil.java:43)
at core20.sql3.ImageLibraryService.addImage(ImageLibraryService.java:76)
at core20.sql3.ImageLibraryService.main(ImageLibraryService.java:120)

求高手解决。
驱动:ojdbc6.jar
--------------------编程问答-------------------- 当然,如果直接用setBinaryStream(参数1, 参数2, 参数3)方法,前面不用ResultSet,可以成功存取。但是为什么用ResultSet后,那个老师的演示没有问题,我的代码就出异常呢?谢谢各位了!新手 --------------------编程问答-------------------- 高深不懂、路过帮顶、上班。。。 --------------------编程问答-------------------- ???好像我的提问有什么毛病吗? --------------------编程问答-------------------- 求教,实在是不知道怎么解决了。拜托各位了。 --------------------编程问答-------------------- top1.jpg

改成完整路径试试,怀疑路径问题不对 --------------------编程问答-------------------- 直接用setBinaryStream(参数1, 参数2, 参数3)方法,前面不用ResultSet,可以成功存取。但是为什么用ResultSet后,那个老师的演示没有问题,我的代码就出异常呢?谢谢各位了!新手 --------------------编程问答--------------------
引用 5 楼 wangjiangbo2 的回复:
top1.jpg

改成完整路径试试,怀疑路径问题不对


路径没有问题,用过完整路径。我在1楼写的那个异常好像有问题。报的是java.sql.SQLException: 调用中的无效参数。还有我在百度提问有一个和这个差不多的例子,http://zhidao.baidu.com/question/320918615.html。也是这种异常。不明白是为什么。 --------------------编程问答-------------------- 现在报的是java.sql.SQLException: 调用中的无效参数
这个异常

打印异常栈信息最下边一条是
blob.setBinaryStream(0);这句有错。实在是想不出来为什么了。视频中老师的代码一模一样的,却执行得很好。 --------------------编程问答-------------------- oracle用blob.setBinaryStream(0);可以 db2必须是blob.setBinaryStream(1); --------------------编程问答-------------------- 看下你的   JdbcUtil.close 方法 。

里面 关闭的对象的时候 ,有没有先判断 参数是否为空 。
应该这样子格式关闭。
if(rs == null){ 
  rs.close() ;
}
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,