2014-12-06 37 views
0

我試圖輸入一組值到表預留,使用數據庫事務調度。沒有拋出異常,但值沒有被輸入到DB中。在這裏我使用了使用java.sql.PreparedStatement。嘗試使用jdbc事務向數據庫表中輸入值

public boolean addReservation(Reservation res, ArrayList<ReservationDetails> resdetlist) throws Exception { 
    connection = DBConnection.getDBConnection(); 
    try { 
     System.out.println("A"); 
     connection.setAutoCommit(false); 
     PreparedStatement ps1 = connection.prepareStatement("insert into reservation values(?,?,?,?)"); 
     ps1.setString(1, res.getResid()); 
     ps1.setBoolean(2, res.isCheckin_status()); 
     ps1.setString(3, res.getRes_from()); 
     ps1.setString(4, res.getRes_till()); 
     int addedres = ps1.executeUpdate(); 
     System.out.println("addres:" + addedres); 
     System.out.println("B"); 
     if (addedres > 0) { 
      for (ReservationDetails resdet : resdetlist) { 
       //int addedresdet = addReservationDetails(resdet); 
       PreparedStatement ps2 = connection.prepareStatement("insert into resdetails values(?,?,?,?,?,?)"); 
       ps2.setString(1, resdet.getResid()); 
       ps2.setString(2, resdet.getNic()); 
       ps2.setString(3, resdet.getPayment_id()); 
       ps2.setString(4, resdet.getRoom_no()); 
       ps2.setString(5, resdet.getType_of_accomodation()); 
       ps2.setString(6, resdet.getDate_of_reservation()); 
       int addedresdet = ps2.executeUpdate(); 
       System.out.println("addedresdet:" + addedresdet); 
       System.out.println("C"); 
       if (addedresdet <= 0) { 
        System.out.println("D"); 
        connection.rollback(); 
        return false; 
       } 
      } 

     } else { 
      System.out.println("E"); 
      connection.rollback(); 
      return false; 
     } 
     connection.commit(); 
    } catch (Exception ex) { 
     // ex.printStackTrace(); 
     connection.rollback(); 
    } finally { 
     connection.setAutoCommit(true); 
     System.out.println("F"); 
    } 
    return true; 

} 
+0

我猜你需要一個提交行? – xcoder 2014-12-06 17:32:13

回答

0

如果executeUpdate()返回<= 0則沒有在數據庫中更改,因此沒有必要回滾事務。另外,如果插入條目時發生問題(例如違反約束條件等),則executeUpdate()將引發SQLException。我想你的代碼更改爲:

try { 
    connection.setAutoCommit(false); 
    PreparedStatement ps1 = ... 
    ... 
    ps1.executeUpdate(); 
    for (ReservationDetails resdet : resdetlist) { 
     PreparedStatement ps2 = ... 
     ... 
     ps2.executeUpdate(); 
    } 
    connection.commit(); 
} catch (SQLException e) { 
    connection.rollback(); 
} 

另外,不要忘記調用close()PreparedStatements你使用他們,並在方法結束時connection對象。

+0

我完全按照上面所述進行了修改,沒有任何效果。 – 2014-12-06 17:50:13

+0

您是否看到任何異常?你在catch(Exception ex)中捕獲它們,但是你沒有打印它們:'''''''''''''''ex.printStackTrace();' – 2014-12-06 17:52:00

+0

是的,拋出了一個異常。它被糾正了。無論如何謝謝你指出! ! – 2014-12-06 18:39:17

相關問題