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
Patricia Arquetteoriginal
2024-12-23 08:44:10739parcourir

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

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

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();

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!

Déclaration:
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