2013-04-26 72 views
0

程序不接受如下─與VARCHAR作爲主鍵

public class loginDaos { 

     public void create(loginBean bean) { 
      ConnectionPool c = ConnectionPool.getInstance(); 
      c.initialize(); 
      Connection con = c.getConnection(); 
      try { 
       String sql = "INSERT INTO login VALUES(?,?,?,?)"; 
       PreparedStatement pstmt = con.prepareStatement(sql); 
       pstmt.setString(1, bean.getCode()); 
       pstmt.setString(2, bean.getUserid()); 
       pstmt.setString(3, bean.getPassword()); 
       pstmt.setString(4, bean.getPosition()); 
       pstmt.executeUpdate(sql); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    public static void main(String args[]) { 
     loginDaos ld = new loginDaos(); 
     loginBean lb = new loginBean("representative", "rep7", "rep7", "r"); 
     ld.create(lb); 

    } 
    } 

該表中給出的查詢數據類型插入查詢是:

CREATE TABLE login 
(userid char(25); 
    password varchar(45), 
    code char(5), 
    position char(), 
    PRIMARY KEY (code) 
); 

我已經目前保持的userid的值,密碼,代碼和位置String.The堆棧跟蹤是:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?,?,?)' at line 1 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    at com.mysql.jdbc.Util.getInstance(Util.java:381) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536) 
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1564) 
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1485) 
    at login.loginDaos.create(loginDaos.java:33) 
    at login.loginDaos.main(loginDaos.java:42) 

生成成功(總時間:0秒)

幫助!

回答

0

如果您使用的是PreparedStatement,那麼你應該使用不採取String參數executeQuery()executeUpdate()或​​方法。

因此,要解決這個問題用途:

// .... 
pstmt.setString(3, bean.getPassword()); 
pstmt.setString(4, bean.getPosition()); 
pstmt.executeUpdate(); 

MySQL驅動實現有一個錯誤,因爲JDBC specification指出,在PreparedStatementCallableStatement執行調用時接受一個字符串的方法應該拋出一個SQLException。在這種情況下,它只會引發異常,因爲它會直接嘗試執行參數化查詢。

+0

謝謝!將永遠記住這個概念吧! – 2013-04-26 15:28:55