2013-10-30 75 views
7

我越來越對我對運行使用JDBC數據庫的函數一個奇怪的SQLException。 的SQLException:列「消息」未找到。奇怪的SQLException:列未找到

我有這個在我的功能:

st = con.prepareStatement("SELECT NotificationID,UserIDFrom,UserIDTo,Message,Timestamp,isNotified FROM notification WHERE UserIDTo=? AND isNotified=?"); 
    st.setInt(1, _UserID); 
    st.setBoolean(2, false); 
    System.out.println("st is: " + st); 
    rs = st.executeQuery(); 

而且我得到了這個錯誤,所以我說這個st.executeQuery()後:

ResultSetMetaData meta = rs.getMetaData(); 
    for (int index = 1; index <= meta.getColumnCount(); index++) { 
     System.out.println("Column " + index + " is named " + meta.getColumnName(index)); 
     } 

當我跑我的代碼再次,這是我得到結果:

Column 1 is named NotificationID 
Column 2 is named UserIDFrom 
Column 3 is named UserIDTo 
Column 4 is named Message 
Column 5 is named TimeStamp 
Exception in thread "main" java.sql.SQLException: Column 'Message' not found. 
Column 6 is named isNotified 

這裏是我的表的設計截圖,從我的SQL工作臺 enter image description here

而在表中的數據 enter image description here

我真的想不通這是怎麼回事一個在這裏....任何人都可以幫幫忙?

編輯
我已經取代了*SELECT聲明只是添加一些,我才注意到這個問題。
如果我從選擇刪除Message列然後我得到了TimeStamp列同樣的錯誤。如果我刪除這兩列,那麼我就不會有錯誤。

EDIT2
OK,這是我得到的錯誤的部分,我得到兩個關於信息和時間戳:

while (rs.next()) { 
     NotificationID = rs.getInt("NotificationID"); 
     System.out.println("NotificationID: " + NotificationID); 

     SenderID = rs.getInt("UserIDFrom"); 
     System.out.println("SenderID: " + SenderID); 
     From = findUserName(SenderID); 

     try { 
      body = rs.getString("Message"); 
      System.out.println("body: " + body); 
     } catch (Exception e) { 
      System.out.println("Message error: " + e); 
      e.printStackTrace(); 
     } 

     try { 
      time = rs.getString("Timestamp"); 
      System.out.println("time: " + time); 
     } catch (Exception e) { 
      System.out.println("Timestamp error: " + e); 
      e.printStackTrace(); 
     } 
    } 

我上getString()方法爲每列
堆棧跟蹤的錯誤TimeStamp(同爲Message):你isNotified的

java.sql.SQLException: Column 'TimeStamp' not found. 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) 
    at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1167) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5733) 
    at NotifyMe_Server.Database.getUnNotified(Database.java:444) 
    at tests.Tests.main(Tests.java:39) 
+0

你有沒有觸發器在桌子上? – BevynQ

+0

如果您在SQL語句中手動設置Int/Boolean,是否會出現錯誤?即,嘗試「選擇*從通知WHERE UserIDTo = 1 AND isNotified = 0」並執行它,而不設置PreparedStatement變量。 – hotforfeature

+0

可以在列名中包含一些空格或奇怪的字符嗎? – Taylor

回答

0

更改數據類型列作爲TINYINT在數據庫中並重試插入

isNotified TINYINT(1) 

Bool,Boolean:這些類型是TINYINT(1)的同義詞。零值被認爲是錯誤的。非零值被認爲是真實的。

+0

我沒有看到數據類型的布爾選項,在MySQL **編輯**順便說一句,我在另一個表中有相同類型的字段,我在我的Java代碼中使用'setBoolean()',它的工作原理罰款 – akafortes

+0

使用TINYINT並嘗試 – Shamse

+0

仍然收到錯誤:( – akafortes

1

如果你觀察你的代碼

try { 
     time = rs.getString("Timestamp"); 
     System.out.println("time: " + time); 
    } catch (Exception e) { 
     System.out.println("Timestamp error: " + e); 
     e.printStackTrace(); 
    } 
} 

你已經使用「時間戳」,在這種格式,但如果你將其改爲「時間戳」在你的數據庫中指定的,希望它會奏效。

0

你能不能改

System.out.println("Column " + index + " is named " + meta.getColumnName(index)); 

System.out.println("Column " + index + " is named '" + meta.getColumnName(index) + "'"); 

,使我們可以看到,如果沒有在 「消息」 列名的空白?

錯誤消息出現在列5和列6之間的事實並不重要,我認爲,因爲一個是標準輸出,另一個是標準錯誤,所以這些都不是同步輸出流。

(另請參閱有關時間戳以前的答案VS時間戳。)

0

這聽起來像表元數據已損壞。您應該可以通過刪除並重新創建表來更正此問題,但如果元數據確實存在,您可能無法刪除表。如果是這種情況,或者需要保留數據,則備份和恢復整個數據庫是要走的路,但在刪除損壞的數據庫之前,請在恢復和/或恢復到另一個數據庫名之前檢查SQL轉儲文件。根據具體情況,您的問題列可能會從轉儲中丟失。

如果刷新數據庫不是一個選項,有辦法執行目標修復,但我不是專家,所以我不能告訴你這一點。再次,備份您的數據庫,並確認備份完成(即它有你的所有列),然後再繼續。如果這是一個生產數據庫,我會對從互聯網上獲取有關操作元數據的建議非常謹慎。版本,存儲引擎和環境的細微差別可能會讓你產生這種情況,或者讓你感到困惑,並且鑑於問題的本質,你無法進行空運行。