instruction de mise à jour en Java
J'ai le code suivant pour mettre à jour un enregistrement. Le code se compile cependant, il ignore tout de l'instruction try et affiche le message d'erreur dans l'instruction catch. Je ne suis pas sûr de ce que je suis absent, il n'affiche pas toute sorte d'erreur de syntaxe.
try {
PreparedStatement st = db.con.prepareStatement("UPDATE item SET Name = ?, Size = ?, Price = ?, WHERE ItemCode = ?");
st.setString(1, textArea_Code.getText());
st.setString(2, textArea_name.getText());
st.setString(3, textArea_size.getText());
st.setString(4, textArea_price.getText());
st.executeUpdate();
JOptionPane.showMessageDialog(frame, "Updated");
} catch (SQLException e ) {
JOptionPane.showMessageDialog(frame, "update not successful");
}
OriginalL'auteur FatmaTurk | 2012-03-09
Vous devez vous connecter pour publier un commentaire.
Vous êtes à avaler l'exception, qui est généralement une mauvaise idée. À tout le moins appel
e.printStackTrace()
de sorte que vous avez une sortie de l'exception.Comme il arrive, vous avez une erreur de syntaxe dans votre instruction SQL:
UPDATE item SET Name = ?, Size = ?, Price = ?, WHERE ItemCode = ?
- supprimer la virgule aprèsPrice = ?
.À l'adresse de la confusion sur les raisons de l'instruction de mise à JOUR ne fonctionne toujours pas, en dépit de la fixation de l'erreur de syntaxe, permettez-moi de vous expliquer plus en détail (beaucoup plus facile pour ce faire, dans la réponse, plutôt que dans les commentaires).
La
?
de caractère dans votre Chaîne SQL est un espace réservé pour une valeur que vous définissez à l'un des différentsset_()
méthodes (dans votre cas, ne jamaissetString()
. Chaque espace réservé est un numéro d'index à partir de 1 - la première?
qui apparaît dans votre chaîne de caractères représente l'indice 1, le deuxième représente l'indice 2, etc.Votre chaîne SQL ressemble à ceci:
Vous êtes à la définition des valeurs de vos espaces comme ceci:
Vous disposez de quatre espaces réservés dans votre chaîne SQL, numérotés de 1 à 4. 1 est la valeur de
Name
, 2 est la valeur deSize
, 3 est la valeur dePrice
et 4 est la valeur deItemCode
. Maintenant, regardez les valeurs que vous êtes de passage dans votrest.setString()
appels.Vous pouvez obtenir le nombre réel de lignes mises à jour comme ceci
int updated=st.executeUpdate();
Vérifier que le comte et voir si quelque chose est réellement mis à jour. Si elle renvoie >0, puis vérifier la base de données que vous utilisez, si la validation automatique est activée ou pas.executeUpdate retourne un int. Vous devez vérifier que la valeur de déterminer si quelque chose a été mis à jour. Si vous voyez un zéro, je voudrais vérifier la base de données.
si le problème était avec la base de données puis je suppose qu'il ne serait pas me permettre de supprimer un enregistrement de la base de données ainsi droit?
OriginalL'auteur Anthony Grist
Avez-vous essayé de changer que l'instruction de mise à JOUR à quelque chose comme ceci:
J'ai pris la dernière
,
(virgule) après laPrice = ?
car il peut entrer en conflit avec le reste du SQL.Edit:
Aussi, vous pouvez réorganiser les
textArea_Code.getText()
ligne à la dernière valeur de l'instruction préparée. Sinon, le ItemCode valeur ne peut être mise en correspondance avec l'ordre de la?
des espaces réservés (comme le moment, ça ressemble àtextArea_price.getText()
est de s'habituer, comme la valeur deItemCode
... qui pourrait être dangereux pour ce qui est mis à jour!)Au lieu de cela, que penser de quelque chose comme ceci:
De cette façon, tous les
?
espaces réservés correspondre correctement avec les valeurs définies:C'est parce que les paramètres doivent être dans le même ordre que les espaces réservés (voir cette documentation pour plus d'informations.)
J'ai mis à jour cette réponse, vous pouvez essayer de réarrangement de l'ordre de votre espace réservé cordes. Voir la réponse pour plus de détails.
il travaille maintenant 🙂 maintenant, je peux voir comment l'ordre peut également faire une différence..merci beaucoup..
Pas de problème; et... bienvenue à Débordement de Pile! Comme vous posez des questions, n'oubliez pas de laisser savoir à la communauté si une réponse vous aide par upvoting d'une réponse, ou accepter la réponse! Merci~
OriginalL'auteur summea
Qu'est-ce que la sortie de executeUpdate? Est-il retourner n'importe quel nombre de lignes mises à jour? Si non, alors il est évident que votre clause de mise à jour doit être, bien, mis à jour!
Si le executeUpdate retourne un nombre positif, indiquant que la mise à jour nombre de lignes, peut-être votre commit politique n'est pas définie à validation automatique. Dans ce cas, vous pouvez s'engager après executeUpdate.
OriginalL'auteur JUG
Mise à JOUR de l'élément Nom du JEU de = ?, Size = ?, Prix = ? OÙ ItemCode = ?
OriginalL'auteur Hugues
Après l'obtention de DB connexion automatique s'engager à true pour que DB sera mis à jour sans aucune erreur.
OriginalL'auteur user1907542