2014-04-14 69 views
0

喜從JSP應用程序java.lang.NumberFormatException:用JSP應用程序和MySQL

這裏試圖進入我的數據庫插入數據時,我發現了一個上面的錯誤是在JSP代碼

<%@page contentType="text/html" pageEncoding="UTF-8"%> 

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Books database</title> 
<link rel="stylesheet" href="style.css" type="text/css"> 
</head> 
<body> 

<br> 

<div class="navigator"> 
<a id="currenttab" href="index.jsp">Add</a> 
<a href="delete.jsp">Delete</a> 
</div> 

<% 
    String empfirstname = request.getParameter("empfirstname"); 
    String empsurname = request.getParameter("empsurname"); 
    String dpddept = request.getParameter("dpddept"); 
    String extensionno = request.getParameter("extensionno"); 
    String mobileno = request.getParameter("mobileno"); 
    String emailaddress = request.getParameter("emailaddress"); 
    String username = request.getParameter("username"); 
    String password = request.getParameter("password"); 
    if (empsurname != null && empfirstname != null 
      && username != null && password != null) { 
     Users.Worker.Insert(empfirstname,empsurname,dpddept,extensionno, 
       mobileno,emailaddress,username,password); 
    } 
%> 

<br> <br> <br> 

    <form method='post' action='index.jsp'> 
        <table> 
         <tr><td>Please Enter your first name.</td> 
          <td><input type="text" id='empfirstname'></td></tr> 
         <tr><td>Please Enter your surname.</td> 
          <td><input type="text" id='empsurname'></td></tr> 
         <tr><td>Please Enter your Department.</td> 
          <td><input type="text" id='dpddept'></td></tr> 
         <tr><td>Please Enter your Extension Number.</td> 
          <td><input type="text" id='extensionno'></td></tr> 
         <tr><td>Please Enter your mobile Number.</td> 
          <td><input type="text" id='mobileno'></td></tr> 
         <tr><td>Please Enter your email Address.</td> 
          <td><input type="text" id='emailaddress'></td></tr> 
         <tr><td>Please Enter your email username.</td> 
          <td><input type="text" id='username'></td></tr> 
         <tr><td>Please Enter your email password.</td> 
          <td><input type="text" id='password'></td></tr> 
         <tr><td><input type="submit" name="submit"/></td></tr> 
        </table></form> 
</body> 
</html> 

這是Java源代碼

package Users; 

import java.sql.*; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 


public class Worker { 

    static final String url = "jdbc:mysql://localhost:3306/users"; 

    public static void Insert(String empfirstname,String empsurname, 
      String dpddept,String extensionno,String mobileno, 
      String emailaddress,String username,String password) { 
     try { 

      String insert = "INSERT INTO users(empfirstname,empsurname,dpddept,extensionno," 
        + "mobileno,emailaddress,username,password)" + 
        "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; 

      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = DriverManager.getConnection(url, "root", "dpd2014"); 

      PreparedStatement ps = con.prepareStatement(insert); 


      ps.setString(1, empfirstname); 
      ps.setString(2, empsurname); 
      ps.setString(3, dpddept); 
      ps.setInt(4, Integer.parseInt(extensionno)); 
      ps.setString(5, mobileno); 
      ps.setString(6, emailaddress); 
      ps.setString(7, username); 
      ps.setString(8, password); 
      ps.executeUpdate(); 
      con.close(); 

     } catch (Exception ex) { 
      Logger.getLogger(Worker.class.getName()).log(
          Level.SEVERE, null, ex); 
     } 
    } 

    public static List GetUsers() { 

     List<String> list = new ArrayList<String>(); 

     try { 

      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = DriverManager.getConnection(url, "root", "dpd2014"); 

      Statement stmt = con.createStatement(); 

      ResultSet result = stmt.executeQuery("SELECT * FROM users"); 



      while(result.next()) 
      { 

      list.add(result.getString("empfirstname")); 
      list.add(result.getString("empsurname")); 
      list.add(result.getString("dpddept")); 
      list.add(result.getString("extensionno")); 
      list.add(result.getString("mobileno")); 
      list.add(result.getString("emailaddress")); 
      list.add(result.getString("username")); 
      list.add(result.getString("password")); 
      } 

      con.close(); 

     } catch (Exception ex) { 
      Logger.getLogger(Worker.class.getName()).log( 
          Level.SEVERE, null, ex); 
     } 
      return list; 
    } 

    public static void Delete(String employeeno) { 
     try { 

      String delete = "DELETE from users WHERE employeeno = ?"; 

      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = DriverManager.getConnection(url, "root", "dpd2014"); 
      PreparedStatement ps = con.prepareStatement(delete); 

      ps.setString(1, employeeno); 
      ps.executeUpdate(); 
      con.close(); 

     } catch (Exception ex) { 
      Logger.getLogger(Worker.class.getName()).log( 
      Level.SEVERE, null, ex); 
     } 
    } 
} 

