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
 
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.
 
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.
 
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.
 
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());
 
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());
 
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.
 
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??
 

Zurück
Oben