为什么getGeneratedKeys()在INSERT后没有返回任何结果?

时间:2013-02-07 09:48:08

标签: sql jdbc

我有一个表,其中有一列定义为auto-generate-key。当执行以下代码时,我希望生成一个新密钥,但事实并非如此。插入了一行,但ps.getGeneratedKeys()的ResultSet为空。

我正在使用DB2:SQLLIB_ADCL_V97FP1。

        conn = getConnection();
        conn.setAutoCommit(false);
        String query = 
            "INSERT INTO MyTable " +
            "  (messe_nr, land5, variable_nr, bezeichnung_en, bezeichnung_de) " +
            "VALUES (?,?,?,?,?)";

        PreparedStatement ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
        ps.setInt(1, fair.getFairId());
        ps.setString(2, variable.getCountryCode());
        ps.setInt(3, variable.getSort());
        ps.setString(4, variable.getLabel_en());
        ps.setString(5, variable.getLabel_de());

        log.debug(query);
        int count = ps.executeUpdate();
        if(count == 1) {
            ResultSet rs = ps.getGeneratedKeys();
            if(rs.next()) {
                variable.setId(rs.getBigDecimal(1).intValue());
            } else {
                log.error("Could not get autogen key after variable insert");
                throw new AVMSException(1500);
            }
            rs.close();
        }
        log.debug("inserted " + count);

        ps.close();
        conn.commit();

更新

我刚刚将项目部署到测试服务器,但问题没有发生。在我的开发系统上有些东西被打破 - 但是什么?我确实安装了一天或两天的Java更新 - 1.7.0_13 - 可能导致这样的问题: - /?

2 个答案:

答案 0 :(得分:3)

尝试一下,这对我有用:

prepStmt = con.prepareStatement(sql, new String[]{"YOUR_ID_FIELD"});

//Setting Bind-Variables

prepStmt.executeUpdate();

        rs = prepStmt.getGeneratedKeys();  
        while (rs.next())
        {
            tAdresse.getAdressid().setValue(rs.getInt(1));
            System.out.println("Key: " + tAdresse.getAdressid().getIntValue());
        }

答案 1 :(得分:1)

您应该传递“ Statement.RETURN_GENERATED_KEYS”作为PreparedStatement的第二个参数。 代码看起来像这样:-

Class.forName("com.mysql.cj.jdbc.Driver");

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database_name?user=databse_username&password=database_password");

PrepardStatement ps = conn.prepareStatement("INSERT INTO author(authorName) values(?)", Statement.RETURN_GENERATED_KEYS);

ps.setString(1, "Mark Twain");

int i = ps.executeUpdate();
System.out.println(i + " Records Added.");

ResultSet gK = ps.getGeneratedKeys();
if(gK.next()) {
long generatedId = gK.getLong(1);
} else {
System.out.println("Message => Generated Key cannot be accessed.");
}
} catch (SQLException e) {
e.printStackTrace();
}

“ author”是表名,“ authorName”是列名。