MySQL SQLException Parameter index out of range (1 > number of parameters, which is 0).

Snickers0815

Mitglied
Hallo Leute,

Könnt ihr mir helfen wieso ich hier eine "out of range"-Exception bekomme?

Java:
JButton btnUpdate = new JButton("Update");
       btnUpdate.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent arg0) {
               try {
                   String query = "update kunde set KundenNR='" + textFieldKundennr.getText()
                           + "',TelefonNR='" + textFieldTelefonnr.getText() + "',`E-Mail`='" + textFieldEmail.getText()
                           + "',',Vorname='"+ textFieldVorname.getText() + "', Nachname='" + textFieldNachname.getText()
                           + "',Username='" + textFieldUsername.getText() + "',Password='"
                           + textFieldPasswort.getText() + "',Straße='" + textFieldStraße.getText() + "',Stadt='" + textFieldStadt.getText() + "',PLZ='" + textFieldPLZ.getText() + "',Geburtstag='" + "',Sparkonto=?,Girokonto=?,Festgeldkonto=?,Aktienfond=?,Kreditwürdig=?,AnsprechpartnerNR='" + textFieldAnsprechpartnernr.getText() + "' where KundenNR='"
                           + textFieldKundennr.getText() + "'";
                   PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);
                   if(rdbtnJaSparkonto.isSelected()){
                       statement.setString(1, "1");
                   }else{
                       statement.setString(1, "0");
                   }
                   if(rdbtnJaGirokonto.isSelected()){
                       statement.setString(2, "1");
                   }else{
                       statement.setString(2, "0");
                   }
                   if(rdbtnJaFestgeldkonto.isSelected()){
                       statement.setString(3, "1");
                   }else{
                       statement.setString(3, "0");
                   }
                   if(rdbtnJaKredtwürdig.isSelected()){
                       statement.setString(5, "1");
                   }else{
                       statement.setString(5, "0");
                   }
                   if(rdbtnJaAktienfond.isSelected()){
                       statement.setString(4, "1");
                   }else{
                       statement.setString(4, "0");
                   }

                   statement.execute();

                   JOptionPane.showMessageDialog(null, "Kunde geupdated");

                   statement.close();

               } catch (Exception e) {
                   e.printStackTrace();
               }
               refreshTabele();
           }
       });

Vielen Dank im Voraus :)

Gruß Snickers
 

JCODA

Top Contributor
Einiges ist mir aufgefallen, du schreibst: ...Geburtstag='" + "',Spar...
D.h. Geburtstag ist leer?

Zudem: Du verwendest die PreparedStatements in der Hinsicht "falsch". Die sind ja dafür da um SQL-Injections zu verhindern. D.h. alle Nutzereingaben, müssen durch das setString erfolgen. Andererseits sind diese boolschen Werte harmlos und könnten deshalb direkt in den String eingefügt werden.

Desweiteren ist es komisch, dass du mehrere verschiedene Schreibweisen benutzt: die Email ist zwischen diesen Apostrophen, während der Rest dies nicht ist.

Lass dir mal den query-String ausgeben, wie lautet er?

Ansonsten könnte das noch relevant sein:

hier: http://stackoverflow.com/questions/...-index-out-of-range-1-number-of-parameters-wh
in der zweiten Antwort weißt jemand drauf hin, dass es ein Problem mit der .jar sein könnte.
Ob das bei dir zutrifft weiß ich leider nicht.
 

Snickers0815

Mitglied
Oh ja Geburtstag habe ich vergessen zu übergeben, weil ich mir unsicher war wie ich das übergebe. Denn wenn in das Textfeld ein Geburstag eingegeben wird sieht es wahrscheinlich wie folgt aus: 1.1.1992. In meiner Daten Bank werden Datums ja wie folgt abgespeichert: 1992-1-1. Daher wusste ich nicht ob ich einfach den Inhalt meines Textfeldes übergeben kann ohne einen Fehler zu bekommen oder ob ich die Schreibweise anpassen muss??

Wegen meinen boolischen Werten habe ich die PreparedStatements genutzt wegen der if Abfrage. Ich muss ja erstmal überprüfen ob Ja oder Nein ausgewählt wurde und anhand davon dann true oder false übergeben. Wusste nicht wie ich das anders lössen kann..

Wegen den Apostrophen bei meiner E-Mail die musste ich so benutzen. Da ich einen Fehler bekommen habe wenn ich sie weggelassen habe. Musste da etwas rumprobieren und habe festgestellt, dass das wohl an dem Bindestrich zwischen E und Mail liegt. Wenn ich die Apostroph weglasse erkennt SQL das nicht als Variable.

Durch die Exception wird mir keine Ausgabe meiner Query gegeben. Denke zumindest, dass es an dem Error liegt.
 

Harry Kane

Top Contributor
Boolesche Werte können mit PreparedStatement.setBoolean(int index, boolean bool) gesetzt werden.
Wenn du konsequent alle Parameter mit den entsprechenden setXYZ Methoden übergibst, anstatt sie in deinem statement string hart zu verdrahten, müssten auch Probleme mit Anfürhungszeichen verschwinden, und das statement dürfte um mehr als die Hälfte schrumpfen.
 

