1 pièce(s) jointe(s)
Comportement particulier de requêtes SQL sur SQL Server depuis une application mobile Java
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 ! :ptdr:)
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 ! :weird::calim2:
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 :
Code:
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();
}
} |
Execution des requêtes :
Code:
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:
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
Pièce jointe 617778
À ceux qui sont encore là, merci pour votre lecture et votre temps accordé !
Phae