当我从数据库中读取blob数据时,我得到null
值。可能是什么问题?有人可以帮我这个吗?
Connection con = null;
PreparedStatement psStmt = null;
ResultSet rs = null;
try {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
con =
DriverManager.getConnection("jdbc:oracle:thin:@MyDatabase:1535:XE","password","password");
System.out.println("connection established"+con);
psStmt = con
.prepareStatement("Select Photo from Person where Firstname=?");
int i = 1;
psStmt.setLong(1, "Nani");
rs = null;
rs = psStmt.executeQuery();
InputStream inputStream = null;
while (rs.next()) {
inputStream = rs.getBinaryStream(1);
//Blob blob = rs.getBlob(1);
//Blob blob1 = (Blob)rs.getObject(1);
//System.out.println("blob length "+blob1);//rs.getString(1);
}
System.out.println("bytessssssss "+inputStream);//here i am getting null value.
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:1)
我相信您没有使用setString
函数为firstname分配任何导致null的值
例如:
ps.preparedStatement("Select photo from person where firstname = ?");
ps.setString(1,"kick"); <----- add this line
system.out.println("bytes "+rs.getBinaryStream(1));
另一个建议
没有必要在try catch块中使用rs = null;
,因为您在开头有rs=null;
你的代码。
变化
InputStream inputStream = null;
到
InputStream inputStream = new InputStream();
或
摆脱InputStream inputStream = null;
答案 1 :(得分:0)
最明显的错误是使用setLong而不是setString。
然而,一种做法是致命的:事先宣布。这在其他语言中是一种很好的做法,但在java中应该尽可能地声明。
这会减少您发现错误的范围!即在循环外的rs.next()
失败后调用inputStream。也许是因为没有找到记录。
这种做法虽然声称尽可能接近,但也有助于尝试使用资源来自动关闭语句和结果集。
Connection con = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(
"jdbc:oracle:thin:@MyDatabase:1535:XE","password","password");
System.out.println("connection established"+con);
try (PreparedStatement psStmt = con.prepareStatement(
"Select Photo from Person where Firstname=?")) {
int i = 1;
psStmt.setString(1, "Nani");
try (ResultSet rs = psStmt.executeQuery()) {
while (rs.next()) {
try (InputStream inputStream = rs.getBinaryStream(1)) {
//Blob blob = rs.getBlob(1);
//Blob blob1 = (Blob)rs.getObject(1);
//System.out.println("blob length "+blob1);//rs.getString(1);
Files.copy(inputStream, Paths.get("C:/photo-" + i + ".jpg"));
}
++i;
}
//ERROR System.out.println("bytessssssss "+inputStream);
} // Closes rs.
} // Closes psStmt.
}
答案 2 :(得分:0)
1-在设置SQL查询的参数值时,在代码中,请务必使用该字段的相应数据类型。所以在这里你应该使用
psStmt.setString(1, "Nani");
而不是
psStmt.setLong(1, "Nani");
2-确保查询正确(表名,字段名称)。
3-确保该表包含数据。