Retourne le nombre de lignes affectées par L'instruction SQL UPDATE en Java

J'utilise une base de données MySQL et j'y accède via Java.

PreparedStatement prep1 = this.connection.prepareStatement("UPDATE user_table 
                                                               SET Level = 'Super' 
                                                             WHERE Username = ?");
prep1.setString(1, username);

L'instruction update ci-dessus fonctionne bien mais je voudrais obtenir le nombre de lignes affectées par cette instruction. Est-ce possible s'il vous plaît?

26
demandé sur Gord Thompson 2010-04-03 20:48:23

7 réponses

Appeler executeUpdate() sur votre PreparedStatement devrait renvoyer un int, le nombre d'enregistrements mis à jour.

37
répondu brabster 2010-04-03 16:50:43

Statement.executeUpdate() ou execute(), suivie par getUpdateCount() retourne le nombre de lignes appariés, pas mise à jour, selon le JDBC spec. Si vous voulez le nombre mis à jour, vous pouvez spécifier useAffectedRows=true comme option D'URL non standard . Plus d'informations sont disponibles ici.

35
répondu Trevor Robinson 2015-10-12 19:44:35
  1. Tout d'abord, préparez l'objet 'PreparedStatement' en utilisant le constructeur ci-dessous:

    PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    //here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?") 
    
  2. Ensuite, définissez votre argument sur 'pStmt'. Dans ce cas:

    prep1.setString(1, username);
    
  3. Enfin, executeUpdate et get lignes affectées comme un entier

    int affectedRows = pStmt.executeUpdate();
    
4
répondu Lakshitha Kanchana 2016-11-10 10:16:13

En regardant cela tout à l'heure pour une autre situation similaire, où je veux seulement faire un travail supplémentaire si quelque chose a vraiment changé, je pense que la façon la plus neutre de le faire serait de modifier la requête pour exclure le cas où les champs set correspondent:

UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super'
2
répondu James West 2015-10-08 07:24:31

Ce nombre est retourné lorsque vous exécutez la requête:

int rows = prep1.executeUpdate(); 
System.out.printf("%d row(s) updated!", rows); 
1
répondu Andomar 2010-04-03 16:50:40

S'il est nécessaire de savoir combien de lignes seront affectées sans l'exécuter, vous devrez d'abord exécuter une instruction SELECT.

0
répondu Michael Munsey 2010-04-03 16:59:20

Le nombre de lignes affectées par SQL Update peut être retourné en utilisant SQL % ROWCOUNT(pour ORACLE) ou @@ROWCOUNT (pour SQL SERVER)

Note: afin de renvoyer le nombre de lignes mises à jour, supprimées, etc.. nous devons utiliser le paramètre OUT dans la procédure stockée qui stockera le nombre de lignes mises à jour,supprimées, etc..

  1. Pour obtenir le nombre de lignes mises à jour,supprimées etc.. nous devons utiliser méthode registerOutParameter en Java

  2. Pour stocker le nombre de lignes mises à jour ou supprimé etc.. dans l'une des Out paramètre dans la procédure stockée nous devons définir le type de cela paramètre dans notre script avant d'exécuter la commande. (En cas de Mettre à jour ou supprimer sera numérique)

  3. Une fois la commande exécutée, stockez la valeur de updated ou deleted lignes dans la variable (il peut s'agir d'une nouvelle variable ou de variables disponible en classe, etc.. en composant l'indice de paramètre (par exemple: A = cs.getInt (3) si le paramètre OUT dans la procédure stockée est 2e paramètre)

  4. Maintenant, la variable a la valeur de lignes mises à jour ou supprimées (c.-à-d.=10)

Exemple pour Porcedure stocké

Function demo( A varchar2(10), B OUT NUMBER)RETURN NUMBER IS EXIST_LP NUMBER;
BEGIN
UPDATE demo_temp SET name=A where name="ABC";
B:=SQL%ROWCOUNT -- total number of rows updated
RETRUN EXIST_LP;
END demo;

Exemple de script java

public void update(demo demo){
int rowCount = 0;
Connection conn = null;
CallableStatement cs = null;
try{
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("your data source path");
conn = ds.getConnection();
cs = conn.prepareCall("BEGIN ? :=demo_dbp.demo(?,?) ); END;"); // stored proc
cs.registerOutParameter(1, Types.INTEGER);
cs.setString(2, "XYZ");
cs.registerOutParameter(3, Types.NUMERIC);
rowCount=cs.execcuteUpdate();
demo.setUpdateCount(cs.getInt(3));
} catch (SQLException exc) {
  throw new DaoException("An SQL Exception has occurred.", exc);
} catch (NamingException ne) {
  throw new DaoException("A Naming Exception has occurred.", ne);
} catch (Exception e) {
  throw new DaoException("An Exception has occurred", e);
} finally {

  try {
            if (cs != null) {
                cs.close();
            }
} catch (SQLException ex1) {
}
try {
            if (conn != null) {
                conn.close();
            }
} catch (SQLException ex) {
}

}
}

Remarque: executeUpdate () ne renvoie pas le nombre de lignes mises à jour ou supprimées. Il renvoie juste 0 ou 1.

  1. 0 -- Échec De L'Exécution
  2. 1 -- Succès D'Exécution
0
répondu pvkrdy 2015-08-14 16:22:39