无法从SQL执行中正确获取ResultSet

时间:2016-03-22 21:29:48

标签: java mysql sql prepared-statement resultset

我有一些我用学校创建的数据库任务。每个任务记录都有用户名,描述,任务日,任务时间列。

我想通过两个值来提取记录: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;      
}   

我做错了吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

在设置$ query的if else块之后,代码接下来再次设置$ query。消除刚刚在if else块中完成的工作。

作为首发,删除此行前面的七行:

ResultSet rs;

<强>更新

规范说&#34;检查任务日或任务时间&#34;是空的。

条件测试(!= 0)正在检查不等式为零。

我不清楚&#34;不等于零&#34;是什么意思是&#34;空&#34;。

我们不知道的是getDaygetHour方法返回的类型。从代码中看,它们似乎正在返回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仅执行一次。你最多会回来一行。