0

我正在尝试传递一个 SQL 命令,其中必须从数据库中删除一行。我正在使用 setString(index, value) 并调用主类中的方法。但是当我将参数传递给主类中的方法时,数据库中没有任何反应。是否有一种形式可以传递“jobnumber=”的值?在 main 方法中,以便从数据库中删除该行?ps:jobnumber声明为serial,是数据库中的主键。

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DeleteUserDao {
    Connection conDB2 = Connect.connectDB();    
    public void deleteDb(String y) {
        String sqlDelete = ("DELETE FROM bookings WHERE jobnumber=?");      
        try {
            PreparedStatement deleter = conDB2.prepareStatement(sqlDelete);
            deleter.setString(1, y);            
            System.out.println("Item deleted from Bookings.");
        } catch (SQLException e) {
            System.out.println("Coud not delete item. " + e.getMessage());
            e.printStackTrace();
        }
    }
}

import ***.jdbc.DeleteUserDao;

public class DeleteTest {
    public static void main(String[] args) {
        DeleteUserDao del = new DeleteUserDao();        
        del.deleteDb("4");
    }
}
4

2 回答 2

2

如果我理解你的问题,那么你就错过executeUpdate()Statement

PreparedStatement deleter = conDB2.prepareStatement(sqlDelete);
deleter.setString(1, y);
deleter.executeUpdate(); // <-- like so

从链接的 Javadoc,

执行此 PreparedStatement 对象中的 SQL 语句,该语句必须是 SQL 数据操作语言 (DML) 语句,例如 INSERT、UPDATE 或 DELETE;或不返回任何内容的 SQL 语句,例如 DDL 语句。

编辑

如以下评论中所述,您可能应该使用一种int类型,并且需要关闭您的PreparedStatement-

public void deleteDb(int y) {
  String sqlDelete = ("DELETE FROM bookings WHERE jobnumber=?");     
  PreparedStatement deleter = null; 
  try {
    deleter = conDB2.prepareStatement(sqlDelete);
    deleter.setInt(1, y);            
    System.out.println("Item deleted from Bookings.");
  } catch (SQLException e) {
    System.out.println("Coud not delete item. " + e.getMessage());
    e.printStackTrace();
  } finally {
    if (deleter != null) {
      try {
        deleter.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

然后调用它,传递一个int-

del.deleteDb(4);
于 2014-08-11T14:33:14.823 回答
1

您实际上并没有告诉程序运行该命令。

prepareStatement通话中,你告诉程序“这是我将运行的命令的格式,我可能会用不同的参数代替问号多次运行它”,在setString通话中你说“此刻,我想我想在参数 1 设置为 y 值的情况下运行命令”,但您实际上从未说过“执行语句”。你可以通过运行:

deleter.execute();

造成这种情况的原因是多方面的,但最简单的例子是,如果您正在运行带有两个参数的准备好的语句,并且您计划运行该语句 400 次。

说你有"DELETE FROM bookings WHERE jobnumber=? AND personid=?",你跑了:

deleter.setString(1, y);
deleter.setString(2, y);

然后,您想将参数 1 设置为某个值 x,将参数 2 设置为某个值 z。所以你运行:

deleter.setString(1, x);
deleter.setString(2, z);

如果事情按照您在问题中假设的方式进行,这将产生意想不到的行为,因为参数 1 和 2 都已设置为y,因此将参数 1 设置为 x 将使参数 1 变为 x 而 2 保持为 y,并且这两个参数都是设置这将提示在这两个调用上自动执行 SQL setString。这不会是你想要的。

另一方面,如果您只是想更改参数 1,而不想更改参数 2,那么简单地说:

deleter.setString(1, x);
deleter.execute();

代替:

deleter.setString(1, x);
deleter.setString(2, y);

在那个特定的例子中,它并没有节省太多的精力。但是,如果您有一个包含 30 个参数的准备好的语句,并且在每次连续调用之间您平均只更改其中的 1 或 2 个参数,那么这种范例会节省大量的精力。

于 2014-08-11T14:47:39.137 回答