2013-04-15 119 views
12

登録フォームから取得したユーザー情報を、Javaサーブレットクラスを使用してDerby DBに挿入しようとしています。SQLException:executeQueryメソッドを更新に使用できません

ユーザーの情報を入力して送信ボタンをクリックすると、すぐに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コマンドは正しいです。

サーブレットなどの制限事項はありますか?

ありがとうございます!

答えて

20

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

は通常、誤用されているいくつかのメソッドです:


ブールは、(実行)

は あらゆる種類のSQL文このPreparedStatementオブジェクト内のSQL文を実行します。

のResultSetのexecuteQuery()は

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

INTのexecuteUpdate()

は は、SQL INSERT、UPDATEであるか、またはステートメントを削除する必要があり、このPreparedStatementオブジェクトでSQL文を実行し、またはDDLステートメントなどの何も戻さないSQLステートメント 。それはSQL Injectionと脆弱であるよう


もう一つは、あなたのクエリが弱いです。 PreparedStatementを使用してパラメータ化してください。

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

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

を代わりに使用することができ、:

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(); 
+0

ありがとう、J W!チャームのように働いた! – dinky

+1

@Dinkyコードスニペットを含む最新の回答を参照してください。 –

+0

J W、ありがとうございました。これは私のようなnoobsにとって非常に役立ちます。私はPreparedStatementsを確実に使用します!再度、感謝します! – dinky

1

は、次のようにあなたは、更新可能なResultSetを使用する必要がある値を更新します次のようにstatementのexecuteUpdateメソッド: statement.executeUpdate("update table set id = 2");

+0

ありがとう、hd1。 executeUpdate()はうまくいきます! – dinky

関連する問題