getBinaryStream(索引)问题

时间:2014-09-29 07:45:23

标签: java oracle jdbc

当我从数据库中读取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();

        }

3 个答案:

答案 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;

source you should take a look at

答案 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-确保该表包含数据。