Snickers0815

Mitglied
Sorry für meine Frage, aber ich verstehe nicht ganz wie du das mit den setXYZ Methoden meinst :/

Meintest du das mit dem .setBoolen() so?
Java:
statement.setBoolean(1, rdbtnJaSparkonto.isSelected());
                   statement.setBoolean(2, rdbtnJaGirokonto.isSelected());
                   statement.setBoolean(3, rdbtnJaFestgeldkonto.isSelected());
                   statement.setBoolean(4, rdbtnJaAktienfond.isSelected());
                   statement.setBoolean(5, rdbtnJaKredtwürdig.isSelected());
 

Snickers0815

Mitglied
In diesem Fall ist "XYZ" ein Platzhalter für den Typ der gesetzt werden soll. Es gibt die Methoden setString, setBoolean, setInteger, ......

Okay, verstanden.

Benutze ich dann jetzt das PreparedStatement richtig?

Java:
String query = "update kunde set KundenNR='" + textFieldKundennr.getText()
                           + "',TelefonNR='" + textFieldTelefonnr.getText() + "',`E-Mail`='" + textFieldEmail.getText()
                           + "',',Vorname='"+ textFieldVorname.getText() + "', Nachname='" + textFieldNachname.getText()
                           + "',Username='" + textFieldUsername.getText() + "',Password='"
                           + textFieldPasswort.getText() + "',Straße='" + textFieldStraße.getText() + "',Stadt='" + textFieldStadt.getText() + "',PLZ='" + textFieldPLZ.getText() + "',Geburtstag='" + "',Sparkonto=?,Girokonto=?,Festgeldkonto=?,Aktienfond=?,Kreditwürdig=?,AnsprechpartnerNR='" + textFieldAnsprechpartnernr.getText() + "' where KundenNR='"
                           + textFieldKundennr.getText() + "'";
                   PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);
                   
                   statement.setBoolean(1, rdbtnJaSparkonto.isSelected());
                   statement.setBoolean(2, rdbtnJaGirokonto.isSelected());
                   statement.setBoolean(3, rdbtnJaFestgeldkonto.isSelected());
                   statement.setBoolean(4, rdbtnJaAktienfond.isSelected());
                   statement.setBoolean(5, rdbtnJaKredtwürdig.isSelected());
 

Joose

Top Contributor
Benutze ich dann jetzt das PreparedStatement richtig?
Nicht ganz. Alle Werte die du mittels String concat einfügst setzt kannst du per Parameter setzen lassen.

Java:
String query = "UPDATE kunde SET KundenNR=?, TelefonNR=?, `E-Mail`=?, Vorname=?, Nachname=?, Username=?, Password=?, Straße=?, Stadt=?, PLZ=?, Sparkonto=?, Girokonto=?, Festgeldkonto=?, Aktienfond=?, Kreditwürdig=?, AnsprechpartnerNR=? where KundenNR=?";
PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);

statement.setString(1, textFieldKundennr.getText());
statement.setString(2, textFieldTelefonnr.getText());
statement.setString(3, textFieldEmail.getText());
statement.setString(4, textFieldVorname.getText());
statement.setString(5, textFieldNachname.getText());
statement.setString(6, textFieldUsername.getText());
statement.setString(7, textFieldPasswort.getText());
statement.setString(8, textFieldStraße.getText());
statement.setString(9, textFieldStadt.getText());
statement.setString(10, textFieldPLZ.getText());
statement.setBoolean(11, rdbtnJaSparkonto.isSelected());
statement.setBoolean(12, rdbtnJaGirokonto.isSelected());
statement.setBoolean(13, rdbtnJaFestgeldkonto.isSelected());
statement.setBoolean(14, rdbtnJaAktienfond.isSelected());
statement.setBoolean(15, rdbtnJaKredtwürdig.isSelected());
statement.setString(16, textFieldAnsprechpartnernr.getText());
statement.setString(17, textFieldKundennr.getText());
Da ich nicht weiß welche Typen welches Datenbankfeld hat, verwende ich überall setString. Du solltest es natürlich an die enstprechende Methode anpassen.

Anmerkung: in diesem Statement kannst du die KundenNr updaten und verwendest in der WHERE Bedingung ebenso die geändert KundenNr -> das wird nicht funktionieren das du für die WHERE Bedingung die alte KundenNr brauchen wirst.
 

Snickers0815

Mitglied
Ahh okay, verstanden. Eine kleine Frage noch: Wie mache ich das mit dem Datum?

