2017-10-09 2 views
0

J'essaye d'écrire un programme pour permettre à l'utilisateur de mettre à jour une certaine valeur dans une colonne dans une base de données sql. J'utilisais executeQuery lorsque j'écrivais des données dans la base de données et je suis allé copier et coller le même code à utiliser lors de la mise à jour d'une valeur.Conversion de executeQuery en executeUpdate

J'ai changé l'instruction SQL pour mettre à jour la valeur et j'ai lu que je devais changer mon executeQuery en executeUpdate. Cependant quand je suis allé pour changer cela j'ai reçu une erreur indiquant que int ne peut pas être converti en ResultSet.

case "G": 

    System.out.println("Enter the player ID:"); 
    String playerId = FileUtility.getInput().nextLine(); 

    System.out.println("Here are the players"); 
    //theList = loadCampersFromDatabase(theList); 
    for (Player camper : PlayerDAO.selectAllById(playerId)) { 
     System.out.println(camper); 
    } 
    System.out.println("Enter the new amount paid"); 
    int newAmountPaid = FileUtility.getInput().nextInt(); 

    ArrayList<Player> players = new ArrayList(); 
    PreparedStatement ps = null; 
    String sql = null; 
    Connection conn = null; 
    try { 
     conn = ConnectionUtils.getConnection(); 

     sql = "UPDATE `Camper` SET `amountPaid` where id like ?"; 

     ps = conn.prepareStatement(sql); 
     ps.setString(1, playerId + "%"); 
     ResultSet rs = ps.executeUpdate(); 

     while (rs.next()) { 

     int newId = rs.getInt("id"); 
     String firstName = rs.getString("firstName"); 
     String lastName = rs.getString("lastName"); 
     String parentsName = rs.getString("parentsName"); 
     int phoneNumber = rs.getInt("phoneNumber"); 
     String email = rs.getString("email"); 
     int amountPaid = rs.getInt("amountPaid"); 
     players.add(new Player(newId, firstName, lastName, 
     parentsName, phoneNumber, email, amountPaid)); 

     } 

    } catch (Exception e) { 
     String errorMessage = e.getMessage(); 
     e.printStackTrace(); 
    } finally { 
     DbUtils.close(ps, conn); 
    } 

    break; 
+1

executeUpdate retourne un entier représentant le nombre de lignes ont été affectées, par opposition à executeQuery. – BaSsGaz

+0

@BaSsGaz Je n'ai pas besoin de retourner quoi que ce soit à la fin, j'ai juste besoin de mettre à jour cette colonne dans la table –

+0

Votre code est pour les résultats d'une requête de sélection, vous ne pouvez pas remplacer cela pour executeUpdate. Vous pouvez exécuter la mise à jour avant/après la requête ou vous pouvez mettre à jour le resultset au lieu d'exécuter la mise à jour. – eckes

Répondre

0

Vous avez confondu avec les méthodes executeUpdate() et executeQuery().

  1. executeUpdate(): de MISE À JOUR exécute 'et d'autres statments et renvoie une valeur int, il indique le nombre de lignes sont affectées par votre déclaration mise à jour. ExecuteCuice() - Cette méthode exécute uniquement la requête 'SELECT' et renvoie l'instance ResultSet qui peut être utilisée pour interagir dans une boucle (while) pour récupérer et afficher tous les enregistrements utilisant généralement l'instruction select.

Je vous suggère de refaire la logique de votre méthode. Je pouvais voir votre requête de mise à jour, vous avez seulement passé une valeur pour 'id' dans la requête et pas pour 'amountPaid'.
Réécrivez l'instruction de mise à jour et utilisez la méthode executeUpdate() pour effectuer la mise à jour.

0

Retirez simplement le Resultset et sa boucle while correspondante sous forme de requêtes d'action (UPDATE, INSERT, DELETE, CREATE, ALTER, DROP) ne reviennent pas resultsets, seulement SELECT requêtes. Ci-dessous vous pour lier part du principe que voulais dire newAmountPaid dans la requête:

sql = "UPDATE `Camper` SET `amountPaid` = ? where id like ?"; 

ps = conn.prepareStatement(sql); 
ps.setInt(1, newAmountPaid); 
ps.setString(2, playerId + "%"); 

ps.executeUpdate();