我在使用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
的StackTrace(与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 :(得分:1)
如果你观察你的代码
try {
time = rs.getString("Timestamp");
System.out.println("time: " + time);
} catch (Exception e) {
System.out.println("Timestamp error: " + e);
e.printStackTrace();
}
}
您已使用此格式的“Timestamp”,但如果您将其更改为数据库中指定的“TimeStamp”,则希望它能够正常工作。
答案 1 :(得分:0)
将isNotified列的数据类型更改为数据库中的TINYINT,然后重试插入
isNotified TINYINT(1)
Bool,Boolean:这些类型是TINYINT(1)的同义词。值为零被视为false。非零值被认为是真实的。
答案 2 :(得分:0)
你能改变吗?
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的答案。)
答案 3 :(得分:0)
听起来表元数据已损坏。你应该能够通过删除和重新创建表来纠正这个问题,尽管如果元数据确实很糟糕,你可能无法删除表格。如果是这种情况,或者您需要保留数据,则备份和恢复整个数据库是可行的方法,但在删除和/或还原到另一个数据库名称之前检查SQL转储文件,然后再删除损坏的数据库。根据确切的错误,转储中可能缺少您的问题列。
如果无法刷新数据库,那么有办法进行目标维修,但我不是专家,所以我无法就此提出建议。再次,备份数据库并在继续之前验证备份是否完整(即它包含所有列)。如果这是一个生产数据库,我会非常谨慎地从互联网上获取有关操纵元数据的建议。版本,存储引擎和环境方面的细微差别可能会使这些东西产生或破坏,并且鉴于问题的本质,您无法进行干运行。