0

通过以下代码段,我尝试运行一个查询,该查询要么更新数据,要么将新数据插入名为JustPinged. 该表包含一个名为NodesThatJustPingedand的列LastPingedAt。如果已经有一个节点,则更新NodesThatJustPinged以毫秒为单位的时间。LastPingedAt否则node插入新信息。

问题是,以下代码段无法将数据插入到数据库的表中。原因是声明:

boolean duplicateExists = searchToEliminateDuplicates.execute();

返回true开始。(最初表是空的)为什么这个语句返回true?根据文档,如果第一个结果是 ResultSet 对象,则返回true;如果第一个结果是更新计数或没有结果,则返回 false。所以这里的布尔值应该包含一个假值。但它包含一个true值,因此该if语句始终有效。(在if部分中,更新查询在没有任何更新时有效!)

String searchQuery = "select NodesThatJustPinged from JustPinged where NodesThatJustPinged = '" + nodeInfo + "'";
PreparedStatement searchToEliminateDuplicates = connection.prepareStatement(searchQuery);
boolean duplicateExists = searchToEliminateDuplicates.execute();

if(duplicateExists) {
    // update the LastPingedAt column in the JustPinged table 
    String updateQuery = "update JustPinged set LastPingedAt='" + pingedAt + "' where NodesThatJustPinged = '" + nodeInfo + "'";
    PreparedStatement updateStatement = connection.prepareStatement(updateQuery);
    updateStatement.executeUpdate();System.out.println("If statement");
} else {
    // make a new entry into the database
    String newInsertionQuery = "insert into JustPinged values('" + nodeInfo + "','" + pingedAt + "')";
    PreparedStatement insertionStatement = connection.prepareStatement(newInsertionQuery);
    insertionStatement.executeUpdate();System.out.println("else statement");              
}

那么我应该如何编辑代码,以便更新重复值并插入新值?

4

2 回答 2

1

您的 searchQuery 将返回 ResultSet。因此执行方法返回“真”。尝试改用 executeQuery。

所以你的代码会变成:

String searchQuery = "select NodesThatJustPinged from JustPinged where NodesThatJustPinged = '" + nodeInfo + "'";
    Statement searchToEliminateDuplicates = connection.createStatement();
    ResultSet duplicateExists = searchToEliminateDuplicates.executeQuery(searchQuery);

    if(duplicateExists.next()) {
        // update the LastPingedAt column in the JustPinged table 
        String updateQuery = "update JustPinged set LastPingedAt='" + pingedAt + "' where NodesThatJustPinged = '" + nodeInfo + "'";
        PreparedStatement updateStatement = connection.prepareStatement(updateQuery);
        updateStatement.executeUpdate();System.out.println("If statement");
    } else {
        // make a new entry into the database
        String newInsertionQuery = "insert into JustPinged values('" + nodeInfo + "','" + pingedAt + "')";
        PreparedStatement insertionStatement = connection.prepareStatement(newInsertionQuery);
        insertionStatement.executeUpdate();System.out.println("else statement");              
      }

PS 如果您使用的是 PreparedStatement,请在查询中使用参数并调用 ps.setString 等。

聚苯乙烯。不要使用 execute() 方法。使用 executeQuery 或 executeUpdate。如果您事先不知道您的查询是 INSERT 还是 UPDATE,则使用 execute()。

PPPS 完成后立即关闭您的结果集和语句。

PPPPS 更好的方法是在 SQL 语句中使用 count 聚合函数,即

select count(NodesThatJustPinged) from JustPinged where NodesThatJustPinged = '" + nodeInfo + "'";

现在您可以检查 count 是 0 还是大于 1 并相应地分支您的代码。

于 2013-01-04T05:51:50.373 回答
1

返回零行的SELECT语句仍将返回一个ResultSet-- 只是一个在调用 next() 时立即返回 false 的语句。您需要检查返回的 ResultSet 中的行数。

于 2013-01-04T05:53:46.873 回答