7

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からの私のテーブルのデザインのスクリーンショットです ここに画像の説明を入力

そしてテーブルのデータ ここに画像の説明を入力

ここで何が起こっているのか本当にわかりません.... 誰でも助けてもらえますか?

EDIT
私はちょうど気づいた質問に何かを追加するため*に、ステートメントの を置き換えました。 選択から列を削除すると、列に対して同じエラーが発生します。両方の列を削除しても、エラーは発生しません。SELECT
MessageTimeStamp

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()各列の
StackTraceのメソッドでエラーが発生します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)
4

4 に答える 4

1

コードを観察する場合

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

この形式で「Timestamp」を使用しましたが、データベースで指定されている「TimeStamp」に変更した場合、うまくいくでしょう。

于 2013-12-20T12:03:18.150 に答える
0

テーブルのメタデータが壊れているようです。テーブルを削除して再作成することでこれを修正できるはずですが、メタデータが実際に破損している場合は、テーブルを削除できない場合があります。その場合、またはデータを保持する必要がある場合は、データベース全体をバックアップして復元する方法がありますが、破損したデータベースを削除する前に、復元する前に SQL ダンプ ファイルを確認するか、別のデータベース名に復元してください。何が問題なのかによっては、問題のある列がダンプにない場合があります。

データベースを更新できない場合は、対象を絞った修復を実行する方法がありますが、私は専門家ではないため、アドバイスすることはできません。繰り返しますが、データベースをバックアップし、続行する前にバックアップが完了していること (つまり、すべての列があること) を確認してください。これが本番データベースである場合、メタデータの操作についてインターネットからアドバイスを受けることに非常に慎重になります。バージョン、ストレージ エンジン、および環境のわずかな違いによって、このような問題が発生する可能性があります。また、問題の性質を考えると、予行演習を行うことはできません。

于 2014-06-18T21:42:00.133 に答える
0

データベースで isNotified 列のデータ型を TINYINT に変更し、挿入を再試行します

isNotified TINYINT(1)

Bool、Boolean: これらの型は TINYINT(1) と同義です。ゼロの値は false と見なされます。ゼロ以外の値は true と見なされます。

于 2013-10-30T02:24:39.990 に答える
0

変更できますか

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

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

「メッセージ」列名に空白があるかどうかを確認できるようにするには?

エラー メッセージが列 5 と 6 の間にあるという事実は重要ではないと思います。1 つは標準出力で、もう 1 つは標準エラーであるため、これらは同期された出力ストリームではありません。

(Timestamp と TimeStamp に関する以前の回答も参照してください。)

于 2014-05-28T12:09:04.563 に答える