我运行的是Java 17.0.1和Netbeans 12.5、本地Apache Tomcat 8.5.73以及JDBC和derbyDB。下面代码中的Select语句未执行,表中未显示任何行。
我的jsp文件:
<%@ page import="java.sql.*" %>
<%
String id = request.getParameter("userid");
String driverclass = "org.apache.derby.jdbc.ClientDriver";
String connectionUrl = "jdbc:derby://localhost:1527/";
String database = "Shop";
String username = "deradmin";
String password = "admin";
try {
Class.forName(driverclass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
%>
<!DOCTYPE html>
<html>
<body>
<h1>Shopdatenbank</h1>
<h2>Kunden</h2>
<table border="1">
<thead>
<tr>
<td>Name</td>
<td>Strasse</td>
<td>Plz</td>
<td>Ort</td>
</tr>
</thead>
<%
try{
DriverManager.registerDriver(new org.apache.derby.jdbc.ClientDriver());
connection = DriverManager.getConnection(connectionUrl+database, username, password);
statement=connection.createStatement();
String sql ="SELECT * FROM Kunde";
resultSet = statement.executeQuery(sql);
while(resultSet.next()){
%>
<tbody
<tr>
<td><%=resultSet.getString("Name") %></td>
<td><%=resultSet.getString("Strasse") %></td>
<td><%=resultSet.getString("Plz") %></td>
<td><%=resultSet.getString("Ort") %></td>
</tr>
</tbody>
<%
}
connection.close();
statement.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
</table>
</body>
</html>
我在Tomcat日志中看到以下错误:
java.sql.SQLSyntaxErrorException: Tabelle/View 'KUNDE' ist nicht vorhanden.
at org.apache.derby.client.am.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:94)
at org.apache.derby.client.am.SqlException.getSQLException(SqlException.java:325)
at org.apache.derby.client.am.ClientStatement.executeQuery(ClientStatement.java:514)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:155)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:465)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:383)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:331)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:196)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:698)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:364)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:624)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1673)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: ERROR 42X05: Tabelle/View 'KUNDE' ist nicht vorhanden.
at org.apache.derby.client.am.ClientStatement.completeSqlca(ClientStatement.java:2116)
at org.apache.derby.client.net.NetStatementReply.parsePrepareError(NetStatementReply.java:579)
at org.apache.derby.client.net.NetStatementReply.parsePRPSQLSTTreply(NetStatementReply.java:145)
at org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(NetStatementReply.java:54)
at org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(StatementReply.java:41)
at org.apache.derby.client.net.NetStatement.readPrepareDescribeOutput_(NetStatement.java:156)
at org.apache.derby.client.am.ClientStatement.readPrepareDescribeOutput(ClientStatement.java:1702)
at org.apache.derby.client.am.ClientStatement.flowExecute(ClientStatement.java:2381)
at org.apache.derby.client.am.ClientStatement.executeQueryX(ClientStatement.java:520)
at org.apache.derby.client.am.ClientStatement.executeQuery(ClientStatement.java:505)
... 29 more
“is nicht vorhanden.”-〉表格不存在
表存在于数据库中,我可以在Netbeans中执行查询而没有问题。页面也在浏览器中打开。
不确定代码或我的配置中是否有错误。
2条答案
按热度按时间wgmfuz8q1#
首先,根据Basil Bourque的评论进行检查。其次,我不知道你使用的数据库,但有些数据库,例如PostgreSQL,在创建表后需要提交,如果不提交,表对其他连接是不可见的。
6tqwzwtp2#
猜猜看多个架构
您没有提供创建表的代码。因此我们无法准确回答。但我猜测您无意中在模式之间进行了切换。
因此,一个模式包含您先前创建的表。然后,您连接到另一个模式,但在另一个模式中找不到这样的表。
引用此Derby文档:
任何连接的当前方案都默认为与用户名对应的方案。如果未提供用户名,则用户名(以及当前方案)默认为APP。
但是,即使当前方案被设置为用户名,该方案也可能不存在。方案只能通过CREATE SCHEMA或在该方案中创建对象(表等)来创建(这是隐式方案创建)。
一个例外是APP模式,该模式始终是创建的,尽管应用程序不应依赖于该模式。
如果您不知道模式的含义,请参阅我的this Answer,该页解释了我的图(适用于Postgres,但显然也适用于Derby,除了默认端口号5,432)。
疑难排解
您应该通过JDBC连接进行查询,以获取当前模式中所有表的列表。
并使用数据库管理工具仔细查看数据库中所有模式列表。