executeUpdate被阻止

时间:2019-10-25 08:33:47

标签: java sql sql-server jdbc prepared-statement

当代码进入“ pstmt.executeUpdate()”步骤时,它冻结并被阻止,我没有收到任何SQL异常

这可行:

SQL = "INSERT INTO Procedure (file_path,id) VALUES ('/test/file_test.pdf',512);";
pstmt = con.prepareStatement(SQL,Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();

这不起作用!而且我没有收到任何例外,并且已被阻止:

SQL = "INSERT INTO Procedure (file_path,id) VALUES (?,?);";
pstmt = con.prepareStatement(SQL,Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, "/test/file_test.pdf");
pstmt.setInt(2, 512);
pstmt.executeUpdate();

我不明白为什么在使用下一个解决方案时我的代码会被阻止(我的意思是setStringsetInt)。

3 个答案:

答案 0 :(得分:0)

procedure是SQL中的保留关键字。可能是由于此引起的。 将过程表名称更改为其他名称,然后尝试。

您也可以尝试将“过程”更改为“过程”。

我希望这对您有用。

答案 1 :(得分:0)

使用“尝试/捕获”和调试器将为您提供有关该问题的更多信息。过去我有一个类似的问题,这就是我解决的方法。我不确定是什么问题,但是请尝试一下

public void getCar(String carName) {
String[] key = {"PRIMARY_KEY_COLUMN"};
try(Connection con = super.getConnection()) {
    String queryOne = "INSERT INTO Procedure (file_path,id) VALUES (?,?)";;
    try(PreparedStatement pstmt = con.prepareStatement(queryOne, key)){
        pstmt.setString(1, "/test/file_test.pdf");
        pstmt.setInt(2, 512);
        pstmt.executeUpdate();
        int generatedKey = getGeneratedKey(pstmt));
        pstmt.close();
    } catch (SQLException e) {
        e.printStackTrace();
        // Do somthing if connection is set but exception thrown
    }
} catch (SQLException e) {
    e.printStackTrace();
    // Do somthing else if connection couldn't be set
}
}

private int getGeneratedKey(PreparedStatement pstmt) throws SQLException {
    int generatedKey = 0;
    ResultSet rs = pstmt.getGeneratedKeys();
    if (rs.next()) {
        generatedKey = rs.getInt(1);
    }
    rs.close();
    return generatedKey;
}

答案 2 :(得分:0)

发现并修复了大家好错误

错误的原因:例如,假设我们有2个表B [Id,othercolumn]和A [Id,pathfile,fk_id_B] 我在表B上启动了启动事务(UPDATE记录id = 512) 但是我忘了在我盯着其他人在A上启动事务之前关闭事务(connection.commit(); connection.close()),因此导致冻结,因为记录(id = 512)仍由预览事务使用 解决方案:在A上开始交易之前,我在B上关闭交易

谢谢你们的帮助和参与:)