Récupérer un float à partir d'un HashMap

Fermé
startech Messages postés 12 Date d'inscription vendredi 26 mars 2010 Statut Membre Dernière intervention 14 octobre 2013 - 14 oct. 2013 à 08:55
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 14 oct. 2013 à 19:42
Bonjour tous,
j'ai développé un code java qui permet de récupérer des valeurs à partir des JTextField et les insérer dans un HashMap les valeurs de ce dernier vont stoker dans une base de données mon problème c'est que je puisse pas récupérer les valeurs de type Float et Int qui sont dans le HashMap
voilà mon code et toujours y a une erreur au niveau de ces deux types
merci pour vos aides
cette est la classe Insert elle marche bien
private HashMap info(){
HashMap tab = new HashMap() ;
Date d1 ;
Date d=Date.valueOf(date_c.getText());
if(date_r.getText().equals("")) d1 = null;
else d1=Date.valueOf(date_r.getText());
int num = Integer.parseInt(numero.getText()) ;
float mon = Float.parseFloat(montant.getText()) ;
int in = Integer.parseInt(inpitation.getText()) ;
tab.put("date1", d) ;
tab.put("date2", d1) ;
tab.put("numero", num) ;
tab.put("libelle", libelle.getText()) ;
tab.put("montant", mon) ;
tab.put("inpitation", in) ;
return tab ;
}

cette méthode est dans la classe GestionBase et ici le problème
protected void insert(String query,HashMap s){
try {
Class.forName(pilote);
Connection connexion =
DriverManager.getConnection("jdbc:mysql://localhost/cema","root","");
PreparedStatement prp = connexion.prepareStatement(query) ;
int z=0;
Iterator i = s.entrySet().iterator() ;
while(i.hasNext()){
Map.Entry entry = (Map.Entry) i.next();
if(entry.getKey().equals("montant"))
prp.setFloat(z,Float.parseFloat((String) entry.getValue())) ;
else{
if((entry.getKey().equals("date1"))||(entry.getKey().equals("date2")))
prp.setDate(z, (Date) entry.getValue()) ;
else{
if(entry.getKey().equals("numero"))
prp.setInt(z, Integer.parseInt((String)entry.getValue())) ;
else{
if(entry.getKey().equals("libelle"))
prp.setString(z, (String) entry.getValue()) ;
else prp.setInt(z, Integer.parseInt((String)entry.getValue())) ;
}
}
}
System.out.println(entry.getValue()) ;
z++;
}
prp.executeUpdate();
}catch (ClassNotFoundException a) {

a.printStackTrace();
} catch (SQLException b) {

b.printStackTrace();
}
}

ensuite la méthode qui permet d'insérer dans la base
private String inse(){
String query = new String("INSERT INTO banque ('date_cheque','date_releve','cheque','libelle','montant','inpitation') VALUES (?,?,?,?,?,?)");
return query;
}

public void actionPerformed(ActionEvent e) {

if(e.getSource() == ajout){
g.insert(inse(), info()) ;
}
}
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
14 oct. 2013 à 19:42
Normalement les Map doivent être typées, tu ne devrais donc pas pouvoir mettre tout et n'importe quoi dans ta Map... même si tu peux être très large dans le choix des types en mettant Object par exemple.

private HashMap<String,Object> info()
{
HashMap<String,Object> tab = new HashMap<String,Object>();

Date d=Date.valueOf(date_c.getText());

if (date_r.getText().isEmpty())
d1 = null;
else
d1=Date.valueOf(date_r.getText());

int num = Integer.parseInt(numero.getText());

float mon = Float.parseFloat(montant.getText());

int in = Integer.parseInt(inpitation.getText());

tab.put("date1", d) ;
tab.put("date2", d1);
tab.put("numero", num);
tab.put("libelle", libelle.getText());
tab.put("montant", mon);
tab.put("inpitation", in);

return tab;
}

Remarque : les noms de variables ne devraient pas contenir de caractères _

Iterator i = s.entrySet().iterator() ;
while(i.hasNext()){
Map.Entry entry = (Map.Entry) i.next();
if(entry.getKey().equals("montant"))
prp.setFloat(z,Float.parseFloat((String) entry.getValue())) ;

Alors là, je dis STOP !

Déjà tu pourrais utiliser une boucle for each, ce serait beaucoup plus clair que ta boucle while sur tes itérateurs :

for (Map.Entry entry : s.entrySet())
if((entry.getKey().equals("date1"))

Sauf que les maps ne servent pas à être itérées de la sorte, on dirait que tu fais de la manipulation de tableau, alors que ça n'a rien à voir.

Déjà parce que tu ne sais pas dans quel ordre tu vas récupérer les résultats dans ta map, du coup quand la clé sera "montant" tu fais
prp.setFloat(z,
sans avoir aucune idée de la valeur de z, or celle-ci doit être absolument 5 sinon tu vas mettre n'importe quoi dans ta requête SQL...

En plus parce que le temps d'accès aux données des maps est en O(1), donc itérer sur les maps va faire du O(n) totalement inutile...

Date date1 = (Date) s.get("date1");
Date date2 = (Date) s.get("date1");
int num = (int) s.get("numero");
String libelle = (String) s.get("libelle");
float montant = (float) s.get("montant");
int impitation = (int) s.get("impitation");

PreparedStatement prp = connexion.prepareStatement(query) ;

prp.setDate(1,date1);
prp.setDate(2,date2);
prp.setInt(3,num);
prp.setString(4,libelle);
prp.setFloat(5,montant);
prp.setInt(6,impitation);

C'est quand même nettement plus simple comme ça, non ?

Remarque : ça aussi c'est moche :

private String inse(){
String query = new String("INSERT INTO banque ('date_cheque','date_releve','cheque','libelle','montant','inpitation') VALUES (?,?,?,?,?,?)");
return query;
}

Si ta fonction ne fait aucun calcul et que son seul rôle est de renvoyer une constante, alors autant déclarer la constante directement !

private static final String INSE = "INSERT INTO banque ('date_cheque', 'date_releve', 'cheque', 'libelle', 'montant', 'inpitation') VALUES (?,?,?,?,?,?)";
0