我必须要有一些非常微妙的东西。
我有一个名为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();
}
实际上,我有ArrayList
个这些LogRecord
并且它们绑定到TableView
JavaFX控件。我可以看到这个查询只返回大约25%的结果。 (在_userID
不为空的情况下,我将query failed
设置为_pk1
,以便我可以识别查询应该返回{{1}的情况}}
为了进一步调试,我将此代码添加到userID
的{{1}}方法中,以便我可以检查可疑记录。
TableView
我可以从输出中看出,click()
确实被正确捕获,并且正在执行的查询 正确。 (而且,正如我所提到的,它大约有25%的时间都有效。)
单击可疑记录时控制台输出的示例:
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);
}
如果我复制查询并将其粘贴到Microsoft SQL Server Management Studio中,则会返回正确的用户ID。 (因此,我应在_pk1
中获取内容。)
我希望有人可以解释为什么我大部分时间都会得到空的结果集。
我正在使用sqljdbc4,JDK 8和SQLServer 2008 R2。
答案 0 :(得分:1)
使用preparedStatement并正确绑定参数。由于列pk1的类型,可能会产生错误。
查看哪种类型的列是pk1并使用相关集。
String userIDQuery = "select user_id from users where pk1 = ?";
java.sql.PreparedStatement statement = _connection.prepareStatement(userIDQuery);
statement.setString(1, _pk1.trim());
答案 1 :(得分:0)
原始代码关闭两次,异常处理可疑。在例外情况下,不会结束。请尝试以下方法。
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();
}
也许抓住并重新抛出异常,记录它。