2013-04-15 14 views
12

Sto tentando di inserire le informazioni utente prese da un modulo di registrazione in Derby DB utilizzando una classe servlet java.SQLException: il metodo executeQuery non può essere utilizzato per l'aggiornamento

Mi collego al DB su NetBeans subito dopo che l'utente fa clic sul pulsante di invio con le informazioni dell'utente compilate. Poi dovrebbe funzionare questo metodo:

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(); 
    } 
} 

Ma continuo a ricevere la seguente eccezione:

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

Cosa significa esattamente?

Il comando SQL è corretto poiché posso eseguire manualmente la finestra Comando SQL NetBeans.

Esistono restrizioni per servlet o qualcosa che non conosco?

Grazie in anticipo!

risposta

20

Poiché si sta inserendo un record, si dovrebbe usare executeUpdate() non executeQuery().

Ecco alcuni metodi che di solito sono impropriamente:


booleana execute()

esegue l'istruzione SQL in questo oggetto PreparedStatement, che può essere qualsiasi tipo di istruzione SQL.

ResultSet executeQuery()

Esegue la query SQL in questo oggetto PreparedStatement e restituisce l'oggetto ResultSet generato dalla query.

int executeUpdate()

Esegue SQL in questo oggetto PreparedStatement, che deve essere uno SQL INSERT, UPDATE o DELETE; oppure un'istruzione SQL che non restituisce nulla, ad esempio un'istruzione DDL.


più una cosa, la query è debole in quanto è vulnerabile con SQL Injection. Si prega di parametrizzare usando PreparedStatement.

Esempio di codice 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

Grazie, J W! Ha funzionato come un fascino! – dinky

+1

@Dinky vedi la mia risposta aggiornata che include lo snippet di codice. –

+0

J W, grazie molte. Questo è molto utile per i noob come me. Mi assicurerò di usare PreparedStatements! Grazie ancora! – dinky

1

per aggiornare i valori è necessario utilizzare un ResultSet aggiornabile, come segue:

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

In alternativa, è possibile utilizzare il metodo di esecuzione executeUpdate, come segue: statement.executeUpdate("update table set id = 2");

+0

Grazie, hd1. executeUpdate() funziona alla grande! – dinky

Problemi correlati