2014-10-12 62 views
3

JDBC返回一個空的ResultSet(rs.isBeforeFirst()== true)我試圖爲我的Web服務完成一個數據庫訪問方法。服務和數據庫訪問方法適用於數據庫中的所有其他表,但這種特定的方法不適用。當我查詢數據庫時,ResultSet總是返回空(意思是isBeforeFirst() == true)。雖然表不是空的

經過多次嘗試之後,我將查詢切換到一個簡單的SELECT * FROM VIDEOS,以查看問題是否與我輸入的數據和我在查詢中使用的數據之間存在差異,但即使這個簡單的查詢選擇表中的所有項目也沒有不會返回任何結果。

這是我使用從DB拉動信息的方法:

public static Object[] getVideo(String phonenum, String timeStamp) 
{ 
    Connection c = null; 
    Statement stmt = null; 
    Object[] result = null; 
    try 
    { 
     Class.forName("org.sqlite.JDBC"); 
     c = DriverManager.getConnection("jdbc:sqlite:lineappDB.db"); 
     c.setAutoCommit(false); 
     System.out.println("Opened database successfully"); 
     stmt = c.createStatement(); 
     String query = String.format("SELECT * FROM VIDEOS"); 
     ResultSet rs = stmt.executeQuery(query); 

     // If no data was found 
     if (rs.isBeforeFirst()) 
     { 
      rs.close(); 
      stmt.close(); 
      c.close(); 
      return null; 
     } else 
     { 
      result = new Object[6]; 
      while (rs.next()) 
      { 
       result[0] = rs.getInt(1); 
       result[1] = rs.getString(2); 
       result[2] = rs.getString(3); 
       result[3] = rs.getString(4); 
       result[4] = rs.getString(5); 
       result[5] = rs.getInt(6); 
      } 
     } 
     rs.close(); 
     stmt.close(); 
     c.close(); 
    } catch (Exception e) 
    { 
     try 
     { 
      if (!c.isClosed()) 
      { 
       c.commit(); 
       c.close(); 
      } 
     } catch (Exception ex) 
     { 
      System.err.println(ex.getClass().getName() + ": " + ex.getMessage()); 
      return null; 
     } 
     System.err.println(e.getClass().getName() + ": " + e.getMessage()); 
     return null; 
    } 
    System.out.println(String.format("Succesfully pulled from DB - %s %s", result[1], result[2])); 
    return result; 
} 

任何幫助將是非常讚賞。

CLARIFICATION編輯: 該方法是一個Web服務的一部分,該服務從數據庫中提取某個視頻的路徑,以發送給客戶端。這些視頻由客戶端上傳,然後存儲在文件系統中,其路徑存儲在數據庫中。

一旦我看到DB工作,我將用SELECT * FROM VIDEOS WHERE PHONENUM = '%s' AND DATETIME = '%s'", phonenum, timeStamp替換SELECT * FROM VIDEOS,以便查詢提取我需要的確切項目。

+1

我會把所有的'.close()'命令插入到'finally'阻止 – David 2014-10-12 11:42:00

+0

@大衛感謝您的建議,我會這樣做。 – 1CodeRed 2014-10-12 11:45:53

+0

@David當我把'.close()'命令放在'finally'塊中時,eclipse大聲說我沒有處理異常。所以我需要再次使用雙重try catch塊。你能展示一個正確的例子嗎? – 1CodeRed 2014-10-12 11:52:33

回答

3

isBeforeFirst()返回true如果下次調用next()會將光標放在ResultSet的第一行。換句話說,任何有數據的成功查詢一旦執行,將產生一個ResultSetisBeforeFirst()返回true

剛剛從你的代碼中刪除該塊,並有rs.next()循環處理潛在的空ResultSet S:

try 
{ 
    Class.forName("org.sqlite.JDBC"); 
    c = DriverManager.getConnection("jdbc:sqlite:lineappDB.db"); 
    c.setAutoCommit(false); 
    System.out.println("Opened database successfully"); 
    stmt = c.createStatement(); 
    String query = String.format("SELECT * FROM VIDEOS"); 

    result = new Object[6]; 
    ResultSet rs = stmt.executeQuery(query); 
    while (rs.next()) 
    { 
     result[0] = rs.getInt(1); 
     result[1] = rs.getString(2); 
     result[2] = rs.getString(3); 
     result[3] = rs.getString(4); 
     result[4] = rs.getString(5); 
     result[5] = rs.getInt(6); 
    } 
} 
/* catch and finally snipped for clarity of the answer */ 
+0

非常簡單的解決方案,非常感謝。我很驚訝,我沒有得到與其他表的問題。多麼愚蠢的錯誤:) – 1CodeRed 2014-10-12 11:46:11

+1

(cc:@ 1CodeRed)+1用於解釋「.isBeforeFirst()」的真正含義。事實上,對於一個空的ResultSet的測試是當'.isBeforeFirst()'返回'false'時,而不是'true'(正如OP所想的那樣)。 – 2014-10-12 11:48:04