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
- there should method
preparestatement
, notcreatepreparedstatement
- there should method
setint
lowercases
, notsetint
uppercases
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
Post a Comment