Java で PreparedStatement を使用してクエリを実行しようとすると、「?」付近の構文エラーを示すエラーが発生します。例外は次のとおりです。
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
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); // Fail!
MySQL が「?」を認識しないためにエラーが発生します。 SQL クエリ内でプレースホルダーとして使用されます。これは、次の呼び出しによるものです:
rs = s.executeQuery(query); // Fail!
引数なしで PreparedStatement#executeQuery を使用する代わりに、元のクエリ文字列が渡され、準備されたステートメントがオーバーライドされます。
問題を解決するには、PreparedStatement のexecuteQuery メソッドは引数なしで呼び出す必要があります:
rs = s.executeQuery(); // OK!
元の問題とは関係ありませんが、コードはリソースをリークします。これを防ぐには、JDBC イディオムを使用してリソースを閉じる必要があります:
try { // Acquire resources here } catch (Exception e) { // Handle exception } finally { // Close resources here }
以上がJava の PreparedStatement が「?」付近の MySQL 構文エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。