2009-05-24 59 views
0

我正在嘗試使用JDBC,並且我的查詢在某些情況下工作,但在其他情況下無法工作。 我真的很感激任何幫助。JDBC的奇怪問題,select返回null

我的一些代碼:

public Result getSpecificTopic() 
    { 
     String query = "Select msg_body, msg_author from lawers_topic_msg";// where msg_id=2 order by msg_id desc"; 
     try 
     { 
      con = mysql.getConnection(); 
      //Statement stmt = con.createStatement(); 
      PreparedStatement stmt = con.prepareStatement(query); 
      //stmt.setInt(1, topicId); 
      ResultSet rs = stmt.executeQuery(query); 
      int rowCount = rs.getRow(); 
      specificTopic = ResultSupport.toResult(rs); 

      con.close(); 
      stmt.close(); 
     } 
     catch(Exception e) 
     { 
     } 
     return this.specificTopic; 
    } 

    public void setTopicId(String num) 
    { 
     this.topicId = Integer.parseInt(num); 
    } 

    public int getTopicId() 
    { 
     return this.topicId; 
    } 

但是如果我改變

String query = "Select msg_body, msg_author from lawers_topic_msg"; 

String query = "Select msg_body, msg_author from lawers_topic_msg where msg_id = " + topicId; 

然後結果集retunrs沒什麼.... 我打破我的頭在這裏,仍然無法弄清楚是什麼問題

+3

你嘗試運行它之前打印查詢到控制檯?取出該輸出,然後直接對數據庫運行它。 – BobbyShaftoe 2009-05-24 10:26:54

+0

謝謝,你是對的。 我希望我能給你的評論接受答案。 – Dmitris 2009-05-24 11:04:05

回答

3

作爲第一步,應該確保一個異常沒有被拋出 - 至少在你的catch()塊中記錄一些東西。

也值得記錄生成的SQL,並確保實際上返回您期望從數據庫直接運行它時。

如果你有多個數據庫,那麼值得證實你對一個你認爲是你的人不利 - 我很尷尬地承認我之前被抓過。

+0

+1爲「在你的catch塊中做某事」。 – extraneon 2009-05-24 12:23:07

2

幾個問題與您的代碼,我會盡量簡短:

與try/catch語句在這一層不時封裝,aspecially不是因爲你做的任何錯誤管理。 this.specificTopic看起來是全局的,所以如果你的查詢失敗了,它將返回存儲在this.specificTopic中的任何東西。

也嘗試什麼BobbyShaftoe說。在控制檯中打印或使用您的調試器。這應該給你一個很好的指示什麼是錯的。

+0

topicId只是同一類中的私有變量。 但是你發現直接通過數據庫運行查詢。 – Dmitris 2009-05-24 11:02:05

2

我的第一個猜測是Integer.parseInt(num)可能會拋出異常。如果是這樣,sql語句將被破壞。其次,正如Makach指出的那樣,有幾個問題。首先捕獲所有

你不應該使用字符串連接,像

 ....where msg_id = " + topicId; 

而是

 ....where msg_id = ?" 
     stmt.set Int(1,topicId) 

編輯:看來多數民衆贊成你反正嘗試,在某些字符,從而吸收。

+0

感謝您對我的代碼的建議。 我現在改成了正確的方式。 – Dmitris 2009-05-24 11:02:51