[SQL][Java][MySQL] Generated_Keys qui bronchent

Hello B)

Bon, encore ma base de données qui me crache à la figure!
J’ai une table articles qui ressemble a ca (cf piece jointe).

lorsque que j’envoie la requete suivante

INSERT INTO `PAX_Articles` ( `authorId` , `publisherId` , `date` , `content` , `title` , `subtitle` , `intro` , `lastUpdated`) VALUES ( '0', '0', '2007-02-21 14:57:19.64', 'blabalblalbalbla', 'tiiitre!', 'soustitre qui claque', ' ca va parler de blabalba',NOW());

avec le code suivant :

String sql ="INSERT INTO `PAX_Articles` ( `authorId` , `publisherId` , `date` , `content` , `title` , `subtitle` , `intro` , `lastUpdated`) VALUES ( '0', '0', '2007-02-21 14:57:19.64', 'blabalblalbalbla', 'tiiitre!', 'soustitre qui claque', ' ca va parler de blabalba',NOW());"; Statement stmt; ExtendedDatabase db; try { db = new ExtendedDatabase(); stmt = db.dbConnection.dbConn.createStatement(); ResultSet generatedKeys; stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS); generatedKeys = stmt.getGeneratedKeys(); generatedKeys.first(); int generatedId = generatedKeys.getInt("id");

Le stackTrace m’envoie l’erreur suivante :java.sql.SQLException: Column 'id' not found.
qui est générée par la derniere ligne de mon code.
Hors, je pige pas : id est en auto_increment, donc y’a pas de raisons que la base le génère pas!

(si ca peut aider, la table est sous le moteur InnoDB)

Lorsque je vérifie le contenu apres l’execution de ce code, l’insertion a bien été faite, et il y a une valeur correcte dans la colonne id. Comment se fait il que je ne puisse pas la récuperer ?

Ta nouvelle entrée que tu viens de faire a bien un ID ou pas ? Ca porte un poil à confusion ta dernière phrase là. Sinon, essais de passer par la méthode getInt(int columnIndex) voir si ca passe.

oui, elle a bien un nouvel id. Je vais essayer avec le column index…

EDIT: en utilisant generatedKeys.getInt(1), ca fonctionne parfaitement. Mais c’est génant, je ne suis jamais certain d’obtenir la valeur de la colonne id. Comment se fait il que la valeur existe dans le resultset mais que le nom de la colonne soit erroné?

[code]getGeneratedKeys
public ResultSet getGeneratedKeys()
throws SQLExceptionRetrieves any auto-generated keys created as a result of executing this Statement object. If this Statement object did not generate any keys, an empty ResultSet object is returned.

Returns:
a ResultSet object containing the auto-generated key(s) generated by the execution of this Statement object
Throws:
SQLException - if a database access error occurs
Since:
1.4[/code]

Question donc, est-ce que tu ne recupere pas un ResultSet empty.

CF au dessus, non, il est pas vide (apres verification, non, le ResultSet est pas vide).
Donc, la clé a bien été générée, et apres vérification generatedKeys.getInt(1) me renvoie la bonne valeur. Mais je ne suis absolument pas sur que generatedKeys.getInt(1)me renverra la valeur de la colonne « id » si ma table change de structure, et ca, ca pose probleme.

EDIT:
J’ai modifié le code pour connaitre un peu plus de détails.
J’ai cherché du coté des ResultSetMetaData, et j’execute le code suivant :
db = new ExtendedDatabase(); stmt = db.dbConnection.dbConn.createStatement(); ResultSet generatedKeys; stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS); generatedKeys = stmt.getGeneratedKeys(); if (!generatedKeys.first()) System.out.println("empty!"); int generatedId = generatedKeys.getInt(1); System.out.println("id="+generatedId); ResultSetMetaData rsmd = generatedKeys.getMetaData(); System.out.println("col "+rsmd.getColumnCount()+" : "+rsmd.getColumnName(1));

et j’obtiens :

col 1 : null

Il n’y a qu’une colonne, et le nom est… a null.
:confused: Il y aune facon de remédier à ca?

Essais ca :

System.out.println("col “+rsmd.getColumnCount()+” : "+rsmd.getColumnName(0));

j’avais essayé, j’obtiens une erreur out of range (enfin, c’est pas exactement le nom, mais ca me dit que la colonne 0 existe pas.

Solution (éventuellement) temoraire : utiliser LAST_INSERT_ID() de MySql ?

Attention à la concurrence !

justement, je préfere mettre le getInt(1) que le last_insert_id(). Je vais attendre une réponse sur le forum officiel… Mais merci pr votre aide B)