【问题标题】:Cant get properly the ResultSet from SQL execution无法从 SQL 执行中正确获取 ResultSet
【发布时间】:2016-07-10 00:02:48
【问题描述】:

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

我想按两个值提取记录:taskhour 和 taskday 或单独一个。

所以我有一个函数来获取任务对象并检查任务日或任务小时是否为空并相应地准备查询。但由于某种原因,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;      
}   

我做错了吗?

谢谢!

【问题讨论】:

  • "...ResultSet 出了点问题..." 您必须比这更具体。 什么 ResultSet 有问题?
  • 我怀疑问题是返回的 ArrayList 最多包含一行。我怀疑你想要 while (rs.next())。使用while 形成一个循环,重复这些动作,直到没有更多行可以检索。 (我仍然支持我之前回答中的所有建议,尤其是在 finally 块中结束声明。)

标签: java mysql sql prepared-statement resultset


【解决方案1】:

在设置 $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() 返回的值,并将特定文字分配给局部变量。我会这样做来处理所有的逻辑。

除了那些 cmets,我真的不能为你调试你的程序。

How to debug small programs http://ericlippert.com/2014/03/05/how-to-debug-small-programs/

【讨论】:

  • 抱歉,if/else 后面的排行不应该在那里,编辑了代码。这不是问题..
【解决方案2】:

您想从结果集中返回多行吗?

要获取所有行,请使用 while 而不是 if

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

while 形成一个循环,将重复该循环,直到表达式 rs.next() 不再计算为真。

if 只执行一次。您最多只能返回一行。

【讨论】:

    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多