web-dev-qa-db-ja.com

SQLException:executeQueryメソッドは更新に使用できません

Javaサーブレットクラスを使用して、登録フォームから取得したユーザー情報をDerby DBに挿入しようとしています。

ユーザーの情報が入力された状態でユーザーが送信ボタンをクリックした直後に、NetBeansのDBに接続しました。次に、このメソッドを実行する必要があります。

public void insertNewUser(String userName, String passWord, String lastName, String firstName, String age, char sex, String email) {
    try {
        stmt = conn.createStatement();
        String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES ('" + userName + "', '" + passWord + "', '" + lastName + "', '" + firstName + "', " + age + ", '" + sex + "', '" + email + "')";
        System.out.println(insertNewUserSQL);
        stmt.executeQuery(insertNewUserSQL);
        stmt.close();
    } catch(SQLException sqlExcept) {
        sqlExcept.printStackTrace();
    }
}

しかし、私は次の例外を受け続けます:

Java.sql.SQLException: executeQuery method can not be used for update.

これはどういう意味ですか?

NetBeans SQLコマンドウィンドウで手動で実行できるため、SQLコマンドは正しいです。

サーブレットや私が知らないことについての制限はありますか?

前もって感謝します!

13
danksim

レコードを挿入するので、executeUpdate()ではなくexecuteQuery()を使用する必要があります。

通常は誤用されるいくつかの方法を次に示します。


ブール実行()

このPreparedStatementオブジェクト内のSQLステートメントを実行します。これは、どのような種類のSQLステートメントでもかまいません。

ResultSet executeQuery()

このPreparedStatementオブジェクトでSQLクエリを実行し、クエリによって生成されたResultSetオブジェクトを返します。

int executeUpdate()

このPreparedStatementオブジェクト内のSQLステートメントを実行します。これは、SQL INSERT、UPDATE、またはDELETEステートメントでなければなりません。または、DDLステートメントなど、何も返さないSQLステートメント。


さらに、SQL Injectionに対して脆弱であるため、クエリは脆弱です。 PreparedStatementを使用してパラメーター化してください。

サンプルコードスニペット:

String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES (?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(insertNewUserSQL);
pstmt.setString(1, userName);
// ... repeat this step until the last parameter ....
pstmt.setString(7, email);
pstmt.executeUpdate();
23
John Woo

値を更新するには、次のように更新可能なResultSetを使用する必要があります。

_ResultSet res = preparedStatement.executeQuery(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
res.first();
res.updateInt("id", 2);
res.updateRow();
_

または、次のように、ステートメントのexecuteUpdateメソッドを使用できます。statement.executeUpdate("update table set id = 2");

1
hd1