Forum Clubic

Java+Mysql

Bonsoir tout le monde :slight_smile:

J’ai un soucis
j’ai cette methode suivante elle me permet (normalement) d’incrementer le id d’une colone (nomId en parametre) d’une table (en bd hein :stuck_out_tongue: )
Je vous explique le procédé :

Avec un PreparedStatement je get l’ancien int stoquée dans ma bd auquel je lui rajoute 1
Avec un autre PStmt je Update la table en lui donnant le nouvel int incrémenté de 1
Mais le truc c’est que ça marche pas il me renvois toujours la valeur auquel je l’ai initialisé ( là j’ai mis increment= null donc il me renvois null si j’aurais mis 3 il me renverrai toujours 3)
Je soupçonne que le JVM ne passe pas dans les blocs try
que faire???

Merci à tous d’avoir lu (et de m’aider) :wink:

voila le code


	private int incrId(String nomId) throws SQLException{
		StringBuffer sbInc = new StringBuffer();
		PreparedStatement stmt = null;
		PreparedStatement stmt2 = null;
		Integer increment=null ;

		sbInc.append("SELECT ");
		sbInc.append(nomId);
		sbInc.append(" FROM ");
		sbInc.append(TABLE_IDS);

		requete=sbInc.toString();
	
		try{
			
			stmt= connexion.prepareStatement(requete);
			
			ResultSet rs = stmt.executeQuery();
			while(rs.next()){
				increment= rs.getInt(nomId)+1;
				stmt.executeQuery();
			}
		}finally{
			stmt.close();
			sbInc.setLength(0);
		}
		
		sbInc.append("UPDATE ");
		sbInc.append(TABLE_IDS);
		sbInc.append(" SET ");
		sbInc.append(nomId);
		sbInc.append("=?");
		/*
		sbInc.append(" WHERE ");
		sbInc.append(nomId);
		sbInc.append("=?");
		*/
		requete=sbInc.toString();
		try{
			stmt2= connexion.prepareStatement(requete);
			stmt2.setInt(1, increment);
			//stmt2.setInt(2, increment--);
			stmt2.executeUpdate();
		}finally{
			stmt2.close();
			sb.setLength(0);
		}
		System.out.println(increment);
		return increment;
	}

Bon, j’ai juste survolé car je déteste passer mes soirées à lire du code spaghetti mai si tu te relis, tu verra que le seul moment où une valeur est affectée à increment est dans le bloc


while(rs.next()){
    increment= rs.getInt(nomId)+1;
    stmt.executeQuery();
}

Et si ta requête renvoyait 0 lignes ???

PS Pourquoi tu fait réexécuter la querry à chaque fois ???

Jsuis désolé mais je me refuse de répondre à ce genre de question dans laquelle :

  • on passe vaguement pour un débuggueur ambulant
  • le code est mal écrit
  • et j’ai pas l’impression que l’auteur du message s’est cassé le cul pour tenter de sortir de sa situation

Donc dans un premier temps, dans le genre mieux reculer pour sauter, pourquoi ne pas :

  • renommer tes variables pour qu’elles soient plus parlantes
  • supprime le code en commentaire qui sert à rien
  • retire ces usages intempestifs de stringbuffer ! introduis une constante qui prend toute ta requete et pis basta.

Ca sera déjà bien plus clair, et si tu fais cet effort, je pense que d’autre pourront en faire autant pour t’aider.

Merci Martopioche pour ta réponse
Mais j’ai trouver la solution en faite elle viens pas de la >_< (donc le code est bon) en faite j’avais mis un insert ou il fallait pas et donc il m’incrementait toujours la dernière ligne enfin bref

+Sion vitamin merci aussi pour ta réponse mais si tu veux pas passer pour un “dubugger ambulant” ben tu pollues pas le topic ( parce que la tu passes plutôt pour un pollueur ambulant) :wink:

+Tu dois être un dieu du java pour dire que mon code est mal écrit (moi j’en suis content et il marche c’est l’essentiel :stuck_out_tongue: )

  • j’ai passer des heures à essayer de debugger mais le code est bon l’erreur était ailleurs en faite :stuck_out_tongue: désolé pour le topic inutile

  • Pour les StringBuffer vu que tu es un dieu tu devrais savoir que c’est plus efficace de faire une StringBuffer que de faire des “String” + “String” au niveau performances (mon projet est bourré de SQL request j’essaie d’optimiser ) je ne peux pas mettre dans une seule constante puisque ça dépend du nom des tables que l’utilisateur aura défini lui même ( parce que sinon j’aurais des “String”+“String” etc…)

Donc voila Vitamin j’ai fait un effort pour te répondre en tout cas merci pout tes remaques aussi

a++++
Edité le 28/03/2009 à 23:20

Ben en fait, je vais répondre car je suis repassé par ce topic et le fait est que je suis assez d’accord avec vitamin…

Bon, ben moi je suis un Dieu du Java (en fait un Dieu tout court mais là n’est pas la question) et oui ton code est mal écrit. Si pour toi l’essentiel est qu’il marche un coup et que c’est du jetable, débrouille toi tout seul et ne vient pas poser les questions sur des forums. Si tu doit faire intervenir d’autres personnes, il doit être lisible et structuré. Sur un forum, on est gêné par le code en commentaire puisqu’il n’y a pas de coloration syntaxique. On est gêné par des construction ou des sémantiques hétéroclites (“toto=machin” puis “titi = truc”). On ne peut pas deviner d’où viennent tes valeurs magiques (comme TABLE_IDS).

Et ça énerve de voir un try sans catch !!!

Il n’y a pas que le débugger dans la vie. Intéresse toi à la notion de test unitaires. Ils t’auraient démontré que ton code “est bon”. Et mieux écrit, cela aurai sauté aux yeux tout de suite.

Et tu a besoin d’une méthode synchronisée par rapport aux stringbuilder ?

Je pense que vitamin connaît la différence et le coût de la concaténation de strings en Java. Le problèe, c’est que construire ses requêtes de la sorte les rend illisible, indébugguable et inmaintenables. Surtout si tu dis que tu en a “plein”. Ce qu’il voulait dire par des constantes, c’est que tes requêtes doivent être figées. Et je suis également pour limiter la modularité des requêtes car en dehors des problèmes que j’ai listé, c’est une porte ouverte aux attaques par injection SQL. Si tu ne peux t’en passer, tu doit avoir un service dédié à la construction voir implémenter un service de persistance (voir tahe.developpez.com… ). Moi, j’ai bien peur que tu ai une construction cahotique avec ta base mais bon, c’est toi qui vois.

C’est qu’on me prendrait presque pour un ane :smiley:

Non mais sans blague, quand tu présentes un plat pour ta copine, t’essaie pas de faire un effort pour pas lui présenter du caca ? Si ? Ben là c’est pareil.

En l’occurence, on pointe du doigt la forme de ton code. C’est la base pour apprendre à bosser en équipe … genre avec ton binome au moins.

Et loin de moi l’idée de te dire que c’est nul à chier et que jsuis trop balèze. C’est évidemment pas ce qui me motive à poster ici …