SQLException: la méthode executeQuery ne peut pas être utilisée pour la mise à jour

j'essaie d'insérer des informations utilisateur prises à partir d'un formulaire d'inscription dans Derby DB en utilisant une classe Java servlet.

je me connecte à la base de données sur NetBeans juste après que l'utilisateur clique sur le bouton Soumettre avec les informations de l'utilisateur rempli. Alors il devrait exécuter cette méthode:

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

Mais je reçois l'exception suivante:

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

Qu'est-ce que cela signifie exactement?

la commande SQL est correcte car je peux le faire manuellement NetBeans SQL Command window.

y a-t-il des restrictions pour les servlets ou quelque chose que je ne connais pas?

Merci d'avance!

12
demandé sur John Woo 2013-04-15 06:37:33

2 réponses

puisque vous insérez un enregistrement, vous devriez utiliser executeUpdate() pas executeQuery().

Voici quelques méthodes qui sont généralement mal utilisé:


Boolean execute ()

exécute L'instruction SQL dans cet objet PreparedStatement, qui peut être n'importe quelle sorte de déclaration SQL.

ResultSet executeQuery ()

exécute la requête SQL dans cet objet PreparedStatement et retourne le Objet ResultSet généré par la requête.

int executeUpdate ()

exécute L'instruction SQL dans cet objet PreparedStatement, qui doit être une instruction SQL INSERT, UPDATE ou DELETE; ou une instruction SQL cela ne renvoie rien, comme une déclaration DDL.


une chose de plus, votre requête est faible car elle est vulnérable avec SQL Injection. Veuillez paramétrer en utilisant PreparedStatement.

Exemple De Code 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();
21
répondu John Woo 2013-04-15 02:49:18

pour mettre à jour les valeurs, vous devez utiliser un ensemble de résultats actualisable, comme suit:

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

Alternativement, vous pouvez utiliser la méthode executeUpdate de déclaration, comme suit: statement.executeUpdate("update table set id = 2");

1
répondu hd1 2013-04-15 02:43:02