未找到表- JDBC、NetBeans、Tomcat

idfiyjo8  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(238)

我运行的是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中执行查询而没有问题。页面也在浏览器中打开。
不确定代码或我的配置中是否有错误。

wgmfuz8q

wgmfuz8q1#

首先,根据Basil Bourque的评论进行检查。其次,我不知道你使用的数据库,但有些数据库,例如PostgreSQL,在创建表后需要提交,如果不提交,表对其他连接是不可见的。

6tqwzwtp

6tqwzwtp2#

猜猜看多个架构
您没有提供创建表的代码。因此我们无法准确回答。但我猜测您无意中在模式之间进行了切换。
因此,一个模式包含您先前创建的表。然后,您连接到另一个模式,但在另一个模式中找不到这样的表。
引用此Derby文档:
任何连接的当前方案都默认为与用户名对应的方案。如果未提供用户名,则用户名(以及当前方案)默认为APP。
但是,即使当前方案被设置为用户名,该方案也可能不存在。方案只能通过CREATE SCHEMA或在该方案中创建对象(表等)来创建(这是隐式方案创建)。
一个例外是APP模式,该模式始终是创建的,尽管应用程序不应依赖于该模式。
如果您不知道模式的含义,请参阅我的this Answer,该页解释了我的图(适用于Postgres,但显然也适用于Derby,除了默认端口号5,432)。

疑难排解

您应该通过JDBC连接进行查询,以获取当前模式中所有表的列表。
并使用数据库管理工具仔细查看数据库中所有模式列表。

相关问题