2016-05-16 17 views
0

これを行うには問題があります。 alumno、fechaInicio、fechaDefensaの3つのフィールドがNULLになるテーブルがあります。私は可能なnull値を別のメソッドに渡してチェックします。 NULL値の行を更新するときに '位置でパラメータを設定できませんでした'

public static void actualizarProyecto(int id, String nombre, String descripcion, String alumno, String profesor, String fechaInicio, String fechaDefensa, String convocatoria, int finalizado, int disponible, float nota) { 
    consulta = "UPDATE proyectos SET nombre='" + nombre + "', descripcion='" + descripcion + "', alumno='" + alumno + "', profesor='" + profesor + "', fecha_inicio='" + fechaInicio + "'," 
      + "fecha_defensa='" + fechaDefensa + "', convocatoria='" + convocatoria + "', " 
      + "finalizado=" + finalizado + ", disponible=" + disponible + ", nota='" + nota + "' WHERE id=" + id + ""; 
    CONEXION.actualizarProyecto(consulta, alumno, fechaInicio, fechaDefensa); 
} 

私が直接NULLに値を設定することはできませんので

私はフィールドがNULLまたは空であるかどうかを確認し、それがnullまたはしないように設定され、この第二の方法があります。

public void actualizarProyecto(String consulta, String alumno, String inicio, String defensa) { 
    PreparedStatement state = null; 
    try { 
     state = conexion.prepareStatement(consulta); 
     if (alumno == null) { 
      state.setNull(3, Types.VARCHAR); 
     } else { 
      state.setString(3, alumno); 
     } 

     if ("".equals(inicio)) { 
      state.setNull(4, Types.DATE); 
     } else { 
      state.setString(4, inicio); 
     } 

     if ("".equals(defensa)) { 
      state.setNull(5, Types.DATE); 
     } else { 
      state.setString(5, defensa); 
     } 

     state.executeQuery(); 
    } catch (SQLException e) { 
     JOptionPane.showMessageDialog(null, e.getMessage(), "Error al insertar el contenido en la BBDD.", JOptionPane.ERROR_MESSAGE); 
    } 
} 

私はCould not set parameter at position 3, parameter length is 0

どのように私はこの問題を解決することができますを取得するプログラムを実行していますか?

答えて

4

プリペアドステートメントにパラメータ値を設定するには、ステートメントに '?'設定しているパラメータごとに例:

consulta = "UPDATE proyectos SET nombre=?, descripcion=?, " + 
    "alumno=?, profesor=?, fecha_inicio=?, fecha_defensa=?, " + 
    "convocatoria=?, finalizado=?, disponible=?, nota=? WHERE id=?"; 

次に、「?」の各パラメータを設定します。

このアプローチの利点は、SQLインジェクションを回避できることです。

+0

ありがとうございました。私はこれを試してみたが、 '?'ヌル可能な値について。 – apeiron

+0

SQLインジェクション攻撃を読むと、なぜ「?」を使用するのがわかります。すべてのパラメータに対して良い考えです。 – Jason

関連する問題