2016-03-22 66 views
0

我有一些爲任務創建的數據庫。每個任務記錄都有用戶名,說明,任務日,任務時間列。無法從SQL執行中正確獲取ResultSet

我想通過兩個值拉動記錄: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;  
} 

我做錯了什麼?

謝謝!

+0

「...... ResultSet出錯了......」您必須比這更具體。 * ResultSet有什麼錯誤? –

+0

我懷疑問題是返回的ArrayList至多包含一行。我懷疑你想**'while(rs.next())'**。使用'while'來形成一個循環,所以動作重複,直到沒有更多的行可以被檢索。 (我仍然支持我之前回答中的所有建議,特別是在'finally'塊中關閉該語句。) – spencer7593

回答

0

難道你想從結果集返回多行?

要獲得該行的所有使用while沒有if

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

while形成一個循環,這將重複進行,直到表達rs.next()不再評估爲true。

if只執行一次。最多隻能返回一行。

0

在設置$ query的if else塊之後,代碼接下來再次設置$ query。清除if else區塊剛剛完成的工作。

作爲起動機,取出七行立即此行前面:

ResultSet rs; 

UPDATE

的規範說 「檢查taskday或taskhour」 是空的。

條件測試(!= 0)正在檢查不等式爲零。

我不清楚「不等於零」是什麼意思是「空」。

我們沒有看到的是getDaygetHour方法返回的類型。從代碼看,它們看起來像是返回原語。 (假設沒有測試null,並且比較是整數文字)。但這只是一個假設;我沒有辦法檢查。

我通常會在不平等比較中加入parens。

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/

+0

對不起,在if/else之後沒有假設存在,編輯了代碼。這不是問題.. – JohnBigs