OVH Cloud OVH Cloud

JDBC clef primaire

11 réponses
Avatar
Julien Arlandis
J'aimerais récupérer le numéro_auto de la clef primaire généré après un
enregistrement.
J'utilise une base de données Mysql, j'ai essayé les méthodes
getGeneratedKeys(), mais sans succés.

10 réponses

1 2
Avatar
Libert Sébastien
"Julien Arlandis" a écrit dans le message de news:
401c6f94$0$25440$
J'aimerais récupérer le numéro_auto de la clef primaire généré après un
enregistrement.
J'utilise une base de données Mysql, j'ai essayé les méthodes
getGeneratedKeys(), mais sans succés.


Salut !

Tu donnes fort peu d'infos pour qu'on puisse t'aider à trouver ton problème
;-)

En premier lieu, vérifie que tu utilises la dernière version du driver JDBC
(Connector/J) sur le site www.mysql.com.
Si cela ne fonctionne toujours pas, vérifie si une erreur est générée, sinon
quel est le résultat que tu obtiens avec getGeneratedKeys().



HTH
Sébastien Libert.

Avatar
Julien Arlandis
J'aimerais récupérer le numéro_auto de la clef primaire généré après un
enregistrement.
J'utilise une base de données Mysql, j'ai essayé les méthodes
getGeneratedKeys(), mais sans succés.



Salut !

Tu donnes fort peu d'infos pour qu'on puisse t'aider à trouver ton problème
;-)

En premier lieu, vérifie que tu utilises la dernière version du driver JDBC
(Connector/J) sur le site www.mysql.com.
Si cela ne fonctionne toujours pas, vérifie si une erreur est générée, sinon
quel est le résultat que tu obtiens avec getGeneratedKeys().


J'utilise bien le dernier Connector/J version 3.0.10, voici mon code :

import java.sql.*;

[...]

Connection conn;
Statement req;

Class.forName("com.mysql.jdbc.Driver").newInstance();
String
url="jdbc:mysql://localhost:3306/mabase?user=xxx&password=xxx&autoReconnect=true";
conn = DriverManager.getConnection(url);
req = conn.createStatement();
req.executeUpdate("INSERT INTO mytable(champ1) VALUES ('xxx');" );
System.out.println("clef : " + req.getGeneratedKeys());


req.getGeneratedKeys() renvoie ""
J'ai également essayé les constantes RETURN_GENERATED_KEYS et
NO_GENERATED_KEYS mais elles me renvoient toujours le même chiffre 1 ou 2.


Avatar
Adobex
public ResultSet getGeneratedKeys()

Ca c'est la définition de la méthode, donc comme on peut le constater elle
renvoie un ResultSet, ce qui signifie qu'il faut traiter le résultat de la
méthode comme tel.
C'est un début de piste, je n'ai jamais utilisé cela donc à toi de faire le
nécessaire pour trouver la suite ;)

Adobex

"Julien Arlandis" a écrit dans le message de
news:401d9a29$0$11332$
J'aimerais récupérer le numéro_auto de la clef primaire généré après un
enregistrement.
J'utilise une base de données Mysql, j'ai essayé les méthodes
getGeneratedKeys(), mais sans succés.



Salut !

Tu donnes fort peu d'infos pour qu'on puisse t'aider à trouver ton
problème


;-)

En premier lieu, vérifie que tu utilises la dernière version du driver
JDBC


(Connector/J) sur le site www.mysql.com.
Si cela ne fonctionne toujours pas, vérifie si une erreur est générée,
sinon


quel est le résultat que tu obtiens avec getGeneratedKeys().


J'utilise bien le dernier Connector/J version 3.0.10, voici mon code :

import java.sql.*;

[...]

Connection conn;
Statement req;

Class.forName("com.mysql.jdbc.Driver").newInstance();
String

url="jdbc:mysql://localhost:3306/mabase?user=xxx&password=xxx&autoReconnect true";

conn = DriverManager.getConnection(url);
req = conn.createStatement();
req.executeUpdate("INSERT INTO mytable(champ1) VALUES ('xxx');" );
System.out.println("clef : " + req.getGeneratedKeys());


req.getGeneratedKeys() renvoie ""
J'ai également essayé les constantes RETURN_GENERATED_KEYS et
NO_GENERATED_KEYS mais elles me renvoient toujours le même chiffre 1 ou 2.




Avatar
Julien Arlandis
public ResultSet getGeneratedKeys()

Ca c'est la définition de la méthode, donc comme on peut le constater elle
renvoie un ResultSet, ce qui signifie qu'il faut traiter le résultat de la
méthode comme tel.
C'est un début de piste, je n'ai jamais utilisé cela donc à toi de faire le
nécessaire pour trouver la suite ;)

Adobex


Et comment je fais pour connaitre la clef primaire dans l'objet
Resultset? J'en ai essayé la moitié ça ne marche pas.
J'ai pourtant besoin de récupérer la clef primaire pour terminer mon
programme...

Avatar
JScoobyCed
"Julien Arlandis" :
J'utilise bien le dernier Connector/J version 3.0.10, voici mon code :

import java.sql.*;

[...]

Connection conn;
Statement req;

Class.forName("com.mysql.jdbc.Driver").newInstance();
String

url="jdbc:mysql://localhost:3306/mabase?user=xxx&password=xxx&autoReconnect true";

conn = DriverManager.getConnection(url);
req = conn.createStatement();
req.executeUpdate("INSERT INTO mytable(champ1) VALUES ('xxx');" );
System.out.println("clef : " + req.getGeneratedKeys());



Le ResultSet qui t'est donne doit etre utilise comme un resultat de requete
DB. Soit Si ta clef primaire (generee grace a auto_increment ou une valeure
par defaut) est nommee 'id':
ResultSet rs=req.getGeneratedKeys();
int id_genere=rs.getInt('id');
De meme pour tous les champs generes:
String ma_valeur_par_defaut=rs.getString('nom'); // si un champ 'nom' existe
dans la table

Maintenant j'ai pas teste ce code comme ca, il faut verifier les Exception
levee et tout le tralala. Mais en cherchant un peu (aide toi de la
documentation API de Java et regarde l'Objet java.sql.ResultSet )

JScoobyCed
--------------

Avatar
Adobex
En fait, c'est tout bête mais pas forcément facile à trouver...

This is the solution :

ResultSet rs = null;
req.executeUpdate("INSERT INTO mytable(champ1) VALUES ('xxx');" );
rs = req.getGeneratedKeys();
rs.next();
System.out.println("ID de l'enregistrement inséré : " + rs.getInt(1));

Donc, si t'as compris, on passe par la position de la colonne censée
renvoyer la valeur mais peut-être qu'on peut faire mieux en spécifiant un
nom de colonne... à voir.


"Julien Arlandis" a écrit dans le message de
news:401e6513$0$11224$
public ResultSet getGeneratedKeys()

Ca c'est la définition de la méthode, donc comme on peut le constater
elle


renvoie un ResultSet, ce qui signifie qu'il faut traiter le résultat de
la


méthode comme tel.
C'est un début de piste, je n'ai jamais utilisé cela donc à toi de faire
le


nécessaire pour trouver la suite ;)

Adobex


Et comment je fais pour connaitre la clef primaire dans l'objet
Resultset? J'en ai essayé la moitié ça ne marche pas.
J'ai pourtant besoin de récupérer la clef primaire pour terminer mon
programme...



Avatar
Julien Arlandis
J'utilise bien le dernier Connector/J version 3.0.10, voici mon code :

import java.sql.*;

[...]

Connection conn;
Statement req;

Class.forName("com.mysql.jdbc.Driver").newInstance();
String



url="jdbc:mysql://localhost:3306/mabase?user=xxx&password=xxx&autoReconnect > true";

conn = DriverManager.getConnection(url);
req = conn.createStatement();
req.executeUpdate("INSERT INTO mytable(champ1) VALUES ('xxx');" );
System.out.println("clef : " + req.getGeneratedKeys());




Le ResultSet qui t'est donne doit etre utilise comme un resultat de requete
DB. Soit Si ta clef primaire (generee grace a auto_increment ou une valeure
par defaut) est nommee 'id':
ResultSet rs=req.getGeneratedKeys();
int id_genere=rs.getInt('id');
De meme pour tous les champs generes:
String ma_valeur_par_defaut=rs.getString('nom'); // si un champ 'nom' existe
dans la table



J'ai déjà essayé mais il ne trouve pas la clef primaire,
(==>java.sql.SQLException: Column 'id' not found.) pas plus que
n'importe quelle autre colonne présente dans la table.
En fait c'est compréhensible, je fais une requête d'insertion pourquoi
l'objet ResultSet devrait se comporter comme après un SELECT?

Ensuite j'ai analysé les paquets reçus de Mysql en réponse à un INSERT,
voici la réponse en hexa (7 octets) :
03 00 00 01 00 01 19
Le dernier octet, ici 0x19 correspond bien au numéro de la clef auto
générée par Mysql (25 dans cet exemple).
Maintenant reste à savoir comment procède la méthode getGeneratedKeys()
pour capturer ce nombre.


