2013-04-15 5 views
12

Ich versuche, Benutzerinformationen aus einem Registrierungsformular in Derby DB mit einer Java-Servlet-Klasse einzufügen.SQLException: executeQuery-Methode kann nicht für Aktualisierung verwendet werden

Ich werde mit der DB auf NetBeans verbunden, gleich nachdem der Benutzer auf den Submit-Button mit den Benutzerinformationen geklickt hat. Dann sollte es diese Methode ausführen:

public void insertNewUser(String userName, String passWord, String lastName, String firstName, String age, char sex, String email) { 
    try { 
     stmt = conn.createStatement(); 
     String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES ('" + userName + "', '" + passWord + "', '" + lastName + "', '" + firstName + "', " + age + ", '" + sex + "', '" + email + "')"; 
     System.out.println(insertNewUserSQL); 
     stmt.executeQuery(insertNewUserSQL); 
     stmt.close(); 
    } catch(SQLException sqlExcept) { 
     sqlExcept.printStackTrace(); 
    } 
} 

Aber ich halte die folgende Ausnahme erhalten:

java.sql.SQLException: executeQuery method can not be used for update. 

Was dies genau bedeutet?

Der SQL-Befehl ist korrekt, wie ich es manuell in NetBeans SQL Command-Fenster tun kann.

Gibt es Beschränkungen für Servlets oder etwas, von dem ich nichts weiß?

Vielen Dank im Voraus!

Antwort

20

Da Sie einen Datensatz einfügen, sollten Sie executeUpdate() nicht executeQuery() verwenden.

Hier sind einige Methoden, die in der Regel missbraucht werden:


boolean ausführen()

Führt die SQL-Anweisung in diesem PreparedStatement-Objekt, das jede Art von SQL-Anweisung sein kann.

ResultSet executeQuery()

führt die SQL-Abfrage in diesem PreparedStatement- Objekt und gibt das ResultSet Objekt durch die Abfrage erzeugt wird.

executeUpdate int()

führt die SQL-Anweisung in diesem PreparedStatement- Objekt, das muss eine SQL INSERT, UPDATE und DELETE-Anweisung ist; oder eine SQL-Anweisung , die nichts zurückgibt, z. B. eine DDL-Anweisung.


Eine weitere Sache, Ihre Frage ist schwach, wie es mit SQL Injection verwundbar ist. Bitte parametrieren mit PreparedStatement.

Beispielcode Snippet:

String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES (?, ?, ?, ?, ?, ?, ?)"; 
PreparedStatement pstmt = con.prepareStatement(insertNewUserSQL); 
pstmt.setString(1, userName); 
// ... repeat this step until the last parameter .... 
pstmt.setString(7, email); 
pstmt.executeUpdate(); 
+0

Vielen Dank, J W! Lief wie am Schnürchen! – dinky

+1

@Dinky siehe meine aktualisierte Antwort, die Code-Snippet enthält. –

+0

J W, vielen Dank. Dies ist sehr hilfreich für Anfänger wie mich. Ich werde sicherstellen, dass ich PreparedStatements verwende! Danke noch einmal! – dinky

1

Werte bearbeiten Sie benötigen einen aktualisierbaren ResultSet verwenden, wie folgt:

ResultSet res = preparedStatement.executeQuery(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 
res.first(); 
res.updateInt("id", 2); 
res.updateRow(); 

Alternativ können Sie verwenden Die ExecuteUpdate-Methode der Anweisung lautet wie folgt: statement.executeUpdate("update table set id = 2");

+0

Vielen Dank, hd1. executeUpdate() funktioniert super! – dinky

Verwandte Themen