ホームページ >Java >&#&チュートリアル >MySQL で PreparedStatement によって「SQL 構文にエラーがあります」という例外が発生するのはなぜですか?

MySQL で PreparedStatement によって「SQL 構文にエラーがあります」という例外が発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-06 19:24:12847ブラウズ

Why Does My PreparedStatement Result in a

PreparedStatement を使用するときに SQL 構文にエラーがあります

問題:

PreparedStatement を使用してクエリを実行するときJava では、MySQLSyntaxErrorException が発生し、次のエラー メッセージが表示されます。 SQL 構文...'? または MemberName = ?' の近く。"

コード:

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

原因:

構文エラーは、SQL クエリ内の疑問符 (?) によって発生します。 MySQL は、これをパラメータのプレースホルダとしてではなく、リテラルの疑問符として解釈します。これにより、無効な SQL 構文が発生します。

解決策:

この問題を解決するには、SQL クエリ内の疑問符を名前付きパラメータに置き換えます。これにより、PreparedStatement がパラメータ値を正しくバインドできるようになります。

String query = "select MemberID, MemberName from members where MemberID = :member_id or MemberName = :member_name";

Java コードでは、PreparedStatement#setString メソッドを使用して名前付きパラメータを設定します。

s.setString("member_id", "2");
s.setString("member_name", "zen");

または、 s.executeQuery(query) の代わりに引数なしの s.executeQuery() メソッドを使用して、準備されたクエリが元のクエリ。

リソース リーク:

提供されたコードにはリソース リークの問題があることに注意してください。リソースの枯渇を防ぐために、Connection、Statement、および ResultSet オブジェクトは、finally ブロックで閉じる必要があります。

以上がMySQL で PreparedStatement によって「SQL 構文にエラーがあります」という例外が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。