PreparedStatement不替换setBytes

时间:2015-11-10 10:25:49

标签: java postgresql prepared-statement

目前我正面临着Java中PreparedStatements的一个奇怪问题。

我生成一个带有9个参数的SQL语句,用于将信息存储到我的postgres数据库中(整数,带时区的时间戳,双倍,双倍,双倍,双倍,带时区的时间戳,带时区的时间戳和bytea)。 / p>

最后一列出现问题(bytea格式化)。我想存储一个序列化的对象。序列化工作正常,使用相同的代码,我已经将对象存储到另一个不同数据库的表中。

以下是我使用的代码(重要部分):

String sql = "INSERT INTO archiv_database VALUES(?,?,?,?,?,?,?,?,?);";
Connection con;
PreparedStatement preparedStatement;        
long millis = System.currentTimeMillis();
byte[] data = KryoIO.kryoSerializeObjectToBytes(myObject);

GregorianCalendar calendar = new GregorianCalendar();

try {
        con = ResourcesHelper.getConnectionToPGDatabase("jdbc:postgresql://ipadress/db", "user", "password");
        preparedStatement = con.prepareStatement(sql);

        preparedStatement.setInt(1, 0);
        preparedStatement.setTimestamp(2, new Timestamp(millis), calendar);
        preparedStatement.setDouble(3, 0);
        preparedStatement.setDouble(4, 0);
        preparedStatement.setDouble(5, 0);
        preparedStatement.setDouble(6, 0);
        preparedStatement.setTimestamp(7, myObject.getValidFrom(), calendar);
        preparedStatement.setTimestamp(8, myObject.getValidUntil(), calendar);
        preparedStatement.setBytes(9, data);

        if(preparedStatement.toString().contains("?")){
            System.err.println("Statement still contains a ? and can't be executed");
        } else{
            int n = preparedStatement.executeUpdate();
            System.out.println("Stored into " + n + " row(s).");
        }

        preparedStatement.close();
        con.close();

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

语句准备正确,直到调用setBytes方法。那里的数据没有放入声明中。之后占位符仍然存在。我已经用调试模式检查了数据。序列化工作没有错误,byte []填充数据。以下是在所有9个方法之后语句的样子:

INSERT INTO archiv_database VALUES(0,'2015-11-10 11:19:24.430000 +01:00:00',0.0,0.0,0.0,0.0,'2015-11-03 14:04:24.000000 +01:00:00','2015-11-03 14:07:04.000000 +01:00:00',?)

声明本身正在发挥作用。如果我填写一些虚拟数据(对象为null),我已经通过PGAdmin III自己测试了它。但正如您所看到的那样,即使数据变量保存数据,最后一个占位符仍然存在且未被替换。

也许有些人知道如何解决问题。如果您需要更多信息,请直接询问。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

感谢a_horse_with_no_name提供有关提交的信息。看来我从同事那里使用的连接助手类没有自动提交,所以我需要调用con.commit()方法,确保所有内容都正确存储。

感谢大家的帮助:)。