Bonjour à tous,
Ceci est mon premier message sur le forum, je suis ravis de faire partie de cette communauté.(Enfin, de bientôt en faire partie j'imagine).
Je viens tout droit de St@ck0v3fl0w, j'en ai marre de me faire pourrir de vote down sur mes postes par des gens complètement random qui n'expliquent même pas le pourquoi de leur action.
Bref, revenons en au fait !
Je suis actuellement en train de développer une appli mobile Java, sur Android Studio, et je rencontre un problème de l'ordre un peu plus global que le dev. mobile : d'où mon poste dans ce sous forum.
Mon application est connectée à l'aide de JTDS & jdbc à une base de données MS SQL Server.(On partira du principe que la connexion en direct à la DB, c'est OK ! )
J'arrive parfaitement à me connecter à la DB, à réaliser des executeQuery() afin de lire des données via des requêtes "SELECT".
Cependant, lorsque j'essaie d'écrire dans ma bdd, soit à l'aide de "INSERT INTO" soit à l'aide de "UPDATE"; il... ne se passe rien. J'ai géré dans mon code toutes les exceptions pouvant se passer en inscrivant des espèces de check point dans mes Log à l'aide de Log.e(String, String), qui atteste du bon déroulement de ma requête... et rien : mes fonctions s'effectuent sans problème(Sans problème, car par exemple quand j'écris INSERT INTO table2 alors que celle ci n'existe pas, j'ai bien une SQLException ! alors que INSERT INTO table1 avec table1 existante, mes logs m'attestent que c'est ok, et preparedstatement.executeUpdate() retourne 1, ce qui sous-entendrait que 1 ligne a bien été affectée... Je deviens fou !)
Le plus bizarre dans tout ça, c'est que lors d'un INSERT INTO dans une table s'auto-incrémentant, aucune nouvelle ligne n'est crée MAIS l'indice d'auto-incrementation augmente. Si au bout de 30 essais de requêtes j'essaie d'écrire une ligne à la main, alors son ID unique auto-incrémenté sera 31... Je deviens fou !
Vous trouverez ci-dessous les fonctions concernées.
J'ai bien sûr caché la connexion SQL, mais partez du principe qu'elle est OK : j'arrive bien à effectuer des requêtes SELECT.
Gestion de la connexion :
Execution des requêtes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public static boolean setUpConnexion(String DBNAME) { StrictMode.ThreadPolicy policy; policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); VARIABLES DE CONNEXION SQL try { ETABLISSEMENT DE LA CONNEXION SQL A L'AIDE DE JTBS } return true; } catch (Exception e) { System.out.println("SQL ERROR: " + e.getMessage()); e.printStackTrace(); return false; } } public synchronized static void closeCons() { try { if (exportCon != null) { exportCon.close(); } mainCon.close(); } catch (Exception e) { System.out.println("Erreur a la fermeture des connexions SQL:" + e.getMessage()); e.printStackTrace(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 public static String LOAD_PREVIOUS_H_LOT_NUMBER(String machineNumber) { String s = ""; try { setUpConnexion("mainDB"); ResultSet RS = executeQuery("SELECT h_lot_number FROM valve_assembly_h WHERE machine_number = '" + machineNumber + "' AND statut = 'Actif'", "mainDB"); while (RS.next()) { s = RS.getString(1); Log.d("Success : ", "Lot number : " + s); } closeResultSet(RS); } catch (Exception e) { error = e.getMessage(); Log.e("Error :", error); s = error; } closeCons(); return s; } public static boolean UPDATE_PREVIOUS_H_LOT_STATUT(String h_lot_number_old) { try { setUpConnexion("mainDB"); String baseQuery = "UPDATE valve_assembly_h SET statut = 'Expiré' WHERE h_lot_number = '" + h_lot_number_old + "'"; //PreparedStatement p = newTransact("UPDATE valve_assembly_h SET statut = 'Expiré' WHERE h_lot_number = '" + h_lot_number_old + "'", "mainDB"); PreparedStatement toReturn = (PreparedStatement) mainCon.prepareStatement(baseQuery); int count = toReturn.executeUpdate(); if (count > 0) { Log.d("Sucess : ", "Previous h_lot updated."); closeCons(); return true; } else { Log.e("Error : ", "No lot found with this number."); closeCons(); return false; } } catch (SQLException e) { error = e.getMessage(); Log.e("Error :", error); closeCons(); return false; } }
Et enfin, la plus mastock de tous, la fonction d'INSERT :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 public static boolean ADD_VALVE_ASSEMBLY_RESTOCK(String machineNumber, int iRestockPartType, String restockPartNumber, int iDirectPass, int iShift) { String h_lot_number_old = ""; String sDirectPass = String.valueOf(iDirectPass); String sShift = String.valueOf(iShift); if (setUpConnexion("mainDB")) { try { h_lot_number_old = LOAD_PREVIOUS_H_LOT_NUMBER(machineNumber); PreparedStatement p = newTransact("INSERT INTO valve_assembly_h (\"machine_number\"," + " \"h_lot_number\", \"h_lot_number_old\", \"direct_pass\", \"shift\") VALUES ('" + machineNumber + "', '" + restockPartNumber + "', '" + h_lot_number_old + "', '" + sDirectPass + "', '" + sShift + "')", "mainDB"); int count = p.executeUpdate(); if (count > 0) { Log.d("Success : ", count + " line(s) created. "); } else { Log.e("Error : ", "Unexpected result"); } UPDATE_PREVIOUS_H_LOT_STATUT(h_lot_number_old); closeCons(); return true; } catch (SQLException e) { error = e.getMessage(); Log.e("Error :", error); return false; } } else { Log.e("Error", "Impossible to set up the database connection."); // NE DEVRAIT return false; // PAS ARRIVER SAUF SI LE WIFI TOMBE } }
Edit : en complément, voici un petit screen d'une session "Debug" avec les variables debug
À ceux qui sont encore là, merci pour votre lecture et votre temps accordé !
Phae
Partager