終於這是MySQL表

users 
(Employeeno int(11) AI PK 
empfirstname varchar(30) 
empsurname varchar(40) 
dpddept varchar(30) 
extensionno int(11) 
mobileno  varchar(30) 
emailaddress varchar(30) 
username varchar(30) 
password varchar(30)) 

我希望這是足夠的信息,任何幫助,將不勝感激

+0

僅發佈相關代碼,哪一行顯示錯誤 – SpringLearner

+0

您在哪一行代碼中獲得NumberFormatException。 – Gundamaiah

+0

哪一行錯誤正在拋出? – Sumeet

回答

1

PreparedStatement docs

注:setter方法(setShort,setString等等上),用於設置IN參數值必須指定類型與輸入參數的已定義SQL類型兼容。例如,如果IN參數的SQL類型爲INTEGER,則應使用setInt方法。

extensionnomobilenoint,不varchar。但你將它們設置是這樣的:

ps.setString(5, extensionno); 
ps.setString(6, mobileno); 

他們應該是:

ps.setInt(5, extensionno); 
ps.setInt(6, mobileno); 

編輯:看起來像Ravinder得到了完整的解決方案,檢查他的答案。

+1

當然,你將不得不首先轉換它,使用'[這個問題]中描述的'Integer.parseInt'(http://stackoverflow.com/questions/5585779/how-to-convert-string-to-int-in -java)。 – Patru

+0

@MikeB:這個答案沒有幫助。錯誤不在您指定的那些字段上。只要值是有效的數字格式,使用'setInt/Long/Float/Double/...'是可選的。 –

+0

@Ravinder你是對的! –

1

可能爲extensionno字段的值輸入引發了異常java.lang.NumberFormatException

你的表結構說

extensionno int(11) -- column position 5 in the table 

而你試圖將值設置爲它

ps.setString(4, dpddept); // this caused the error 
ps.setString(5, extensionno); // but not this 

setString(4...引起NumberFormatException
4th佔位符爲extensionno,它的類型爲int(11)
但是,您正在設置dpddept變量的值,這是一個varchar字符串。 當您嘗試插入Stringint數值類型,數據庫將拋出一個錯誤,如:

ERROR 1366 (HY000): 
    Incorrect integer value: 'sales' for column 'extensionno' at row 1 

如何解決這個

我們根據位置設定值sql語句中的查詢參數,但不基於表中的列位置

String insert = 
    "INSERT INTO users(empfirstname, empsurname, dpddept, extensionno, " 
    + "mobileno, emailaddress, username, password)" 
    + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; 

在上面的查詢中有8個佔位符(?)。
這意味着你應該set... 8個值從1st8th參數。
這些是insert查詢中的佔位符位置編號,但不是列位置

因此,聲明

ps.setString(2, empfirstname); 

是錯誤的。它應該是

ps.setString(1, empfirstname); 

看看的文件說:

setString(int parameterIndex, String x) throws SQLException
- parameterIndex - 第一個參數是1,第二個是2,...
- x - 參數值

變化你的價值setter方法如下:

ps.setString(1, empfirstname); // varchar string 
ps.setString(2, empsurname); // varchar string 
ps.setString(3, dpddept); // varchar string 

// you can use setString on int type columns, 
// but only when they are valid numbers 
// ps.setString(4, extensionno); // int int 
// or 
ps.setInt(4, Integer.parseInt(extensionno)); // int int 

// ps.setString(5, mobileno); // int int 
// or 
ps.setInt(5, Integer.parseInt(mobileno)); // int int 

ps.setString(6, emailaddress); // varchar string 
ps.setString(7, username); // varchar string 
ps.setString(8, password); // varchar string 

ps.executeUpdate(); 
+0

它似乎仍然不適合我,每當我在表單上添加一個人時,它都不會輸入記錄。當我去到刪除選項卡時,我得到了「java.lang.NumberFormatException:對於輸入字符串:」nick「」警告,我已經手動輸入了表中的一條記錄,它沒有顯示,我得到警告(getUsers方法)。我已經刪除了第一列(employeeno Int),並且再次嘗試了ravinder提出的更改,但它仍未更新表。 –

+0

你的'delete'語句的框架如何? '從table_name中刪除,其中id ='nick''或什麼?如果是的話,你沒有正確的框架你的html對象。這應該是'... id =?',並且'Employeeno'的值應該使用準備好的語句填充佔位符。 –

+0

這裏是我的刪除語句String delete =「DELETE from users WHERE empfirstname =?」; –

相關問題