2017-05-04 80 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」);';對於'*'列號不清楚。 –