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
似乎是一个更好的对象,从现在起我将使用它。谢谢!请注意,您正在打印的查询可能不是您正在执行的查询。您只需要gningquery=userIDQuery
以防出现next()
,而不是当它失败时!我在那里粘贴了旧代码。对不起,输出来自现在编辑的代码。我一直在使用简单的printStackTrace()
在方法之外处理异常。我没有看到任何异常。但是,是的,我应该让close()
方法中try-catch的finally
块中的语句。谢谢!