首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JSP新手遇到SQL Server數據庫連接與註冊邏輯問題

     編輯:程式設計綜合問答

問題背景

在學習JSP開發時,遇到一個數據庫連接處理的問題。已經實現了用戶註冊功能,數據庫連接正常,插入數據成功。但當加入「判斷用戶名是否存在」的邏輯後,無論數據庫中是否存在該用戶名,頁面都只輸出「註冊失敗,用戶名不存在」。

原始代碼分析

註冊插入代碼(正常工作)

<%
String uid = request.getParameter("uid");
String pwd = request.getParameter("pwd");
Object[] paramss = {uid, pwd};
String sqll = "insert into tb_vip values(?,?)";
if (DBHelper.runupdatesql(sqll, paramss)) {
    out.print("已經成功註冊");
} else {
    out.print("服務器問題請與客服聯系");
}
%>

用戶名檢查代碼(存在邏輯錯誤)

<%
String uid = request.getParameter("uid");
String pwd = request.getParameter("pwd");
Object[] params = {uid};
String sql = "select count(*) from tb_vip where userid=?";
Result result = DBHelper.runselectsql(sql, params);
if (result.getRowCount() == 0) {
    Object[] paramss = {uid, pwd};
    String sqll = "insert into tb_vip values(?,?)";
    if (DBHelper.runupdatesql(sqll, paramss)) {
        out.print("已經成功註冊");
    } else {
        out.print("服務器問題請與客服聯系");
    }
} else {
    out.print("註冊失敗,用戶名已存在");
}
%>

DBHelper 類關鍵方法

public static Result runselectsql(String sql, Object[] params) {
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet res = null;
    Result result = null;
    try {
        con = getConn();
        ps = con.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            ps.setObject(i + 1, params[i]);
        }
        res = ps.executeQuery();
        result = ResultSupport.toResult(res);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            res.close(); ps.close(); con.close();
        } catch (Exception e) { e.printStackTrace(); }
    }
    return result;
}

問題根因

runselectsql 返回的是 javax.servlet.jsp.jstl.sql.Result 對象,其 getRowCount() 方法在執行 SELECT COUNT(*) 時並不會返回計數值,而是返回結果集的行數(通常為 1)。因此判斷 result.getRowCount() == 0 永遠為假,導致進入 else 分支輸出「用戶名已存在」。

解決方案

修改 runselectsql 方法,直接返回 int 類型的計數值,並在 JSP 中根據該值判斷。

改進後的 DBHelper 方法

public static int runselectsql(String uid) {
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet res = null;
    int x = 0;
    try {
        con = getConn();
        String sql = "select count(*) from tb_vip where userid=?";
        ps = con.prepareStatement(sql);
        ps.setString(1, uid);
        res = ps.executeQuery();
        while (res.next()) {
            x = res.getInt(1);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            res.close(); ps.close(); con.close();
        } catch (Exception e) { e.printStackTrace(); }
    }
    return x;
}

改進後的 JSP 邏輯

<%
String uid = request.getParameter("uid");
String pwd = request.getParameter("pwd");
if (DBHelper.runselectsql(uid) == 0) {
    Object[] params = {uid, pwd};
    String sql = "insert into tb_vip values(?,?)";
    if (DBHelper.runupdatesql(sql, params)) {
        out.print("已經成功註冊");
    }
} else {
    out.print("註冊失敗,用戶名已存在");
}
%>

總結

通過將查詢方法改為直接返回計數值,避免了對 Result 對象行數的誤解,從而正確實現了用戶名唯一性檢查。這也提醒我們在使用 JSTL 的 Result 時需清楚其行為差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved