我目前正在使用java编写JSP页面。我遇到的问题是我无法将字符串CNIC
与CNICc
进行比较。我基本上比较了不超过两个具有相同CNIC(社会安全号码)的条目。我编码不是那么好,所以请详细说明问题所在。
String uname=request.getParameter("UName");
String name=request.getParameter("Name");
String age=request.getParameter("Age");
String address=request.getParameter("Address");
String CNIC=request.getParameter("CNIC");
Class.forName("com.mysql.jdbc.Driver");
Connection c=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1","root", "");
Statement s= c.createStatement();
PreparedStatement ps=c.prepareStatement("insert into hitchhikerdetails(Uname,Name,Age,Address,CNIC) values(?,?,?,?,?)" );
ResultSet rs=s.executeQuery("select * from hitchhikerdetails");
ps.setString(1, uname);
ps.setString(2, name);
ps.setString(3, age);
ps.setString(4, address);
ps.setString(5, CNIC);
String CNICc;
rs.beforeFirst();
while(rs.next())
{
CNICc=rs.getString(5);
//out.println(CNIC);
//UNamec=rs.getString(1);
if(CNIC.equals(CNICc))
{
pageContext.forward("Hitchhiker-error.jsp");
}
else
{
ps.executeUpdate();
pageContext.forward("Hitchhiker-success-register.jsp");
}
}
%>
答案 0 :(得分:0)
您可能遇到的问题是,select *可能会返回n个结果,其中一个可能会匹配。
因此,它将运行一次更新并创建剩余时间。 您可以将其修改为:
boolean isCNICFound = false;
while(rs.next())
{
CNICc=rs.getString(5);
//out.println(CNIC);
//UNamec=rs.getString(1)
System.out.println("From Result Set : " + CNICc + " -comparing this with : " + CNIC);
if(null != CNICc) {
if(CNIC.equals(CNICc)) {
isCNICFound = true;
break;
}
}
}
if(isCNICFound ){
pageContext.forward("Hitchhiker-error.jsp");
} else {
ps.executeUpdate();
pageContext.forward("Hitchhiker-success-register.jsp");
}
答案 1 :(得分:0)
应该关闭Connection,Statement和ResultSet。为此,请自动使用try-with-resources,如下所示。
然后在SELECT *
上,rs.getString(5)
可能会选择错误的列(不知道列出哪些列);
或rs.getString("CNIC")
或更好,再做一次查询。
同样将这些陈述分开,即使出现错误也要将其表现得很好。
在forward
更好的返回后,不再向浏览器写入输出。
try (Connection c = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mysql1", "root", "")) {
try (Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select * from hitchhikerdetails")) {
while (rs.next()) {
String CNICc = rs.getString("CNIC");
if (CNIC.equals(CNICc)) {
pageContext.forward("Hitchhiker-error.jsp");
return;
}
}
}
try (PreparedStatement ps = c.prepareStatement(
"insert into hitchhikerdetails(Uname,Name,Age,Address,CNIC)"
+ " values(?,?,?,?,?)")) {
ps.setString(1, uname);
ps.setString(2, name);
ps.setString(3, age);
ps.setString(4, address);
ps.setString(5, CNIC);
ps.executeUpdate();
pageContext.forward("Hitchhiker-success-register.jsp");
return;
}
}
立即查询重复的CNIC:
try (PreparedStatement s = c.prepareStatement(
"select UName from hitchhikerdetails where CNIC = ?")) {
s.setString(1, CNIC);
try (ResultSet rs = s.executeQuery()) {
if (rs.next()) {
pageContext.forward("Hitchhiker-error.jsp");
return;
}
}
}
答案 2 :(得分:0)
事实证明我必须将列索引递增1才能使其与值正确比较。像CNICc=rs.getstring(5)
指向错误的列,这是奇怪的,因为我在数据库中设置的值是相同的索引。但是,当我想显示值时,我必须使用递增的索引。比如CNICc=rs.getstring(6)