我一定遗漏了一些非常微妙的东西。
我有一个班叫LogRecord
。它有一个成员String _pk1
和String _userID
。我从日志文件中获取_pk1
,然后使用_pk1
查询数据库并查找_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();
}
在实践中,我有这些LogRecord
的ArrayList
,并且它们绑定到TableView
JavaFX控件。我可以看到,这个查询只在大约25%的时间内返回结果。(在_pk1
不为空的情况下,我将_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);
}
我可以从输出中判断出_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。(因此,我应该在ResultSet
中得到一些东西。)
我希望有人能解释为什么我大部分时间都得到空的结果集。
我使用的是sqljdbc4、JDK8和SQLServer2008R2。
使用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();
}
也许可以捕获并重新抛出异常,将其记录下来。