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
Linda Hamiltonoriginal
2024-12-06 19:24:12832parcourir

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

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";

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

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!

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