代码之家  ›  专栏  ›  技术社区  ›  JohnBigs

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

  •  0
  • JohnBigs  · 技术社区  · 8 年前

    我有一些我用Tasks为学校创建的数据库。每个Task记录都有用户名、描述、taskday和taskhour列。

    我想通过两个值来提取记录: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 回复  |  直到 8 年前
        1
  •  0
  •   spencer7593    8 年前

    是否要从结果集中返回多行?

    得到 全部的 使用的行数 while if :

     while (rs.next())
     ^^^^^ 
    

    这个 虽然 形成循环,循环将重复,直到表达式 rs.next() 不再计算为true。

    这个 如果 仅执行一次。你最多只能回来一排。

        2
  •  0
  •   spencer7593    8 年前

    if else 块设置$query,代码接下来再次设置$query。抹去刚刚在 如果不是这样的话

    作为起动机,拆下紧邻这条线之前的七条线:

    ResultSet rs;
    

    更新

    规范说“检查任务日或任务小时是否为空”。

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

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

    我们看不到的是 getDay getHour 方法。从代码看,他们好像回来了 int 基本体。(假设没有测试null,并且比较是一个整数文字。)但这只是一个假设;我没有办法检查。

    我通常会在不平等比较中加入parens。

    if ( ( task.getDay() != 0 ) && ( task.getHour() != 0 ) )  {
         ^                    ^    ^                     ^
    

    我认为Java不需要额外的parens。但我相当肯定这并不违法。但我不是真正的爪哇人。(当我包含这样的额外的paren时,我会考虑运算符的优先级。(我不必记住哪个运算符的优先级更高。)

    此外,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/