[英]Cant get properly the ResultSet from SQL execution
我有一些使用Tasks为学校创建的数据库。 每个任务记录都有用户名,描述,任务日,任务小时列。
我想通过两个值来提取记录: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;
}
难道我做错了什么?
谢谢!
在设置$ query的if else
块之后,代码接下来再次设置$ query。 清除if else
块中刚刚完成的工作。
首先,删除此行之前的七行:
ResultSet rs;
更新
规范显示“检查工作日或工作时间是否为空”。
条件测试( != 0
)正在检查不等式为零。
我不清楚“不平等到零”是什么意思“空”。
我们看不到的是getDay
和getHour
方法返回的类型。 从代码看来,它们似乎正在返回int
原语。 (考虑到没有测试null的方法,而将其与整数文字进行比较。)但这只是一个假设; 我没有办法检查。
我通常会在不平等比较中加入括号。
if ( ( task.getDay() != 0 ) && ( task.getHour() != 0 ) ) {
^ ^ ^ ^
我认为Java中不需要额外的括号。 但是我相当确定这不是违法的。 但是我不是一个真正的Java人。 (当我添加这样的额外括号时,这将为我照顾到运算符的优先级。(我不必记住哪个运算符具有更高的优先级。)
另外,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()返回的值,并为本地变量分配特定的文字。 我会这样做以通过所有逻辑。
除了这些注释,我无法真正为您调试程序。
如何调试小型程序 http://ericlippert.com/2014/03/05/how-to-debug-small-programs/
您是否要从结果集中返回多个行?
要获取所有行,请while
不使用if
使用:
while (rs.next())
^^^^^
while
形成一个循环,该循环将重复进行直到表达式rs.next()
不再计算为true。
if
仅执行一次。 您最多只能返回一排。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.