1
 public void updateDeduction(String empId, String dedId, String dedname,String dedamount,String date) throws SQLException{
 //update the contributions
  stmt = conn.createStatement();
 String updateString ="INSERT INTO deductions (empId,dedId,dedName,dedAmount,dedDate) VALUES (";
  updateString +="'"+empId+"', ";
  updateString +="CURDATE(), " ;
  updateString +="'"+dedId+"'";
  updateString +="'"+dedname+"', ";
  updateString +="'"+dedamount+"')";


  stmt.executeUpdate(updateString);

  return;

[控除] タブをクリックするとエラーが発生します。どうすればよいか教えてください。

4

3 に答える 3

4

PreparedStatementの代わりに使用することをお勧めしますStatementsql injection攻撃を防ぐのに役立ちます。次のようにビルドしてみてくださいPreparedStatement-

String updateString ="INSERT INTO deductions (empId, dedId, dedName, dedAmount, dedDate) VALUES (?,?,?,?,?)";

    PreparedStatement preparedStatement = conn.prepareStatement(updateString);

    preparedStatement.setInt(1, empId);
    preparedStatement.setInt(2, dedId);
    preparedStatement.setString(3, dedName);
    preparedStatement.setDouble(4, dedAmount);
    preparedStatement.setDate(5, dedDate);

    preparedStatement .executeUpdate();
于 2013-01-05T06:21:52.383 に答える
1

これを行う適切な方法は、PreparedStatementを使用することです。これがどのように行われるかを示すために、以下の OP コードを書き直しました。

public void updateDeduction(String empId, String dedId, String dedname,String dedamount,String date) throws SQLException{
    //update the contributions
    PreparedStatement updateString = conn.prepareStatement("INSERT INTO deductions (empId,dedId,dedName,dedAmount,dedDate) VALUES (?, ?, ?, ?, ?)", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); // you passed in CURDATE() instead of using one of your parameters.
    updateString.setString(1, empId);
    updateString.setString(2, dedId);
    updateString.setString(3, dedName);
    updateString.setString(4, dedAmount);
    updateString.setString(5, date); // you were missing this line
    if (updateString.executeUpdate() == 1) return;
    else throw new RuntimeException("Update failed");
}

このスタイルを使用した理由をより明確にするために、私のコードに関するいくつかのコメント。挿入コンテキストに挿入された行数を返すようにexecuteUpdateが定義されているため、挿入が成功したことを確認するために if 行が存在します。また、ステートメントが行を変更する場合は、ステートメントを更新可能として宣言する必要があります。さらに支援や説明が必要な場合は、ここにコメントを残してください。

于 2013-01-05T06:27:29.877 に答える
0

カンマがありませんupdateString +="'"+dedId+"'";

また、文字列に連結する値の順序は、フィールドの順序と一致しません。INSERT INTO (...)

修正は次のようになります

  updateString +="'"+empId+"', ";
  updateString +="'"+dedId+"', "; //Or updateString += dedId+", ";  If dedId is an integer value in the database.
  updateString +="'"+dedname+"', ";
  updateString +="'"+dedamount+"', ";
  updateString +="CURDATE())" ;

フィールドの順序に一致するように文字列連結の順序を変更したことに注意INSERT INTO (...)してください。最後のフィールドを除いて、すべてのフィールドの後にカンマがあります。

于 2013-01-05T06:06:20.400 に答える