Oh ja Geburtstag habe ich vergessen zu übergeben, weil ich mir unsicher war wie ich das übergebe. Denn wenn in das Textfeld ein Geburstag eingegeben wird sieht es wahrscheinlich wie folgt aus: 1.1.1992. In meiner Daten Bank werden Datums ja wie folgt abgespeichert: 1992-1-1. Daher wusste ich nicht ob ich einfach den Inhalt meines Textfeldes übergeben kann ohne einen Fehler zu bekommen oder ob ich die Schreibweise anpassen muss??
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V SQLite java.sql.SQLException: no such column: Datenbankprogrammierung 18
D MySQL SQLException time zone value is unrecognized Datenbankprogrammierung 2
M Oracle SQLException: Verbindung getrennt Datenbankprogrammierung 2
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
nrg Oracle java.sql.SQLException Ungültiger Vorgang bei schreibgeschützter Ergebnismenge Datenbankprogrammierung 0
N SQL-Statement SQLException: the '|' object Datenbankprogrammierung 3
N SQL-Statement SQLException: '' is not a valid name. Datenbankprogrammierung 7
Y java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state Datenbankprogrammierung 2
H Derby/JavaDB SQLException wenn die Datenbank in eine Jar gepackt wurde. Datenbankprogrammierung 6
I java.sql.SQLException: No data found Datenbankprogrammierung 3
T java.sql.SQLException: unexpected end of statement Datenbankprogrammierung 2
H java.sql.SQLException: Access denied for user 'root'@'localhost' (using password : YES) Datenbankprogrammierung 1
D getConnection mit SQLException Datenbankprogrammierung 7
F SQLException fangen beim verbinden mit Hibernate Datenbankprogrammierung 17
D java.sql.SQLException Datenbankprogrammierung 3
S SQLException: No suitable driver bei DB2 Datenbankprogrammierung 4
J Einstellungen für die Ausnahme SQLException Datenbankprogrammierung 7
M java.sql.SQLException: Unable to open file Datenbankprogrammierung 2
M java.sql.SQLException: out of memory Datenbankprogrammierung 18
zilti java.sql.SQLException: Before start of result set Datenbankprogrammierung 2
C FM: java.sql.SQLException: Geschlossene Ergebnismenge: next Datenbankprogrammierung 7
A Problem: java.sql.SQLException Datenbankprogrammierung 5
I hilfe! java.sql.SQLException Datenbankprogrammierung 7
M java.sql.SQLException: No data found Datenbankprogrammierung 9
K MsAccess immer beim zweiten Update java.sql.SQLException Datenbankprogrammierung 28
C SQLException wenn String auf VARCHAR geschrieben wird Datenbankprogrammierung 10
G SQLException: Lässt sich der Fehler feststellen? Datenbankprogrammierung 10
R MySQL denies access to data source - java.sql.SQLException Datenbankprogrammierung 14
L SQLException --> Übersetzung nötig! Datenbankprogrammierung 2
G SQLException: No operations allowed after connection closed Datenbankprogrammierung 2
K java.sql.SQLException: Before start of result set Datenbankprogrammierung 2
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
R Datenbankerstellung: Übergabe Parameter Datenbankprogrammierung 0
J JDBC SQL Statement mit Parameter Datenbankprogrammierung 7
F Oracle The parameter name [...] in the query's selection criteria does not match any parameter name d Datenbankprogrammierung 2
R PreparedStatement ohne Parameter? Datenbankprogrammierung 4
M Access Abfrage mit Parameter & Access/Java liefern unterschiedliche Ergebnisse Datenbankprogrammierung 2
K Hibernate Criteria Restrictions.in("...","..") - Fehlender In- oder OUT-Parameter auf Index:: 1 Datenbankprogrammierung 3
H DB auslesen (Hibernate, Query, Parameter) Datenbankprogrammierung 8
A Oracle Session Parameter per JDBC? Datenbankprogrammierung 14
S Parameter in SQL-Abfrage nutzen Datenbankprogrammierung 8
Landei PreparedStatement Parameter mehrfach verwenden Datenbankprogrammierung 18
R SELECT aus hsqldb mit Parameter Datenbankprogrammierung 2
K [hibernate] show_sql: Werte der Parameter anzeigen Datenbankprogrammierung 3
R Invalid parameter bindings bei MS SQL Server Datenbankprogrammierung 2
F Auslesen einer .dbf-Datei, Zuordnung Index Datenbankprogrammierung 0
O PostgreSQL Java Row Index erhalten Datenbankprogrammierung 1
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
N Problem bei Erstellung eines Index Datenbankprogrammierung 12
C Hibernate Objekte per Index ansprechen Datenbankprogrammierung 4
F index erzeugen Datenbankprogrammierung 6
F HSQLDB Auf vorhandenen Index prüfen Datenbankprogrammierung 3
F Problem mit einer Sql Index Datenbankprogrammierung 2
X Index auf Varchar??? Datenbankprogrammierung 17
G Hibernate @Index Datenbankprogrammierung 7
A Index bzw. Indizes von Tabellen herausfinden Datenbankprogrammierung 3
R Unknown initial character set index . received from server Datenbankprogrammierung 5
N ID des Datensatzes aus JTable holen (nicht Index!) Datenbankprogrammierung 4
S Index einer editierten spalte? Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben