0
public void deleteBook(int temp)
{
    try
    {
        query = "DELETE FROM ccItems WHERE ISBN = '"+temp+"'";

        stmt.executeUpdate(query);

        JOptionPane.showMessageDialog(null, "Item Deleted !");
    }      

    catch(Exception e)
    {
        JOptionPane.showMessageDialog(null, "Error: Could not find ISBN or Already deleted.");
    }
}

我有一种deleteBook()方法可以删除我的数据库中的项目。它正常工作意味着删除输入了相应 ISBN 的指定项目。问题是,如果用户输入的 ISBN不在我的数据库中,该try语句仍会执行。我认为该catch语句必须执行,因为在数据库中找不到输入的 ISBN。

4

5 回答 5

0

尝试仍将运行。它只是删除了 0 行。

您需要使用executeUpdate()的返回值。由于 executeUpdate() 返回一个 int; 更新或删除的实体数量,您可以使用它来解决您的问题。你可以抛出一个异常来获取你的错误信息。

public void deleteBook(int temp)
{
    try
    {
        query = "DELETE FROM ccItems WHERE ISBN = '"+temp+"'";
        if (stmt.executeUpdate(query)!=0) {
          JOptionPane.showMessageDialog(null, "Item Deleted !");
        } else {
          throw new Exception();
        }
    }      
    catch(Exception e)
    {
        JOptionPane.showMessageDialog(null, "Error: Could not find ISBN or Already deleted.");
    }
}
于 2013-03-16T06:53:48.457 回答
0

与选择查询一样,“未找到记录”也不例外。stmt.executeUpdate(query);将返回删除的记录数。

于 2013-03-16T06:53:53.540 回答
0

从数据库的角度来看,这根本不是错误,只是在给定您的 where 条件下没有找到任何匹配的记录。这就是为什么您没有在客户端引发异常的原因。

于 2013-03-16T06:55:08.493 回答
0

如果我输入一些东西使 temp 等于 ' 或 ''=',你所有的 ccItems 都将被删除,这就是 SQL 注入攻击。

于 2013-03-16T06:55:36.897 回答
0

它不会给出任何错误,因为如果 ISBN 不存在,它只会影响零行而不会出现任何错误。

如果您想确切知道是否删除了任何行,请编写如下代码。

public void deleteBook(int temp){
   try{
        query = "DELETE FROM ccItems WHERE ISBN = '"+temp+"'";
        int numberOfRowsEffected = stmt.executeUpdate(query);
        if (numberOfRowsEffected == 0){
            JOptionPane.showMessageDialog(null, "Item not found !");
        }else{
            JOptionPane.showMessageDialog(null, "Item Deleted !");
        }
    } catch(Exception e){
        JOptionPane.showMessageDialog(null, "Error: Could not find ISBN or Already deleted.");
    }
}
于 2013-03-16T06:56:11.993 回答