我有一些我用学校创建的数据库任务。每个任务记录都有用户名,描述,任务日,任务时间列。
我想通过两个值来提取记录:taskhour和taskday或每个值。
所以我有一个函数来获取一个任务对象并检查taskday或taskhour是否为空并相应地准备查询。但是由于某些原因,ResultSet出了问题...这是我的功能:
public List<Task> getUserTasks(Task task) throws SQLException {
List<Task> listOfTasks = new ArrayList<>();
try {
String query = "";
PreparedStatement pStatement;
if (task.getDay() != 0 && task.getHour() != 0) {
query = "select * from TASKS where USERNAME=? and TASKDAY=? and TASKHOUR=?";
pStatement = connection.prepareStatement(query);
pStatement.setString(1, task.getUsername());
pStatement.setInt(2, task.getDay());
pStatement.setInt(3, task.getHour());
} else if (task.getDay() == 0) {
query = "select * from TASKS where USERNAME=? and TASKHOUR=?";
pStatement = connection.prepareStatement(query);
pStatement.setString(1, task.getUsername());
pStatement.setInt(2, task.getHour());
} else {
query = "select * from TASKS where USERNAME=? and TASKDAY=?";
pStatement = connection.prepareStatement(query);
pStatement.setString(1, task.getUsername());
pStatement.setInt(2, task.getDay());
}
ResultSet rs;
rs = pStatement.executeQuery();
if (rs.next()) {
Task taskToAdd = new Task();
taskToAdd.setUsername(rs.getString("USERNAME"));
taskToAdd.setDescription(rs.getString("DESCRIPTION"));
taskToAdd.setDay(rs.getInt("TASKDAY"));
taskToAdd.setHour(rs.getInt("TASKHOUR"));
listOfTasks.add(taskToAdd);
}
} catch (SQLException ex) {
ex.printStackTrace();
}
return listOfTasks;
}
我做错了吗?
谢谢!
答案 0 :(得分:0)
在设置$ query的if else
块之后,代码接下来再次设置$ query。消除刚刚在if else
块中完成的工作。
作为首发,删除此行前面的七行:
ResultSet rs;
<强>更新强>
规范说&#34;检查任务日或任务时间&#34;是空的。
条件测试(!= 0
)正在检查不等式为零。
我不清楚&#34;不等于零&#34;是什么意思是&#34;空&#34;。
我们不知道的是getDay
和getHour
方法返回的类型。从代码中看,它们似乎正在返回int
原语。 (鉴于没有测试null,并且比较是整数文字。)但这只是一个假设;我没办法检查。
我通常会在不平等比较中包括一些问题。
if ( ( task.getDay() != 0 ) && ( task.getHour() != 0 ) ) {
^ ^ ^ ^
我不认为Java中需要额外的parens。但我相当肯定这不是非法的。但我并不是一个真正的Java人。 (当我包括这样的额外的parens时,它会照顾我的运算符优先级。(我不必记住哪个运算符具有更高的优先级。)
此外,SELECT语句正在执行SELECT *
。我会明确列出要返回的列,而不是使用*
。例如:
SELECT t.USERNAME, t.DESCRIPTION, t.TASKDAY, t.TASKHOUR FROM TASKS t ...
但我并不认为这是导致问题的原因。
我很担心没有finally
块关闭声明。
} finally {
if (pStatement != null) { pStatement.close(); }
}
另外,我会将返回getDay()
和getHour()
分配给局部变量。在进入方法时,我只做了一次。
然后我在条件测试中引用局部变量,并作为方法中的参数来绑定到预准备语句。
但是,我再也不认为你所写的方式有任何特别的违法行为。
对于调试,我会忽略从getDay()和getHour()返回的值,并为局部变量分配特定的文字。我会这样做来完成所有的逻辑。
除了这些评论之外,我无法为您调试程序。
How to debug small programs http://ericlippert.com/2014/03/05/how-to-debug-small-programs/
答案 1 :(得分:0)
您想从结果集中返回多行吗?
要获取所有行,请使用 while
而非 if
:
while (rs.next())
^^^^^
while
形成一个循环,将重复循环,直到表达式rs.next()
不再评估为真。
if
仅执行一次。你最多会回来一行。