2013-10-30 8 views
7

Ich bekomme eine seltsame SQLException auf eine Funktion, die ich mit JDBC gegen eine Datenbank ausführen. SQLException: Spalte 'Nachricht' nicht gefunden.Seltsame SQLException: Spalte nicht gefunden

Ich habe dies in meiner Funktion:

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(); 

Und ich diesen Fehler habe, so fügte ich diese nach dem st.executeQuery():

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

Und wenn ich meinen Code laufen wieder ist es das, was ich Als Ergebnis erhalten:

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 

Und hier ist ein Screenshot meiner Tabelle Design, von My SQL Workbench enter image description here

Und die Daten in der Tabelle enter image description here

ich wirklich kann nicht herausfinden, was man hier los ist .... kann jemand helfen?

EDIT
Ich habe die * in der gerade SELECT Aussage ersetzt etwas auf die Frage hinzuzufügen, die ich gerade bemerkt.
Wenn ich die Message Spalte aus der Auswahl entfernen, bekomme ich den gleichen Fehler für die TimeStamp Spalte. Und wenn ich beide Spalten entferne, bekomme ich keine Fehler.

EDIT2
OK, das ist der Teil ich die Fehler bekommen, erhalte ich sowohl auf Meldung und Zeitstempel:

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(); 
     } 
    } 

Ich erhalte den Fehler auf den getString() Methoden für jede Spalte
Stacktrace für TimeStamp (gilt auch für 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) 
+0

Haben Sie Trigger auf dem Tisch? – BevynQ

+0

Erhalten Sie den Fehler, wenn Sie den Int/Boolean in der SQL-Anweisung manuell festlegen? Das heißt, versuche "SELECT * FROM notification WHERE UserIDTo = 1 UND isNotified = 0" und führe es aus, ohne die PreparedStatement-Variablen zu setzen. – hotforfeature

+0

könnten Sie ein Leerzeichen oder ein seltsames Zeichen im Spaltennamen haben? – Taylor

Antwort

0

ändern Datentyp Ihres isNotified Diese Typen sind Synonyme für TINYINT (1): Spalte als TINYINT in Datenbank und

isNotified TINYINT(1) 

Bool, Boolean einfügen wiederholen. Ein Wert von Null wird als falsch angesehen. Werte ungleich Null werden als wahr betrachtet.

+0

Ich sehe keine boolesche Option im Datentyp, in MySQL ** EDIT ** übrigens, ich habe die gleiche Art von Feld in einer anderen Tabelle, und ich benutze die 'setBoolean()' in meinem Java-Code und es funktioniert – akafortes

+0

Verwenden Sie TINYINT und versuchen Sie – Shamse

+0

immer noch den Fehler :( – akafortes

1

Wenn Sie Ihren Code beobachten

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

Sie „Timestamp“ in diesem Format verwendet haben, aber wenn man es auf „Timestamp“, wie er in der Datenbank angegeben, hoffentlich wird es funktionieren.

0

Können Sie

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

zu

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

so ändern, dass wir, wenn es sehen können Leerzeichen in der "Message" Spaltenname ist?

Die Tatsache, dass die Fehlermeldung kommt zwischen Spalte 5 und 6 ist nicht wichtig, ich denke, weil man Standard-Ausgabe und der andere Standardfehler ist, sind diese nicht synchronisierte Ausgabeströme.

(auch die vorherige Antwort über Timestamp vs Timestamp sehen.)

0

Es klingt wie die Metadaten der Tabelle beschädigt ist. Sie sollten dies korrigieren können, indem Sie die Tabelle löschen und erneut erstellen. Wenn die Metadaten jedoch wirklich ausgebrochen sind, können Sie die Tabelle möglicherweise nicht löschen. Wenn dies der Fall ist oder Sie die Daten aufbewahren müssen, sollten Sie die gesamte Datenbank sichern und wiederherstellen. Überprüfen Sie jedoch die SQL-Dump-Datei, bevor Sie die Datenbank wiederherstellen und/oder einen anderen Datenbanknamen wiederherstellen. Abhängig davon, was genau falsch ist, fehlen möglicherweise Ihre Problemspalten auf dem Speicherauszug.

Wenn das Aktualisieren der Datenbank keine Option ist, gibt es Möglichkeiten, zielgerichtete Reparaturen durchzuführen, aber ich bin kein Experte, also kann ich Sie nicht darauf hinweisen. Sichern Sie erneut Ihre Datenbank und vergewissern Sie sich, dass die Sicherung abgeschlossen ist (d. H. Sie enthält alle Spalten), bevor Sie fortfahren. Wenn es sich um eine Produktionsdatenbank handelt, würde ich sehr vorsichtig sein, Ratschläge aus dem Internet zur Manipulation von Metadaten zu nehmen. Geringfügige Unterschiede in der Version, der Speicher-Engine und der Umgebung können einen dazu bringen, dass Sie mit diesen Sachen fertig werden, und angesichts der Art des Problems können Sie keinen Trockenlauf durchführen.

Verwandte Themen