2016-03-22 17 views
0

私はTasksで学校用に作成したデータベースをいくつか持っています。各タスクレコードには、ユーザー名、説明、タスク日、タスク時間の列があります。SQLの実行からResultSetが正しく取得される

私はレコードを2つの値、つまりタスク時間とタスク日またはそれぞれ個別にプルしたいと考えています。

私はタスクオブジェクトを取得し、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;  
} 

私が何か間違ったことをやっていますか?

ありがとうございました!

+0

"...何かがResultSetに間違っています..."あなたはそれよりも具体的でなければなりません。 *何が* ResultSetに間違っていますか? –

+0

私は、返されるArrayListが多くても1つの行を含むことが問題だと思う。私はあなたが** '(rs.next())' **を望んでいると思う。ループを形成するには 'while'を使います。したがって、取り出す行がなくなるまでアクションは繰り返されます。 (私はまだ私の以前の答え、特にfinallyブロックの文を閉じることですべての提案をしています) – spencer7593

答えて

0

あなたは結果セットから複数の行を返すようにしたいでしたか?

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

whileフォームrs.next()はもはやtrueに評価される式まで繰り返されるループ、:

は、すべての行がない if whileを使用取得します。

ifは1回のみ実行されます。あなたは多くても1列に戻ります。

0

$ queryを設定するブロックif elseの後、コードは次に$ queryを再度設定します。 if elseブロックで行われたばかりの作業を消去します。

スターターとして、すぐにこのラインに先行する7行を削除:空で

仕様は言う

ResultSet rs; 

UPDATE "taskday又はtaskhourがどうかを確認"。

条件テスト(!= 0)は、不等式が0になっているかどうかをチェックしています。

「ゼロへの不等式」は「空」という意味です。

getDaygetHourメソッドで返されるタイプは何ですか。コードから、彼らはintプリミティブを返すように見えます。 (ヌルのテストはないと仮定すると、比較は整数リテラルになります)。しかしこれは単なる仮定です。私はチェックの方法がありません。

私は通常、不等式比較の周りに括弧を含めます。

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()から返された値を無視して、ローカル変数に特定のリテラルの割り当てを行います。私はそれをすべてのロジックを処理するために行います。

これらのコメントとは別に、あなたのプログラムを本当にデバッグすることはできません。

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

+0

申し訳ありませんが、if/elseの後ろに並んでいるコードは、コードを編集していませんでした。これは問題ではありません.. – JohnBigs

関連する問題