hello,
pour pouvoir récupérer la clé générée automatiquement par mysql lors
d'un insert, j'utilisais jusqu'ici une méthode native de ConnectorJ :
String sql="INSERT INTO ...";
com.mysql.jdbc.Statement phrase =
(com.mysql.jdbc.Statement)base.createStatement();
phrase.executeUpdate(sql);
numvente=(int)phrase.getLastInsertID();
tout allait bien, jusqu'au jour où je décidais d'utiliser un
gestionnaire de pool de connexion, en lieu et place de mon singleton
habituel
problème : ce pool (SmartPool, pour ne pas le nommer), est
fourni avec son implémentation de Statement, ce qui lui permet
de rester complétement générique par rapport aux différents drivers
du coup, le pool n'utilise non pas l'interface java.sql.Statement, mais
une classe propriétaire qui implémente cette interface ; conséquence :
le code ci-dessus génère un ClassCastException, puisque
createStatement() me renvoie maintenant une classe qui n'est plus
déclinable en com.mysql.jdbc.Statement
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Emmanuel Puybaret
Salut,
pour pouvoir récupérer la clé générée automatiquement par mysql lors d'un insert, j'utilisais jusqu'ici une méthode native de ConnectorJ : String sql="INSERT INTO ..."; com.mysql.jdbc.Statement phrase > (com.mysql.jdbc.Statement)base.createStatement(); phrase.executeUpdate(sql); numvente=(int)phrase.getLastInsertID();
tout allait bien, jusqu'au jour où je décidais d'utiliser un gestionnaire de pool de connexion, en lieu et place de mon singleton habituel problème : ce pool (SmartPool, pour ne pas le nommer), est fourni avec son implémentation de Statement, ce qui lui permet de rester complétement générique par rapport aux différents drivers
du coup, le pool n'utilise non pas l'interface java.sql.Statement, mais une classe propriétaire qui implémente cette interface ; conséquence : le code ci-dessus génère un ClassCastException, puisque createStatement() me renvoie maintenant une classe qui n'est plus déclinable en com.mysql.jdbc.Statement
y a t'il un moyen de s'en sortir ?
C'est marrant en cherchant une info sur MySQL hier je suis tombé par hasard sur un sujet qui parlait de méthodes ajoutées dans le JDK 1.4 pour ça. Regarde les méthodes : public boolean execute (String sql, int autoGeneratedKeys) public ResultSet getGeneratedKeys ()
de la classe java.sql.Statement
ou la méthode : public PreparedStatement prepareStatement (String sql, int autoGeneratedKeys) de la classe java.sql.Connection
La méthode public boolean supportsGetGeneratedKeys () de java.sql.DatabaseMetaData te dira si ces nouvelles fonctionnalités sont supportées par le driver JDBC. Apparemment ces fonctionnalités ont bien été implémentées dans la dernière version du driver MySQL. Voir http://www.mysql.com/articles/autoincrement-with-connectorj.html pour plus d'infos
Je pense que ça devrait t'aller, non ?
Cordialement -- Emmanuel PUYBARET Email : Web : http://www.eteks.com Auteur du Cahier du programmeur Java [1] / Editions Eyrolles : http://www.eteks.com/services/cahierjava1.html
Salut,
pour pouvoir récupérer la clé générée automatiquement par mysql lors
d'un insert, j'utilisais jusqu'ici une méthode native de ConnectorJ :
String sql="INSERT INTO ...";
com.mysql.jdbc.Statement phrase > (com.mysql.jdbc.Statement)base.createStatement();
phrase.executeUpdate(sql);
numvente=(int)phrase.getLastInsertID();
tout allait bien, jusqu'au jour où je décidais d'utiliser un
gestionnaire de pool de connexion, en lieu et place de mon singleton
habituel
problème : ce pool (SmartPool, pour ne pas le nommer), est
fourni avec son implémentation de Statement, ce qui lui permet
de rester complétement générique par rapport aux différents drivers
du coup, le pool n'utilise non pas l'interface java.sql.Statement, mais
une classe propriétaire qui implémente cette interface ; conséquence :
le code ci-dessus génère un ClassCastException, puisque
createStatement() me renvoie maintenant une classe qui n'est plus
déclinable en com.mysql.jdbc.Statement
y a t'il un moyen de s'en sortir ?
C'est marrant en cherchant une info sur MySQL hier je suis tombé par hasard
sur un sujet qui parlait de méthodes ajoutées dans le JDK 1.4 pour ça.
Regarde les méthodes :
public boolean execute (String sql, int autoGeneratedKeys)
public ResultSet getGeneratedKeys ()
de la classe java.sql.Statement
ou la méthode :
public PreparedStatement prepareStatement (String sql,
int autoGeneratedKeys)
de la classe java.sql.Connection
La méthode public boolean supportsGetGeneratedKeys () de
java.sql.DatabaseMetaData te dira si ces nouvelles fonctionnalités sont
supportées par le driver JDBC. Apparemment ces fonctionnalités ont bien été
implémentées dans la dernière version du driver MySQL.
Voir http://www.mysql.com/articles/autoincrement-with-connectorj.html pour
plus d'infos
Je pense que ça devrait t'aller, non ?
Cordialement
--
Emmanuel PUYBARET
Email : puybaret@eteks.com
Web : http://www.eteks.com
Auteur du Cahier du programmeur Java [1] / Editions Eyrolles :
http://www.eteks.com/services/cahierjava1.html
pour pouvoir récupérer la clé générée automatiquement par mysql lors d'un insert, j'utilisais jusqu'ici une méthode native de ConnectorJ : String sql="INSERT INTO ..."; com.mysql.jdbc.Statement phrase > (com.mysql.jdbc.Statement)base.createStatement(); phrase.executeUpdate(sql); numvente=(int)phrase.getLastInsertID();
tout allait bien, jusqu'au jour où je décidais d'utiliser un gestionnaire de pool de connexion, en lieu et place de mon singleton habituel problème : ce pool (SmartPool, pour ne pas le nommer), est fourni avec son implémentation de Statement, ce qui lui permet de rester complétement générique par rapport aux différents drivers
du coup, le pool n'utilise non pas l'interface java.sql.Statement, mais une classe propriétaire qui implémente cette interface ; conséquence : le code ci-dessus génère un ClassCastException, puisque createStatement() me renvoie maintenant une classe qui n'est plus déclinable en com.mysql.jdbc.Statement
y a t'il un moyen de s'en sortir ?
C'est marrant en cherchant une info sur MySQL hier je suis tombé par hasard sur un sujet qui parlait de méthodes ajoutées dans le JDK 1.4 pour ça. Regarde les méthodes : public boolean execute (String sql, int autoGeneratedKeys) public ResultSet getGeneratedKeys ()
de la classe java.sql.Statement
ou la méthode : public PreparedStatement prepareStatement (String sql, int autoGeneratedKeys) de la classe java.sql.Connection
La méthode public boolean supportsGetGeneratedKeys () de java.sql.DatabaseMetaData te dira si ces nouvelles fonctionnalités sont supportées par le driver JDBC. Apparemment ces fonctionnalités ont bien été implémentées dans la dernière version du driver MySQL. Voir http://www.mysql.com/articles/autoincrement-with-connectorj.html pour plus d'infos
Je pense que ça devrait t'aller, non ?
Cordialement -- Emmanuel PUYBARET Email : Web : http://www.eteks.com Auteur du Cahier du programmeur Java [1] / Editions Eyrolles : http://www.eteks.com/services/cahierjava1.html
Joe
La méthode public boolean supportsGetGeneratedKeys () de java.sql.DatabaseMetaData te dira si ces nouvelles fonctionnalités sont supportées par le driver JDBC. Apparemment ces fonctionnalités ont bien été implémentées dans la dernière version du driver MySQL. Voir http://www.mysql.com/articles/autoincrement-with-connectorj.html pour plus d'infos
oui, ConnectorJ implémente ces fonctionnalités de JDBC 3.0 qui étaient
tres attendues
ca va permettre de simplifier les choses ; en attendant, il va falloir que je modifie ce gestionnaire de pool qui, lui, n'est pas compatible jdbc 3.0 : vive l'opensource ;-))
merci pour l'info en tout cas joe
La méthode public boolean supportsGetGeneratedKeys () de
java.sql.DatabaseMetaData te dira si ces nouvelles fonctionnalités sont
supportées par le driver JDBC. Apparemment ces fonctionnalités ont
bien été implémentées dans la dernière version du driver MySQL.
Voir http://www.mysql.com/articles/autoincrement-with-connectorj.html
pour plus d'infos
oui, ConnectorJ implémente ces fonctionnalités de JDBC 3.0 qui étaient
tres attendues
ca va permettre de simplifier les choses ; en attendant, il va falloir que
je modifie ce gestionnaire de pool qui, lui, n'est pas compatible jdbc 3.0
: vive l'opensource ;-))
La méthode public boolean supportsGetGeneratedKeys () de java.sql.DatabaseMetaData te dira si ces nouvelles fonctionnalités sont supportées par le driver JDBC. Apparemment ces fonctionnalités ont bien été implémentées dans la dernière version du driver MySQL. Voir http://www.mysql.com/articles/autoincrement-with-connectorj.html pour plus d'infos
oui, ConnectorJ implémente ces fonctionnalités de JDBC 3.0 qui étaient
tres attendues
ca va permettre de simplifier les choses ; en attendant, il va falloir que je modifie ce gestionnaire de pool qui, lui, n'est pas compatible jdbc 3.0 : vive l'opensource ;-))