mysql - Java update sql Parameter index out of range -


i have problem update sql command in java, using jdbc connect mysql database. when want this:

db.createpreparedstatement("update kontakty set telefon = ?,mobil = ?,email = ? `idkontakty` = ?"); db.setint(1, integer.parseint(jtextfieldtelefon.gettext())); db.setint(2, integer.parseint(jtextfieldmobil.gettext())); db.setstring(3, jtextfieldemail.gettext()); db.setint(4, 1); 

it shows error.

    srp 20, 2017 8:10:42 odp. autoservis.spravazamestnancu.spravazamestnancu updatekontakt severe: null java.sql.sqlexception: parameter index out of range (4 > number of parameters, 3).     @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:964)     @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:897)     @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:886)     @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:860)     @ com.mysql.jdbc.preparedstatement.checkbounds(preparedstatement.java:3327)     @ com.mysql.jdbc.preparedstatement.setinternal(preparedstatement.java:3312)     @ com.mysql.jdbc.preparedstatement.setinternal(preparedstatement.java:3351)     @ com.mysql.jdbc.preparedstatement.setint(preparedstatement.java:3302)     @ autoservis.datovavrstva.databaze.setint(databaze.java:69)     @ autoservis.spravazamestnancu.spravazamestnancu.updatekontakt(spravazamestnancu.java:682)     @ autoservis.spravazamestnancu.spravazamestnancu.jbuttonupravitactionperformed(spravazamestnancu.java:361)     @ autoservis.spravazamestnancu.spravazamestnancu.access$200(spravazamestnancu.java:23)     @ autoservis.spravazamestnancu.spravazamestnancu$3.actionperformed(spravazamestnancu.java:123)     @ ... 

i have 4 "?" , 4 set function. dont work. idea? thanks

this class databaze. thank you

package autoservis.datovavrstva;  import java.sql.connection; import java.sql.date; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.savepoint; import java.sql.statement; import java.util.logging.level; import java.util.logging.logger;  public class databaze {      private static databaze instance;     private final string pripojovaciretezec = "jdbc:mysql://localhost:3306/autoservis";     private final string uzivateldb= "pripojenikdb";     private final string heslodb = "pripojenikdb";     private static connection connection;     private static statement statement;     private string query;     private savepoint savepoint;     private static preparedstatement preparedstatement;      private databaze() {         try {             connection = drivermanager.getconnection(pripojovaciretezec, uzivateldb, heslodb);             if (connection != null) {         system.out.println("you made it, take control database now!");     } else {         system.out.println("failed make connection!");     }         } catch (exception ex) {             system.out.println(ex.getmessage());             logger.getlogger(databaze.class.getname()).log(level.severe, null, ex);         }     }      public static databaze getinstance() {         if (instance == null) {             instance = new databaze();         }         return instance;     }      public statement createstatement() throws sqlexception {         statement = connection.createstatement();         return statement;     }      public preparedstatement createpreparedstatement(string query) throws sqlexception {         preparedstatement = connection.preparestatement(query);         return preparedstatement;     }     public void setstring(int pozice, string hodnota) throws sqlexception{         preparedstatement.setstring(pozice, hodnota);     }     public void setint(int pozice, int hodnota) throws sqlexception{         preparedstatement.setint(pozice, hodnota);     }     public void setdate(int pozice, date hodnota) throws sqlexception{         preparedstatement.setdate(pozice, hodnota);     }     public void setnull(int pozice,int typ) throws sqlexception{         preparedstatement.setnull(pozice, typ);     }     public void setdouble(int pozice, double hodnota) throws sqlexception{         preparedstatement.setdouble(pozice, hodnota);     }     public resultset executequery(string query) throws sqlexception{         return statement.executequery(query);     }     public boolean execute(string query) throws sqlexception{         return statement.execute(query);     }     public int executeupdate(string query) throws sqlexception{         return statement.executeupdate(query);     }     public resultset executepreparedquery() throws sqlexception{         return preparedstatement.executequery();     }     public boolean executeprepared() throws sqlexception{         return preparedstatement.execute();     }     public int executepreparedupdate() throws sqlexception{         return preparedstatement.executeupdate();     }     public boolean isclosed() throws sqlexception{         return connection.isclosed();     }     public void close() throws sqlexception{         connection.close();     }     public void commit() throws sqlexception{         connection.commit();     }     public void setautocommit(boolean commit) throws sqlexception{         connection.setautocommit(commit);     }     public void rollback() throws sqlexception{         connection.rollback(savepoint);     }     public void setsavepoint() throws sqlexception{         savepoint = connection.setsavepoint();     } } 

empty word becasue looks post code; please add more details. looks post code; please add more details.

you don't using correct preparedstatement using api.

why?

because

  1. there should method preparestatement , not createpreparedstatement
  2. there should method setint lowercase s , not setint uppercase s

for reason, assume using thing , not correct preparedstatement

so solve problem can use:

connection db = drivermanager.getconnection(db_url, db_username, db_password);  preparedstatement ps = db.preparestatement("update kontakty set telefon = ?, mobil = ?, email = ? `idkontakty` = ?");  ps.setint(1, integer.parseint(jtextfieldtelefon.gettext())); ps.setint(2, integer.parseint(jtextfieldmobil.gettext())); ps.setstring(3, jtextfieldemail.gettext()); ps.setint(4, 1); 

edit

how explain this, design little complicated, ok.

when call public preparedstatement createpreparedstatement(string query) pass query in it, create prepared statement query , return it mean have put in variable preparedstatement :

preparedstatement pst = db.createpreparedstatement(         "update kontakty set telefon = ?, mobil = ?, email = ? `idkontakty` = ?"); 

then call setters (there specific syntax of setters , getters, 1 of them should not start upper letter), set parameters in static prepared statement :

private static preparedstatement preparedstatement; 

in case can nullpointexception because preparedstatement null, in case don't because call createpreparedstatement.
note don't set attribute in correct statement error, instead have use :

preparedstatement pst = db.createpreparedstatement(             "update kontakty set telefon = ?, mobil = ?, email = ? `idkontakty` = ?");  pst.setint(1, integer.parseint(jtextfieldtelefon.gettext())); pst.setint(2, integer.parseint(jtextfieldmobil.gettext())); pst.setstring(3, jtextfieldemail.gettext()); pst.setint(4, 1); pst.executeupdate(); 

no need call setint(..), ...

hope understand problem now.

note

please not use upper letters in first letter of methods, not practice.


Comments

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -