Est-il un moyen de récupérer l'auto-incrémentation d'identité à partir d'une requête préparée
Est-il un moyen de récupérer l'auto clé générée à partir d'une base de requête lors de l'utilisation de java requête avec les requêtes préparées.
Par exemple, je sais AutoGeneratedKeys pouvez travailler de la façon suivante.
stmt = conn.createStatement();
stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
auto_id = rs.getInt(1);
}
Cependant. Que faire si je veux faire un insert avec une Déclaration préparée.
String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql);
//this is an error
stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
//this is an error since the above is an error
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
auto_id = rs.getInt(1);
}
Est-il un moyen de faire ce que je ne sais pas. Il semble d'après la javadoc qui PreparedStatements ne peut pas retourner la génération Automatique d'ID.
- returnLastInsertId où en êtes-vous de cette variable
Vous devez vous connecter pour publier un commentaire.
Oui. Voir ici. L'article 7.1.9. Modifiez votre code pour:
rs.close()
? Est-il nécessaire ?Il ya un couple de façons, et il semble que les différents pilotes jdbc gère des choses un peu différentes, ou pas du tout dans certains cas(certains ne fera que vous donner générée automatiquement les clés primaires, pas les autres colonnes), mais les formes de base sont
Ou utiliser ce formulaire:
Oui, Il y a un moyen. Je viens de trouver cette cachette dans la java doc.
Elles consiste à transmettre les AutoGeneratedKeys id comme suit
Je suis un de ceux qui a navigué à travers quelques fils à la recherche de la solution de ce problème ... et enfin le faire fonctionner. POUR CEUX à l'AIDE de jdbc:oracle:mince: avec ojdbc6.jar VEUILLEZ PRENDRE NOTE:
Vous pouvez utiliser deux méthodes:
(Méthode 1)
(Méthode 2)
En gros, essayez de ne pas utilisées Method1 si vous voulez juste la valeur de la SEQ.Nextval, b'cse il suffit de renvoyer la RowID ref que vous pouvez craqué votre tête de trouver son chemin pour s'en servir, ce qui ne fit tous type de données que vous essayé de moulage! Cela peut fonctionne très bien (rendement réel val) dans MySQL, DB2, mais pas dans Oracle.
ET, éteignez votre SQL Developer, Crapaud ou un client qui utilise le même session de connexion à INSÉRER lorsque vous déboguez. Il ne PEUT pas vous affecter à chaque fois (débogage d'appel) ... jusqu'à ce que vous trouver vos applications de gel, sans exception, pour un certain temps. Oui ... s'arrête sans exception!
executeUpdate()
ne renvoie pas unResultSet
, il renvoie unint
, qui est le nombre de mise à jour. Vous devez récupérer les clés générées séparément. Voir les réponses existantes, et la Javadoc pour l'amour du ciel. -1. Again. s'il vous Plaît arrêter de poster votre non testé conjecture ici.