Maison > base de données > tutoriel mysql > Pourquoi « s.executeQuery(query) » provoque-t-il une MySQLSyntaxErrorException « près de « ? » » ?

Pourquoi « s.executeQuery(query) » provoque-t-il une MySQLSyntaxErrorException « près de « ? » » ?

Patricia Arquette
Libérer: 2024-12-23 08:44:10
original
736 Les gens l'ont consulté

Why Does `s.executeQuery(query)` Cause a MySQLSyntaxErrorException

MySQLSyntaxErrorException près de "?" : Résolution des erreurs de syntaxe avec PreparedStatements

L'exécution de PreparedStatements en Java peut parfois rencontrer des erreurs de syntaxe, dont l'une est la redoutée exception "près de '?'". Pour comprendre sa cause et sa résolution, examinons le problème.

Description du problème

Les tentatives d'exécution d'un PreparedStatement génèrent une exception MySQLSyntaxErrorException avec le code d'erreur 1064, indiquant une syntaxe. erreur. La substitution des valeurs dans la requête à l'aide du navigateur de requêtes MySQL réussit, ce qui suggère que le problème réside dans le code.

Code pertinent

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); // Error
Copier après la connexion

Exception

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? or MemberName = ?' at line 1
Copier après la connexion

Solution

La La cause première de cette erreur est que MySQL rencontre un « ? » non traité. dans la requête SQL. Pour le résoudre, suivez ces étapes :

  1. Requête préparée remplacée : Notez que le code remplace le comportement prévu de PreparedStatements. La ligne ResultSet rs = s.executeQuery(query); est incorrect.
  2. Exécution correcte : Utilisez plutôt la méthode sans argument PreparedStatement#executeQuery() pour exécuter correctement la requête préparée.
ResultSet rs = s.executeQuery();
Copier après la connexion

Considérations supplémentaires

  • Ressource Fuite : Le code ne ferme pas la connexion, l'instruction et l'ensemble de résultats de manière appropriée. Implémentez un bloc d'essai avec les ressources pour éviter les fuites de 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