微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当主键重复时,JavaEE 不会抛出 SQLException

如何解决当主键重复时,JavaEE 不会抛出 SQLException

我正在研究使用 JavaEE(不是 SPRING)的 Java Web 应用程序。但是我遇到了一个问题,当一行插入到带有重复主键的表中时,我的应用程序不会抛出 sqlException

详细来说,我有一个带有 AccountInfoDAO.java 方法的 DAO 类 createNewAccount

public boolean createNewAccount(String username,String password,String fullName,boolean role) 
    throws NamingException,sqlException {
    boolean result = false;
    Connection con = null;
    PreparedStatement stmt = null;
    int iCount = 0;
    
    try {
        con = DBHelpers.makeConnection();
        if (con != null) {
            
            String queryStr = "INSERT INTO "
                    + "accountInfo(username,password,lastname,isAdmin) "
                    + "VALUES(?,?,?)";
            
            stmt = con.prepareStatement(queryStr);
            stmt.setString(1,username);
            stmt.setString(2,password);
            stmt.setNString(3,fullName);
            stmt.setBoolean(4,role);
            
            iCount = stmt.executeUpdate();
            
            if (iCount > 0) {
                result = true;
            }
        } // EndIf Connected
    } finally {
        if (stmt != null) {
            stmt.close();
        }
        if (con != null) {
            con.close();
        }
        return result;
    }
}

还有我的函数式 Servlet CreateNewAccountServlet.javaprocessRequest 方法

protected void processRequest(HttpServletRequest request,HttpServletResponse response)
        throws servletexception,IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    
    String username = request.getParameter("txtUsername");
    String password = request.getParameter("txtPassword");
    String confirm = request.getParameter("txtConfirm");
    String fullname = request.getParameter("txtFullname");
    
    String url = ERROR_PAGE;
    
    AccountInfoCreateError errors = new AccountInfoCreateError();
    boolean foundErr = false;
    
    try {
        // 1. Check valid user input
        if (username.trim().length() < 6 || username.trim().length() > 30) {
            foundErr = true;
            errors.setUsernameLengthErr("Username requires input from 6 to 30 characters!");
        }
        
        if (password.trim().length() < 6 || username.trim().length() > 20) {
            foundErr = true;
            errors.setPasswordLengthErr("Password requires input from 6 to 20 characters!");
        } else if (!password.trim().equals(confirm.trim())) {
            foundErr = true;
            errors.setConfirmNotMatch("Confirm mus be matched with password!");
        }
        
        if (fullname.trim().length() < 2 || fullname.trim().length() > 50) {
            foundErr = true;
            errors.setFullNameLengthErr("Full name requires input from 2 to 50 characters!");
        }
        
        if (foundErr) {
            request.setAttribute("CREATE_ERROR",errors);
        } else {
            // 2. Call DAO
            AccountInfoDAO dao = new AccountInfoDAO();
            boolean result = dao.createNewAccount(username,fullname,false);
            if (result) {
                url = LOGIN_PAGE;
            }
        }
        
    } catch (sqlException ex) {
        String errMsg = ex.getMessage();
        log("CreateNewAccountServlet sql: " + errMsg);
        if (errMsg.contains("Duplicate")) {
            errors.setUsernameIsExisted(username + " is existed");
            request.setAttribute("CREATE_ERROR",errors);
        }
        
    } catch (NamingException ex) {
        log("CreateNewAccountServlet Naming: " + ex.getMessage());
    }
    finally {
        Requestdispatcher rd = request.getRequestdispatcher(url);
        rd.forward(request,response);
        out.close();
    }
}

当我运行我的应用程序时,一切正常。可以成功创建一个普通的新帐户并插入到数据库中。但是,当我尝试使用重复的用户名(这是我在表中的主键)插入帐户时,它不会抛出 sqlException,这是预期发生的。当然,我的 TomCat 服务器不写日志。 我所有的朋友都这样做了,但抛出了异常。 我尝试重新安装我的 MS sql Server,尝试使用不同的 JDBC 驱动程序,但结果是一样的。

我正在使用 JDK 8、NetBeans 8.2 RC、Apache Tomcat 8.0、MS sql Server 2012 来实现此应用程序。

希望你能帮我解决这个问题!

------- 更新 我在 MS sql Server 中的表设计

My table design in MS SQL Server

解决方法

我已经找到了解决方案。我必须将 return result; 行放在 finally 块之外,我的应用程序运行良好!感谢您的帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?