2014-09-29 132 views
2

当我从数据库中读取blob数据时,得到的值为null。什么可能是这个问题?有人能帮助我吗?getBinaryStream问题(索引)

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(); 

     } 

回答

1

我相信你没有使用setString功能分配任何价值姓从而导致空

例如:

ps.preparedStatement("Select photo from person where firstname = ?"); 
ps.setString(1,"kick"); <----- add this line 
system.out.println("bytes "+rs.getBinaryStream(1)); 

另一个建议

没有必要使用rs = null;内部try catch块,因为你的代码在 开头有rs=null;

变化

InputStream inputStream = null; 

InputStream inputStream = new InputStream(); 

摆脱InputStream inputStream = null;

source you should take a look at

+0

感谢您的回答。我更新了我的问题,请通过。尽管我遇到了同样的问题,但我已经完成了你所提到的任何事情。 – Nani 2014-09-29 08:13:12

+0

@Nani可以更改InputStream inputStream = null;到InputStream inputStream = new InputStream()plz? – 2014-09-29 08:16:30

+0

@Nani摆脱rs = null;在你的try catch块内 – 2014-09-29 08:18:49

0

最Ô bvious错误是使用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. 
} 
+1

@KickButtowski绝对的点,但是我也看到inputStream被保留_after_ rs.next循环;因此我的答案。另外,因为我想纠正可能成为内嵌的声明风格。 – 2014-09-29 08:45:13

0

1-在您的代码中设置SQL查询的参数值时,请务必使用该字段的适当数据类型。所以在这里,你应该使用的

psStmt.setString(1, "Nani"); 

代替

psStmt.setLong(1, "Nani"); 

2-确保查询是正确的(表名,字段名)。

3-确保该表包含数据。