2013-10-30 37 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转储文件。根据具体情况,您的问题列可能会从转储中丢失。

如果刷新数据库不是一个选项,有办法执行目标修复,但我不是专家,所以我不能告诉你这一点。再次,备份您的数据库,并确认备份完成(即它有你的所有列),然后再继续。如果这是一个生产数据库,我会对从互联网上获取有关操作元数据的建议非常谨慎。版本,存储引擎和环境的细微差别可能会让你产生这种情况,或者让你感到困惑,并且鉴于问题的本质,你无法进行空运行。