ホームページ > Java > &#&チュートリアル > Java の PreparedStatement が「?」付近の MySQL 構文エラーをスローするのはなぜですか?

Java の PreparedStatement が「?」付近の MySQL 構文エラーをスローするのはなぜですか?

Linda Hamilton
リリース: 2025-01-01 02:31:09
オリジナル
176 人が閲覧しました

Why Does My PreparedStatement in Java Throw a MySQL Syntax Error Near

PreparedStatement に関する MySQL 構文エラーの質問

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!
ログイン後にコピー

Resourceリーク

元の問題とは関係ありませんが、コードはリソースをリークします。これを防ぐには、JDBC イディオムを使用してリソースを閉じる必要があります:

try {
    // Acquire resources here
} catch (Exception e) {
    // Handle exception
} finally {
    // Close resources here
}
ログイン後にコピー

以上がJava の PreparedStatement が「?」付近の MySQL 構文エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート