Mise a jour de l'identidiant
Fermé
abayekhizi
Messages postés
3
Date d'inscription
samedi 10 août 2013
Statut
Membre
Dernière intervention
21 août 2016
-
20 août 2016 à 21:17
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 21 août 2016 à 11:28
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 21 août 2016 à 11:28
A voir également:
- Mise a jour de l'identidiant
- Mise a jour airpods - Guide
- Desactiver mise a jour windows 10 - Guide
- Mise a jour windows 11 22h2 - Guide
- Mise à jour pilote - Guide
- Mise à jour windows 10 22h2 - Guide
1 réponse
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
20 août 2016 à 22:01
20 août 2016 à 22:01
Bonjour,
Je ne comprends pas bien ton code...
Déjà il faudrait faire des PreparedStatement pour éviter l'injection SQL, d'autre part num_facture est a priori une clé donc à quoi sert le LIMIT ?
D'ailleurs si c'est un numéro pourquoi mettre des String ? Tu dois choisir de manière adaptée les types de données que tu manipules.
Quant à ton décalage, ça ressemble à une mauvaise idée, effectivement pour l'utilisateur c'est peut-être utile dans l'interface graphique, mais ça ne sert à rien de persister cette donnée en base, il faut juste faire un mapping côté Java pour que lorsque tu requêtes la valeur "2" dans ton interface graphique cela corresponde au num "12345" en base de données.
Je ne comprends pas bien ton code...
String lsSQL2="select num from entre where num_facture='"+nf1.getText()+"' LIMIT "+var+",1";
Déjà il faudrait faire des PreparedStatement pour éviter l'injection SQL, d'autre part num_facture est a priori une clé donc à quoi sert le LIMIT ?
D'ailleurs si c'est un numéro pourquoi mettre des String ? Tu dois choisir de manière adaptée les types de données que tu manipules.
Quant à ton décalage, ça ressemble à une mauvaise idée, effectivement pour l'utilisateur c'est peut-être utile dans l'interface graphique, mais ça ne sert à rien de persister cette donnée en base, il faut juste faire un mapping côté Java pour que lorsque tu requêtes la valeur "2" dans ton interface graphique cela corresponde au num "12345" en base de données.
21 août 2016 à 01:24
ResultSet result1 = state.executeQuery(lsSQL2);21 août 2016 à 11:28
Voici une version rigoureuse de ton décalage de numéros :
import java.sql.*; import java.util.*; // ... public SortedSet<Integer> getNumForNumFacture(String numFacture) throws SQLException { String sql = "SELECT num FROM entre WHERE num_facture = ?"; try (PreparedStatement ps = con.prepareStatement(sql)) { ps.setString(1, numFacture); try (ResultSet rs = ps.executeQuery()) { SortedSet<Integer> set = new TreeSet<>(); while (rs.next()) { Integer num = rs.getInt(1); if (!rs.wasNull()) { if (!set.add(num)) { throw new SQLException("numFacture `" + numFacture + "` had multiple num " + num); } } } return set; } } } public void deleteNumForNumFacture(String numFacture, Integer numToDelete) throws SQLException { String sql = "DELETE FROM entre WHERE num_facture = ? AND num = ?"; try (PreparedStatement ps = con.prepareStatement(sql)) { ps.setString(1, numFacture); ps.setInt(2, numToDelete); int n = ps.executeUpdate(); if (n != 1) { throw new SQLException(n + " rows deleted (expected 1) when deleting num " + numToDelete + " for numFacture `" + numFacture + "`"); } } } public void updateNumForNumFacture(String numFacture, Integer numPrevious, Integer numNext) throws SQLException { String sql = "UPDATE entre SET num = ? WHERE num_facture = ? AND num = ?"; try (PreparedStatement ps = con.prepareStatement(sql)) { ps.setInt(1, numNext); ps.setString(2, numFacture); ps.setInt(3, numPrevious); int n = ps.executeUpdate(); if (n != 1) { throw new SQLException(n + " rows updated (expected 1) when updating num " + numPrevious + " to " + numNext + " for numFacture `" + numFacture + "`"); } } } public void delete(String numFacture, Integer numToDelete) throws SQLException { SortedSet<Integer> numSet = getNumForNumFacture(numFacture); if (!numSet.contains(numToDelete)) return; deleteNumForNumFacture(numFacture, numToDelete); Integer[] numArray = numSet.toArray(new Integer[numSet.size()]); for (int i = Arrays.binarySearch(numArray, numToDelete) + 1; i < numArray.length; i++) { updateNumForNumFacture(numFacture, numArray[i], numArray[i - 1]); } }Ce qui donne :