我不确定原因,但由于某种原因,以下代码会跳过else
条件。我已经尝试过我能想到的一切,包括切换代码块,但它仍然会跳过else
部分。基本上,如果在String temp = "no"
数据库中找不到传递给方法的String docID
,我希望此方法返回FILESTATUS
,如果找到则String temp = "yes"
。
static String checkDocID(String docID)
{
String temp = null;
System.out.println("Checking if data already exists in database...");
try
{
Main.stmt = Main.con.createStatement();
String command = "SELECT * FROM FILESTATUS WHERE ID='" + docID + "'";
ResultSet queryResult = Main.stmt.executeQuery(command);
if (!queryResult.next())
{
temp = "no";
}
else
{
while (queryResult.next())
{
String result = queryResult.getString("ID");
if (result.equals(docID))
{
temp = "yes";
break;
}
}
}
Main.stmt.close();
}
catch (Exception ex) {ex.printStackTrace();}
return temp;
}
谢谢!
答案 0 :(得分:16)
因为您最终在“if”中再次调用queryResult.next()并再次在while中调用,所以您将跳过第一个结果。如果只有一个结果,则while循环将永远不会执行。
如果我可以提出一些建议:
result.equals(docID)
,因为查询已经确定了。答案 1 :(得分:6)
最好将此循环重构为:
static String checkDocId(String docId) {
String temp = "no";
while (queryResult.next()) {
String result = queryResult.getString("ID");
if (result.equals(docID)) {
temp = "yes";
break;
}
}
return temp;
}
有些人不喜欢使用break
(我通常不喜欢),所以你可以在你的while中使用布尔值(我发现它更像是英语,你可以直接告诉终止条件while
而不是在内部寻找if
:
static String checkDocId(String docId) {
boolean found = false;
while (queryResult.next() && !found) {
String result = queryResult.getString("ID");
found = result.equals(docID);
}
return found ? "yes" : "no";
}
否则你正在进行不必要的比较。请注意,while
只是if
,最后有goto
;)
就你的问题而言,保罗说的是正确的。无论如何,我仍然会重新构造循环,以使它更优雅。
答案 2 :(得分:3)
在对代码感到有点惊讶之后(泄漏数据库资源,不信任数据库,它返回正确的docID
,在不需要所有列的情况下执行SELECT *
,没有利用PreparedStatement
的SQL注入清理功能,使用String
而不是boolean
来表示真/假值,一个混乱的代码流,这是它应该如何真的代替:
private static final String SQL_EXIST_DOCID =
"SELECT id FROM filestatus WHERE id = ?";
public boolean exist(String docID) throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
boolean exist = false;
try {
connection = database.getConnection();
statement = connection.prepareStatement(SQL_EXIST_DOCID);
statement.setString(1, docID); // Shouldn't it be a Long instead? Characterbased PK's are *far* from efficient.
resultSet = statement.executeQuery();
exist = resultSet.next();
} finally {
if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}
return exist;
}
清晰,简洁和简单。有关使用基本JDBC 的更多见解,您可能会发现this article有用。我希望你认真学习它。真。
答案 3 :(得分:1)
rs.next()在每次调用后滚动当前光标
尝试
static String checkDocID(String docID)
{
String temp = null;
System.out.println("Checking if data already exists in database...");
try
{
Main.stmt = Main.con.createStatement();
String command = "SELECT * FROM FILESTATUS WHERE ID='" + docID + "'";
ResultSet queryResult = Main.stmt.executeQuery(command);
boolean found = queryResult.next();
if (!found)
{
temp = "no";
}
else
{
do {
String result = queryResult.getString("ID");
if (result.equals(docID))
{
temp = "yes";
break;
}
} while (queryResult.next())
}
Main.stmt.close();
}
catch (Exception ex) {ex.printStackTrace();}
return temp;
}
答案 4 :(得分:1)
在尝试阅读之前,您正在调用queryResult.next两次。为了证明这一点,请在其他地方之前(之前)放一个println或其他东西。
由于您是按特定ID选择的,因此移动到next()两次实际上会失败第二次(可能)并且永远不会执行while块。