Maintenant j'ai pas teste ce code comme ca, il faut verifier les Exception
levee et tout le tralala. Mais en cherchant un peu (aide toi de la
documentation API de Java et regarde l'Objet java.sql.ResultSet )

JScoobyCed
--------------



Avatar
Julien Arlandis

En fait, c'est tout bête mais pas forcément facile à trouver...

This is the solution :

ResultSet rs = null;
req.executeUpdate("INSERT INTO mytable(champ1) VALUES ('xxx');" );
rs = req.getGeneratedKeys();
rs.next();
System.out.println("ID de l'enregistrement inséré : " + rs.getInt(1));

Donc, si t'as compris, on passe par la position de la colonne censée
renvoyer la valeur mais peut-être qu'on peut faire mieux en spécifiant un
nom de colonne... à voir.


Ouf super!!!! Merci, ça marche ;-)
J'avais pas pensé au coup du rs.next() mais en fait c'est la même
logique que pour une requête SELECT ... encore merci.

Avatar
Adobex
Bon je pense que tu auras vu ma réponse (qui fonctionne) dans l'autre
branche de ce thread mais je réponds ici à ta question concernant le
ResultSet retourné. Ben en fait, c'est comme ça que c'est géré, c'est tout.
Donc, effectivement tu traite le retour de la méthode comme si tu avais fait
un SELECT. Un ResultSet est un objet comme un autre, si une méthode te dit
qu'elle renvoie ça, hé bien tu fais avec ;).

Au passage, dans le même ordre d'idée, si tu te demandes comment faire pour
obtenir le résultat d'une requête du style "SELECT COUNT(*) FROM matable"
(puisqu'on ne spécifie pas de nom de colonne), la réponse est que la valeur
est récupérée avec un rs.getInt(1) après un rs.next()

Ca t'éclaire? :)

Adobex


"Julien Arlandis" a écrit dans le message de
news:401e707c$0$11240$
J'utilise bien le dernier Connector/J version 3.0.10, voici mon code :

import java.sql.*;

[...]

Connection conn;
Statement req;

Class.forName("com.mysql.jdbc.Driver").newInstance();
String




url="jdbc:mysql://localhost:3306/mabase?user=xxx&password=xxx&autoReconnect > > true";



conn = DriverManager.getConnection(url);
req = conn.createStatement();
req.executeUpdate("INSERT INTO mytable(champ1) VALUES ('xxx');" );
System.out.println("clef : " + req.getGeneratedKeys());




Le ResultSet qui t'est donne doit etre utilise comme un resultat de
requete


DB. Soit Si ta clef primaire (generee grace a auto_increment ou une
valeure


par defaut) est nommee 'id':
ResultSet rs=req.getGeneratedKeys();
int id_genere=rs.getInt('id');
De meme pour tous les champs generes:
String ma_valeur_par_defaut=rs.getString('nom'); // si un champ 'nom'
existe


dans la table



J'ai déjà essayé mais il ne trouve pas la clef primaire,
(==>java.sql.SQLException: Column 'id' not found.) pas plus que
n'importe quelle autre colonne présente dans la table.
En fait c'est compréhensible, je fais une requête d'insertion pourquoi
l'objet ResultSet devrait se comporter comme après un SELECT?

Ensuite j'ai analysé les paquets reçus de Mysql en réponse à un INSERT,
voici la réponse en hexa (7 octets) :
03 00 00 01 00 01 19
Le dernier octet, ici 0x19 correspond bien au numéro de la clef auto
générée par Mysql (25 dans cet exemple).
Maintenant reste à savoir comment procède la méthode getGeneratedKeys()
pour capturer ce nombre.


Maintenant j'ai pas teste ce code comme ca, il faut verifier les
Exception


levee et tout le tralala. Mais en cherchant un peu (aide toi de la
documentation API de Java et regarde l'Objet java.sql.ResultSet )

JScoobyCed
--------------






Avatar
Julien Arlandis
Bon je pense que tu auras vu ma réponse (qui fonctionne) dans l'autre
branche de ce thread mais je réponds ici à ta question concernant le
ResultSet retourné. Ben en fait, c'est comme ça que c'est géré, c'est tout.
Donc, effectivement tu traite le retour de la méthode comme si tu avais fait
un SELECT. Un ResultSet est un objet comme un autre, si une méthode te dit
qu'elle renvoie ça, hé bien tu fais avec ;).

Au passage, dans le même ordre d'idée, si tu te demandes comment faire pour
obtenir le résultat d'une requête du style "SELECT COUNT(*) FROM matable"
(puisqu'on ne spécifie pas de nom de colonne), la réponse est que la valeur
est récupérée avec un rs.getInt(1) après un rs.next()

Ca t'éclaire? :)


Oui, en fait ce qui m'a dérouté c'est l'histoire du rs.next(),
quand j'utilisais des recordsets en ASP je crois me souvenir qu'il se
plaçait directement sur la première ligne de la requête.
Par contre il fallait vérifier qu'on n'était pas à la fin du recordset
avant d'appeller rs.Getbidule.

Adobex


1 2