Impossible de publier des instructions de manipulation de données avec executeQuery ()

J’utilise com.mysql.jdbc.Driver

J’ai besoin d’insérer et d’obtenir l’identifiant. Ma requête:

 INSERT INTO Sessions(id_user) VALUES(1); SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1; 

Erreur –

Impossible de publier des instructions de manipulation de données avec executeQuery ()

Comment insérer et obtenir un identifiant?

Vous devrez utiliser la méthode executeUpdate () pour exécuter l’instruction INSERT, tandis que vous devrez utiliser la méthode executeQuery () pour exécuter l’instruction SELECT. Cela est dû aux exigences imposées par la spécification JDBC à leurs utilisations:

À partir de la documentation de l’API Java pour Statement.executeQuery () :

Exécute l’instruction SQL donnée, qui retourne un seul object ResultSet.

Paramètres:

sql – une instruction SQL à envoyer à la firebase database, généralement une instruction SQL SELECT statique

et de la documentation de l’API Java pour Statement.executeUpdate () :

Exécute l’instruction SQL donnée, qui peut être une instruction INSERT, UPDATE ou DELETE ou une instruction SQL qui ne renvoie rien, telle qu’une instruction SQL DDL.

Paramètres:

sql – une instruction DML (SQL Data Manipulation Language) , telle que INSERT, UPDATE ou DELETE; ou une instruction SQL qui ne renvoie rien , telle qu’une instruction DDL.

Votre code (pseudo-code posté ici) devrait apparaître comme:

 statement.executeUpdate("INSERT INTO Sessions(id_user) VALUES(1)"); // DML operation statement.executeQuery("SELECT LAST_INSERT_ID()"); // SELECT operation 

Et bien sûr, la documentation MySQL montre comment effectuer la même activité pour les colonnes AUTO_INCREMENT , ce qui est apparemment ce dont vous avez besoin.

Si vous devez les exécuter ensemble dans la même transaction, en soumettant les instructions dans une chaîne avec un point-virgule les séparant comme suit:

 statement.execute("INSERT INTO Sessions(id_user) VALUES(1); SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;"); 

alors vous devrez utiliser la méthode execute (). Notez que cela dépend du support offert par la firebase database et le pilote JDBC pour regrouper des instructions en un seul execute (). Ceci est supporté par Sybase et MSSQL Server, mais je ne pense pas qu’il soit supporté par MySQL.

vous utilisez peut-être executeQuery (), mais pour manipuler des données, vous avez besoin de executeUpdate () plutôt que de executeQuery ()

  Connection connection = null; PreparedStatement preparedStatement = null; ResultSet generatedKeys = null; try { connection = m_Connection; preparedStatement = (PreparedStatement) connection.prepareStatement(qSsortingng, Statement.RETURN_GENERATED_KEYS); // ... int affectedRows = preparedStatement.executeUpdate(); if (affectedRows == 0) { throw new SQLException("Creating user failed, no rows affected."); } generatedKeys = preparedStatement.getGeneratedKeys(); int id = -1; if (generatedKeys.next()) { id = generatedKeys.getInt(1); id = -1; } else { throw new SQLException("Creating user failed, no generated key obtained."); } } finally { } 

Pour les instructions SQL non sélectionnées, utilisez ExecuteNonQuery();

Pour obtenir le dernier identifiant inséré, vous pouvez effectuer cette instruction SQL.

 SELECT LAST_INSERT_ID() AS last_id 

Bien qu’il y ait probablement un wrapper java pour cette instruction select.

Liens:
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
http://wiki.bibalex.org/JavaDoc/org/bibalex/daf/handlers/dbhandler/DBConnection.html