2017-07-07 37 views
0

このコードセグメントがあります。 searchStudentWith2RUCode()は、StudentオブジェクトのArraylistを返します。 Studentオブジェクトには、GPAなどforename、姓、cprnumber、など様々な属性を持つforeachループ内のループfor java

public void assignStudents() throws ClassNotFoundException, SQLException { 
    ArrayList<Student> notYetAssignedStudents = searchStudentsWith2RUCode(); 
    ArrayList<Student> assignedStudents = new ArrayList<>() 
      for (Education edu : eduList) { 

       for (int i = 0; i < edu.getAmountOfFreeSpacesInEdu(); i++) { 
        assignedStudents.add(notAssignedStudents.get(i));      
        setAssignedStudentsAdmitted(assignedStudents.get(i).getCPR, assignedStudents.get(i).getPrio, assignedStudents.get(i).eduNumber) 
     } 
    } 
} 

setAssignedStudentsAdmittedは私のデータベースを更新し、各入院学生に「Optaget」としての私のテーブル「学生」に「sagsbehandling」フィールドを設定する必要があります。しかし、これは動作しません。 私のforループを疑っていますが、私は失われました。なぜ動作しないのか分かりません。ここで

は私setAssignedStudentsAdmitted方法であって、

public void setAssignedStudentsAdmitted(String CPR, int prio, int eduNumber) throws ClassNotFoundException, SQLException { 

    //Declare a UPDATE statement 
    String updateStmt 
      = "UPDATE Students SET sagsbehandling='Optaget' WHERE cprnr ='" + CPR + "' AND prio='" + prio + "' AND eduNumber='" + eduNumber + "';"; 

    //Execute UPDATE operation 
    try { 
     DatabaseController.dbExecuteUpdate(updateStmt); 
    } catch (SQLException e) { 
     System.out.print("Error occurred while DELETE Operation: " + e); 
     throw e; 
    } 
} 

}

そしてここsetAssignedStudentsAdmitted

public static void dbExecuteUpdate(String sqlStmt) throws SQLException, ClassNotFoundException { 
    //Declare statement as null 
    Statement stmt = null; 
    try { 
     //Connect to DB (Establish Postgres Connection) 
     databaseConnect(); 
     //Create Statement 
     stmt = conn.createStatement(); 
     //Run executeUpdate operation with given sql statement 
     stmt.executeUpdate(sqlStmt); 
    } catch (SQLException e) { 
     System.out.println("Problem occurred at executeUpdate operation : " + e); 
     throw e; 
    } finally { 
     if (stmt != null) { 
      //Close statement 
      stmt.close(); 
     } 
     //Close connection 
     databaseDisconnect(); 
    } 
} 

に呼び出された私のdbExecuteUpdate方法では正常に構築し、私のデータベースには何も変化しません。

+1

最初のコードはコンパイルされません。あなたは少なくともセミコロンがないので、コードを正しくインデントするとコードを読みやすくなります。次に、コードのどの部分が実際に問題があるのか​​を特定する必要があります。 'dbExecuteUpdate'は単独で動作しますか?次に、そのようなSQLの構築をやめてください。代わりにパラメータ化されたSQLを使用してください。あなたの現在のコードは、SQLインジェクション攻撃に対して脆弱です(他の問題もあります)。 –

+0

あなたのコミットはどこですか? – user7294900

+0

ここで私のコードをコピーするインデントとセミコロンが失われている可能性があります。すべてがネットビーンでコンパイルされます。 dbExecuteUpdateは機能します。私のようなループの2つの作業を想像している私の問題です。代わりにSQLをパラメータ化する作業をします。 –

答えて

0

autoCommitをfalseに設定していることがありますか?あなたのdatabaseConnect()を確認するか、クイックテストが最後にコミットを実行するようにしてください。

0
//Declare a UPDATE statement 
    String updateStmt 
      = "UPDATE Students SET sagsbehandling='Optaget' WHERE cprnr ='" + CPR + "' AND prio='" + prio + "' AND eduNumber='" + eduNumber + "';"; 

範囲updateStmtsetAssignedStudentsAdmitted方法の範囲内です。だから、あなたはそれをメソッド呼び出しの下にどのように渡していますか?

public static void dbExecuteUpdate(String sqlStmt) 
     throws SQLException, ClassNotFoundException { 
+0

DatabaseController.dbExecuteUpdate(updateStmt); –

+0

リストに追加するときにdbを呼び出すのは実際には良い習慣ではないようです。 – Ravi

+0

代わりにforループの外側で行います –