2011-03-16 33 views
2

我想知道這個刪除語句是否真的刪除了一些東西。下面的代碼總是執行else。是否刪除了某些內容。什麼是正確的方法來做到這一點?如何知道在java中執行的sql語句?

public Deleter(String pname, String pword) { 

     try { 
      PreparedStatement createPlayer = conn.prepareStatement("DELETE FROM players WHERE P_Name='"+ pname +"' AND P_Word='" + pword + "'"); 
      createPlayer.execute(); 

      if(createPlayer.execute()==true){ 

      JOptionPane.showMessageDialog(null, "Player successfully deleted!"); 

      }else{ 

       JOptionPane.showMessageDialog(null, "Player does not exist!", "notdeleted", JOptionPane.ERROR_MESSAGE); 
      } 

     } catch (Exception e) { 
     } 
    } 

回答

9

由於你兩次調用.execute(),所以你實際上執行了兩次delete語句。在大多數情況下,如果您幾乎立即第二次運行該語句,則不太可能會刪除該語句中的數據。

相反,使用其返回給你修改的行數executeUpdate() method

int rowsAffected = createPlayer.executeUpdate(); 

if(rowsAffected > 0) { 
    JOptionPane.showMessageDialog(null, "Player successfully deleted!"); 
} 
else{ 
    JOptionPane.showMessageDialog(null, "Player does not exist!", "notdeleted", JOptionPane.ERROR_MESSAGE); 
} 
6

使用executeUpdate。它返回一個int參數,告訴你受影響的行數。另外,要小心,在你的代碼中執行語句兩次。

2

您應該更換createPlayer.execute();對於一個createPlayer.executeUpdate,它將返回一個int值,該int值代表受影響的行數。你需要做的是將它保存在一個int中,然後進行比較,如果它是0.

+0

不需要將返回值保存到臨時變量。你可以直接將返回值與if語句中的零值進行比較。 – jzd 2011-03-16 13:51:23

+0

這只是一種風格差異,你應該總是採取任何風格的項目。 – Hiro2k 2011-04-18 20:44:04

1

使用的executeUpdate()來獲得行數。

也有一些重大項目需要在你的代碼修正:

  • 您沒有使用正確PreparedStatement。改用參數。
  • 不要吞下異常。至少打印一個堆棧跟蹤,但向用戶顯示消息會很好。
  • 您正在運行該語句兩次。只要在你的if語句中做一次。