簡體   English   中英

奇怪的SQLException:找不到列

[英]Strange SQLException: Column not found

我在使用JDBC對數據庫運行的函數上得到了一個奇怪的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

這是MySQL Workbench的表格設計截圖 在此輸入圖像描述

和表中的數據 在此輸入圖像描述

我真的無法弄清楚這里有什么......有人可以幫忙嗎?

編輯
我已經在SELECT語句中替換了*只是為了添加一些我剛注意到的問題。
如果我從select中刪除Message列,那么TimeStamp列會出現相同的錯誤。 如果我刪除兩列,那么我沒有錯誤。

EDIT2
好的,這是我得到錯誤的部分,我得到消息和時間戳:

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 ):

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)

如果你觀察你的代碼

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

您已使用此格式的“Timestamp”,但如果您將其更改為數據庫中指定的“TimeStamp”,則希望它能夠正常工作。

將isNotified列的數據類型更改為數據庫中的TINYINT,然后重試插入

isNotified TINYINT(1)

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

你能改變嗎?

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

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

這樣我們就可以看到“消息”列名中是否有空格?

我認為錯誤消息在第5列和第6列之間的事實並不重要,因為一個是標准輸出而另一個是標准錯誤,這些不是同步的輸出流。

(另請參閱上一個關於Timestamp vs TimeStamp的答案。)

聽起來表元數據已損壞。 你應該能夠通過刪除和重新創建表來糾正這個問題,盡管如果元數據確實很糟糕,你可能無法刪除表格。 如果是這種情況,或者您需要保留數據,則備份和還原整個數據庫是可行的方法,但在刪除損壞的數據庫之前,請在還原和/或還原到其他數據庫名稱之前檢查SQL轉儲文件。 根據確切的錯誤,轉儲中可能缺少您的問題列。

如果刷新數據庫不是一個選項,有辦法進行目標修復,但我不是專家,所以我無法就此提出建議。 再次,備份數據庫並在繼續之前驗證備份是否完整(即它包含所有列)。 如果這是一個生產數據庫,我會非常謹慎地從互聯網上獲取有關操縱元數據的建議。 版本,存儲引擎和環境方面的細微差別會使這些東西產生或破壞,並且鑒於問題的本質,您無法進行干運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM