Java ResultSet为空,但应为';不可能

Java ResultSet为空,但应为';不可能,java,jdbc,resultset,Java,Jdbc,Resultset,我一定错过了一些非常微妙的东西 我有一个叫做LogRecord的类。它有一个成员String\u pk1和String\u userID。我从日志文件中获取\u pk1,然后使用\u pk1查询数据库并查找\u userID 我用于实现此目的的代码: private void setUserID() throws Exception { String userID = ""; if(_pk1.equalsIgnoreCase("")) { _userID

我一定错过了一些非常微妙的东西

我有一个叫做
LogRecord
的类。它有一个成员
String\u pk1
String\u userID
。我从日志文件中获取
\u pk1
,然后使用
\u pk1
查询数据库并查找
\u userID

我用于实现此目的的代码:

private void setUserID() throws Exception
{
    String userID = "";
    if(_pk1.equalsIgnoreCase(""))
    {
        _userID = "";
        return;
    }
    java.sql.Statement statement = _connection.createStatement();

    String userIDQuery = "select user_id from users where pk1 = '" + _pk1.trim() + "'";

    java.sql.ResultSet userIDRS = statement.executeQuery(userIDQuery);
    query = userIDQuery; //edit

    if(userIDRS.next())
    {
        userID = userIDRS.getString("user_id");
        userIDRS.close();
    }
    else
    {
        userID = "query failed";
    }

    _userID = userID;
    userIDRS.close();

    statement.close();
}
实际上,我有一个
ArrayList
这些
LogRecord
s,它们被绑定到
TableView
JavaFX控件。我可以看到,这个查询在大约25%的时间里只返回一个结果。(如果
\u pk1
不是空的,我将
\u userID
设置为
query failed
,以便识别查询应该返回
userID
的情况

为了进一步调试,我将此代码添加到
TableView
click()
方法中,以便检查可疑记录

private void tableRightClick(MouseEvent event) {
    LogRecord selectedLogRecord = tblRecords.getSelectionModel().getSelectedItem();
    //System.out.println(selectedLogRecord.getLogRecord());
    System.out.println("User's PK1:    " + selectedLogRecord.getPK1());
    System.out.println("Username:      " + selectedLogRecord.getUserID());
    System.out.println("User query:    " + selectedLogRecord.query);
}
我可以从输出中看出,
\u pk1
确实被正确捕获,并且正在执行的查询是正确的(而且,正如我所提到的,它在大约25%的时间内工作)

单击可疑记录时控制台输出的示例:

User's PK1:    459498
Username:      query failed
User query:    select user_id from users where pk1 = '459498'
如果我复制查询并将其粘贴到Microsoft SQL Server Management Studio中,它将返回正确的用户ID。(因此,我应该在
结果集中得到一些信息)

我希望有人能解释为什么我大部分时间都得到空结果集


我使用的是sqljdbc4、JDK 8和SQLServer 2008 R2。

使用preparedStatement并正确绑定参数。由于列pk1的类型,可能会产生错误

查看哪种类型的列是pk1,并使用相关的集合

    String userIDQuery = "select user_id from users where pk1 = ?";
    java.sql.PreparedStatement statement = _connection.prepareStatement(userIDQuery);
    statement.setString(1, _pk1.trim());

原始代码关闭两次,异常处理可疑。对于异常,未进行关闭。请尝试以下操作

private void setUserID() throws Exception {
    if (_pk1.equalsIgnoreCase("")) {
        _userID = "";
        return;
    }
    String userIDQuery = "select user_id from users where pk1 = ?";
    try (PreparedStatement statement = _connection.prepareStatement(userIDQuery)) {
        statement.setString(1, _pk1);
        try (ResultSet userIDRS = statement.executeQuery()) {
            String userID;
            if (userIDRS.next()) {
                userID = userIDRS.getString("user_id");
                //query = userIDQuery + " | " + _pk1;
            } else {
                userID = "query failed";
            }
            _userID = userID;
        } // userIDRS.close();
    } // statement.close();
}

可能捕获并重新显示异常,并记录它。

调用
trim()是个好主意
。虽然0应该是1。我非常希望这能起作用,但我得到了完全相同的结果。但是,
PreparedStatement
似乎是一个更好的对象,从现在起我将使用它。谢谢!请注意,您正在打印的查询可能不是您正在执行的查询。您只需要gning
query=userIDQuery
以防出现
next()
,而不是当它失败时!我在那里粘贴了旧代码。对不起,输出来自现在编辑的代码。我一直在使用简单的
printStackTrace()
在方法之外处理异常。我没有看到任何异常。但是,是的,我应该让
close()
方法中try-catch的
finally
块中的语句。谢谢!