2017-05-04 78 views
0

我目前使用java编写JSP页面。我遇到的问题是,我无法将字符串CNICCNICc进行比较。我基本上比较没有超过两个具有相同CNIC(社会安全号码)的条目。我在编码方面不太擅长,所以请详细说明问题所在。无法比较Java中的字符串和SQL数据库中的字符串

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

我无法比较'CNIC'和'CNICc'。 CNIC是一个本地字符串,而CNICc是从DB中提取的。问题出在代码的底部。 while循环在哪里。 –

+0

你是什么意思,无法比较, 你会得到一些错误? 或代码运行正常,但CNIC和CNICc从不匹配,结果总是错误的? –

回答

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"); 
} 
+0

我试过了你的代码。来自CNIC和CNICc的字符串仍然没有得到匹配。我正在使用Workbench作为数据库。我也尝试了SQL命令'Select * from CNIC',我认为它应该只查找CNIC列,但它不起作用。 –

+0

打印出您正在比较的值,并查看您是否从结果集中提取有效列。 –

+0

我发现了一些奇怪的东西。我为'CNICc = rs.getString(5)'使用的列的索引号需要为正确的列增加一次,例如'CNICc = rs.getString(6)'。即使这样,字符串也得到匹配。我认为问题在于,只要while循环运行,如果它甚至在数据库中找到第一个匹配项,它就会转发该页面。不检查列的其余部分。 –

0

每个人都应该密切的联系,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; 
       } 
      } 
     } 
0

那么原来我有1递增列索引让它正确地与值进行比较。像CNICc=rs.getstring(5)指向不正确的列,这是奇怪的,因为我在数据库中设置的值是相同的索引。但是,当我想显示的价值,我不得不使用递增索引。像CNICc=rs.getstring(6)

+1

更好'CNICc = rs.getString(“CNIC”);';对于'*'列号不清楚。 –