如何解决当主键重复时,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.java
和 processRequest
方法:
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 中的表设计
解决方法
我已经找到了解决方案。我必须将 return result;
行放在 finally
块之外,我的应用程序运行良好!感谢您的帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。