2012-03-06 1 views
0

beforeFirst()을 제거하면 내 기능은 처음에 ResultSet에 기록되고 끝납니다. beforeFirst()을 사용하면 오류 ResultSet IS_TYPE_FORWARD_ONLY가 표시됩니다.rs.next()가 다른 레코드로 이동하지 않는 이유

try { 
    ResultSet rs = stat.executeQuery("select _id, godziny_id from tblZmiany where harmonogram_id = " + h_id + " order by pracownik_id, Dzien"); 
    rs.beforeFirst(); 
    while (rs.next()) { 
     if (stat.executeUpdate("insert into tblWykonanie (Zmiana_id, Godziny_id) values ('" + rs.getLong(1) + "', " + rs.getInt(2) + ");") < 1) { 
      // Jeśli insert nie wstawił kolejnego rekordu 
      error_code = "Wystąpił problem podczas zatwierdzania harmonogramu."; 
      return false; 
     } 
    } 
} catch (SQLException e) { 
    e.printStackTrace(); 
    System.out.println(e.getMessage()); 
    return false; 
} catch (Exception e) { 
    error_code = e.getMessage(); 
    return false; 
} 

return true; 
+0

SQL 엔진의 유형이 – mKorbel

+1

수 있음하시기 바랍니다 당신이 재설정하는 RS .executeUpdate에서 당신은 연결을 만드는 동안 속성을 설정해야? – Nadmin

답변

3

당신은 SELECTINSERT에 동일한 Statement 객체를 사용하고 있습니다. Javadoc에서 :

를 생성 Statement 객체 폐쇄 재실행하거나, 일련의 복수의 결과로부터 다음 결과를 검색하기 위해 사용될 때 ResultSet 개체가 자동으로 폐쇄된다.

문제를 해결하려면 executeUpdate() 호출에 별도의 Statement 개체를 사용하십시오.

또한 바운드 인수 (?으로 표시)와 함께 PreparedStatement을 사용하도록 코드를 변경하는 것이 좋습니다. 지금하고있는 것처럼 SQL 문을 조금씩 작성하면 security vulnerabilities이 열릴 수 있습니다.

1

코드에 심각한 보안 결함이 있습니다. SQL 인젝션에 취약합니다. 절대 SQL 문으로 문자열 연결을 사용하지 마십시오. 대신 PreparedStatements를 사용하십시오!

harmonogram_id = " + h_id + " order by pracownik_id, 

응용 프로그램을 쉽게 간단한 트릭으로 소유 할 수있는 방법을 보려면 여기를보세요 : http://en.wikipedia.org/wiki/SQL_injection

하지만 귀하의 질문에 대답하기 위해서는 데이터베이스에 따라 달라집니다. 에서

Statement stmt = con.createStatement(
          ResultSet.TYPE_SCROLL_SENSITIVE, 
          ResultSet.CONCUR_UPDATABLE), 
          ResultSet.HOLD_CURSORS_OVER_COMMIT); 

: http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/resultset.html#1012735

+1

모범 사례는 아니지만'h_id'가 int 인 경우 위험하지 않습니다. –

+0

동의하지만 동의하지 않습니다. 지금은 안전 할 수도 있습니다. 그러나 초보자 동료가 와서 int를 String으로 변경하면 프론트 엔드에서 많은 작업을 수행 할 필요가 없습니다. 단위 테스트는 여전히 "통과"합니다. 미안보다 안전 할 것! –