【问题标题】:rs.getGeneratedKeys() not working in Derbyrs.getGeneratedKeys() 在德比中不起作用
【发布时间】:2016-06-10 19:09:44
【问题描述】:

我的表创建如下所示:

public final String CREATE_QUESTIONS_TABLE = "CREATE TABLE Questions(QuestionID INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,"
        + "SubmittedTime TIMESTAMP NOT NULL,"
        + "Title VARCHAR(50) NOT NULL,"
        + "Text VARCHAR(300) NOT NULL,"
        + "Username VARCHAR(10) NOT NULL,"
        + "Rating INTEGER DEFAULT 0 NOT NULL)";

我的 INSERT 查询如下所示:

public final String INSERT_QUESTION_STMT = "INSERT INTO Questions(SubmittedTime, Title, Text, Username) VALUES(?,?,?,?)";

我插入的部分 servlet 代码如下所示:

// insert question into database
PreparedStatement pstmt = conn.prepareStatement(AppConstants.INSERT_QUESTION_STMT);
pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
pstmt.setString(2, newQuestion.getTitle());
pstmt.setString(3, newQuestion.getText());
pstmt.setString(4, (String)session.getAttribute("username"));
pstmt.executeUpdate();

到目前为止一切正常,并将问题插入数据库。

我想获取问题的自动生成 ID,所以我尝试使用:

ResultSet rs = pstmt.getGeneratedKeys();
int id = -1;
if(rs.next())
id = rs.getInt(1);

rs.next() 出现随机错误

SEVERE: Servlet.service() for servlet [AskQuestion] in context with path [/QnA] threw exception
java.lang.NullPointerException
at QnA.servlets.AskQuestion.doPost(AskQuestion.java:78)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

知道为什么它不起作用吗?

【问题讨论】:

    标签: java sql jdbc derby


    【解决方案1】:

    我找到了答案,我不得不告诉语句返回生成的密钥。

    PreparedStatement pstmt = conn.prepareStatement(AppConstants.INSERT_QUESTION_STMT, 
           Statement.RETURN_GENERATED_KEYS);
    

    注意 Statement.RETURN_GENERATED_KEYS 作为函数的第二个参数。

    【讨论】:

    • 感谢编辑 + jdbc 主题(但它仍然适用于 PreparedStatement.RETURN_GENERATED_KEYS,有什么理由更喜欢其中一个吗?)
    • 那是因为PreparedStatement扩展了Statement,所以它也继承了定义的常量。首选使用Statement 作为常量,因为1)这是实际定义常量的位置,2)JDBC 标准、文档等使用Statement.RETURN_GENERATED_KEYS
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多