繁体   English   中英

无法从SQL执行正确获取ResultSet

[英]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 )正在检查不等式为零。

我不清楚“不平等到零”是什么意思“空”。

我们看不到的是getDaygetHour方法返回的类型。 从代码看来,它们似乎正在返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM