2014-04-02 2 views
0

JDBC Dao 개체가 있고 PreparedStatements를 사용하여 데이터베이스의 테이블에서 행을 UPDATE했습니다.Oracle의 JDBC 업데이트가 커밋하지 못했습니다.

SELECT (삽입 커밋)가 성공한 다른 방법이 있습니다. 그러나 업데이트는 변경 사항을 커밋하지 않습니다 (전혀 작동하지 않음). 동일한 UPDATE 문은 Oracle SQLServer에서 직접 작동합니다.

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class StaffDAO { 
    private Connection conn; 

    public StaffDAO() { 
     try { 
      Class.forName("oracle.jdbc.driver.OracleDriver"); 
     } catch (ClassNotFoundException e) { 
      System.out.println("Oracle Driver not found"); 
      System.exit(0); 
     } 
     try { 
      conn = DriverManager.getConnection(
        "jdbc:oracle:thin:@db01.xxxdev.com:1521:training", 
        "training", "training"); 
     } catch (SQLException e) { 
      System.out.println("Driver manager failed"); 
     } 
    } 

    public ResultSet getAllResultSet() { 
     String sql = "select * from ben_staff"; 
     Statement stmt = null; 
     ResultSet rs = null; 
     try { 
      stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
        ResultSet.CONCUR_READ_ONLY); 
      rs = stmt.executeQuery(sql); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } 
     return rs; 

    } 

    public Staff viewEmployee(String id) throws Exception { 
     Staff st = new Staff(); 
     String sql = "SELECT * from BEN_STAFF where BEN_STAFF.id =\'" + id 
       + "\'"; 
     // String psql = "SELECT * FROM BEN_STAFF WHERE ID = ?"; 

     Statement statement = null; 
     // PreparedStatement pstatement = null; 
     try { 
      statement = conn.createStatement(); 
      // pstatement = conn.prepareStatement(psql); 
      // pstatement.setString(1, id); 
     } catch (SQLException e) { 
      System.out.println("Create Statement failed"); 
      System.exit(1); 
     } 
     ResultSet rs = null; 
     try { 
      rs = statement.executeQuery(sql); 
      // rs = pstatement.executeQuery(); 

      while (rs.next()) { 
       st.setId(rs.getString("ID")); 
       st.setLastName(rs.getString("LASTNAME")); 
       st.setFirstName(rs.getString("FIRSTNAME")); 
       st.setMi(rs.getString("MI")); 
       st.setAddress(rs.getString("ADDRESS")); 
       st.setCity(rs.getString("CITY")); 
       st.setState(rs.getString("STATE")); 
       st.setTelephone(rs.getString("TELEPHONE")); 
       st.setEmail(rs.getString("EMAIL")); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       statement.close(); 
       rs.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
     return st; 
    } 

    public boolean insert(String id, String last, String first, String mi, 
      String address, String city, String state, String telephone, 
      String email) { 
     PreparedStatement pstmt = null; 
     String psql = "insert into ben_staff (id, lastname, firstname, mi, address, city, state, telephone, email)" 
       + "values (?,?,?,?,?,?,?,?,?)"; 

     try { 
      pstmt = conn.prepareStatement(psql); 
      // pstmt.setString(1,st.getId()); 
      // pstmt.setString(2, st.getLastName()); 
      // pstmt.setString(3, st.getFirstName()); 
      pstmt.setString(1, id); 
      pstmt.setString(2, last); 
      pstmt.setString(3, first); 
      pstmt.setString(4, mi); 
      pstmt.setString(5, address); 
      pstmt.setString(6, city); 
      pstmt.setString(7, state); 
      pstmt.setString(8, telephone); 
      pstmt.setString(9, email); 
      pstmt.executeUpdate(); 
      conn.commit(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
      return false; 
     } finally { 
      try { 
       pstmt.close(); 
      } catch (SQLException ex) { 
       ex.printStackTrace(); 
      } 
     } 
     return true; 
    } 

    public boolean update(String id, String last, String first, String mi, 
      String address, String city, String state, String telephone, 
      String email) { 
     PreparedStatement pstmt = null; 
     String psql = "update ben_staff set lastname=?, firstname=?, mi=?, address=?, city=?, state=?," 
       + " telephone=?, email=? where id=?"; 

     try { 
      pstmt = conn.prepareStatement(psql); 
      pstmt.setString(1, last); 
      pstmt.setString(2, first); 
      pstmt.setString(3, mi); 
      pstmt.setString(4, address); 
      pstmt.setString(5, city); 
      pstmt.setString(6, state); 
      pstmt.setString(7, telephone); 
      pstmt.setString(8, email); 
      pstmt.setString(9, id); 
      pstmt.executeUpdate(); 
      conn.commit(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
      try{ 
       conn.rollback(); 
      } catch (SQLException exx){ 
       System.out.println("Update Rollback Failed"); 
      } 
      return false; 
     } finally { 
      try { 
       pstmt.close(); 
      } catch (SQLException ex) { 
       ex.printStackTrace(); 
      } 
     } 
     return true; 
    } 

    public void close() { 
     try { 
      conn.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+0

'autoCommit'에 있다고 말할 수있는 한'commit()'또는'rollback()'을 호출하면 항상 예외가 발생합니다. –

답변

1

pstmt.executeUpdate();은 무엇을 반환합니까? 그러면 얼마나 많은 행이 업데이트되는지 알려줍니다. 뭔가 같은 것

int numRows = pstmt.executeUpdate(); 
System.out.println("Update modified " + numRows + " rows."); 

내 생각 엔 업데이트로 인해 실제로 행이 수정되지 않는다고 생각됩니다. 이는 id이 전달되었다는 것을 의미합니다. SQL Server에서 문자열 비교는 기본적으로 대/소문자를 구분하지 않지만 Oracle에서는 대/소문자를 구분합니다.

+0

예. 그 표현식은 0을 반환합니다. 그러나 올바른 변수가 전달되고, 설정되고, 모든 것이 있는지 확인했습니다. –

+0

@ mediocr3 - 확인. 그래서'update'가 커밋됩니다. 어떤 행도 업데이트하지 않습니다. 전달되는'id' 값은 무엇입니까? 그 값을 가진 행 (대소 문자 구분)이 테이블에 있는지 확인 하시겠습니까? –

+0

올바른 테스트 ID가 전달되었습니다. 비록 (Update 문)은 SQLDeveloper에서 바로 작동합니다. 코드가 실행될 때 업데이트 도중 오류가 발생하지 않습니다. 그것은 단지 executeUpdate 동안 0을 반환 .. 어떻게에 관해서 궁금? –

관련 문제