Maison > Java > javaDidacticiel > Pourquoi mon PreparedStatement entraîne-t-il une exception « Vous avez une erreur dans votre syntaxe SQL » dans MySQL ?

Pourquoi mon PreparedStatement entraîne-t-il une exception « Vous avez une erreur dans votre syntaxe SQL » dans MySQL ?

Linda Hamilton
Libérer: 2024-12-06 19:24:12
original
857 Les gens l'ont consulté

Why Does My PreparedStatement Result in a

Vous avez une erreur dans votre syntaxe SQL lors de l'utilisation de PreparedStatement

Problème :

Lors de l'exécution d'une requête à l'aide d'un PreparedStatement en Java, une MySQLSyntaxErrorException se produit avec le message d'erreur : "Vous avez une erreur dans votre syntaxe SQL... proche de ' ? ou MemberName = ?'."

Code :

String query = "select MemberID, MemberName from members where MemberID = ? or MemberName = ?";
Connection conn = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
PreparedStatement s = conn.prepareStatement(query);
s.setInt(1, 2);
s.setString(2, "zen");
ResultSet rs = s.executeQuery(query);
Copier après la connexion

Cause :

L'erreur de syntaxe est causée par le point d'interrogation (?) dans la requête SQL. MySQL l'interprète comme un point d'interrogation littéral, et non comme un espace réservé pour un paramètre. Cela entraîne une syntaxe SQL non valide.

Solution :

Pour résoudre le problème, remplacez le point d'interrogation dans la requête SQL par un paramètre nommé. Cela permettra au PreparedStatement de lier correctement les valeurs des paramètres :

String query = "select MemberID, MemberName from members where MemberID = :member_id or MemberName = :member_name";
Copier après la connexion

Dans le code Java, utilisez la méthode PreparedStatement#setString pour définir les paramètres nommés :

s.setString("member_id", "2");
s.setString("member_name", "zen");
Copier après la connexion

Alternativement, vous peut utiliser la méthode sans argument s.executeQuery() au lieu de s.executeQuery(query) pour éviter de remplacer la requête préparée par l'original requête.

Fuite de ressources :

Notez que le code fourni présente un problème de fuite de ressources. Les objets Connection, Statement et ResultSet doivent être fermés dans un bloc final pour éviter l'épuisement des ressources.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal