简体   繁体   中英

insert query with varchar as data type for primary key

The program is not accepting the query given below-

 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);

   }
   }

The table is:

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

I have currently kept the value of userid,password, code and position as String.The stack trace is:

 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)

BUILD SUCCESSFUL (total time: 0 seconds)

Help!

When you are using a PreparedStatement , then you should use the executeQuery() , executeUpdate() or execute() method that does not take a String parameter.

So to fix the problem use:

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

The MySQL driver implementation has a bug, because the JDBC specification states that the methods accepting a string should throw an SQLException when called on a PreparedStatement or CallableStatement implementation. In this case it only throws the exception because it tries to execute the parametrized query directly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM