Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java sql Delete上没有错误,但不';t删除记录(除非我在Where子句中使用Firstname)_Java_Sql - Fatal编程技术网

Java sql Delete上没有错误,但不';t删除记录(除非我在Where子句中使用Firstname)

Java sql Delete上没有错误,但不';t删除记录(除非我在Where子句中使用Firstname),java,sql,Java,Sql,我创建了一个方法来删除数据库中的人名。使用firstname(where子句),sql命令正在工作并成功删除记录。但是,在sql命令中使用“Lastname”可以工作,但不会删除记录。我输入了lastname,在它是firstname之前 public static void deletePerson (String lname ) { String host = "jdbc:mysql://localhost/Students"; String username = "

我创建了一个方法来删除数据库中的人名。使用firstname(where子句),sql命令正在工作并成功删除记录。但是,在sql命令中使用“Lastname”可以工作,但不会删除记录。我输入了lastname,在它是firstname之前

public static void deletePerson (String lname ) {

     String  host = "jdbc:mysql://localhost/Students";
     String username = "username";
     String password = "password";
    try {
        Connection connect = DriverManager.getConnection(host, username, password);

            // this is not working, I dont know what wrong with this ione
        PreparedStatement statement = connect.prepareStatement("DELETE FROM person WHERE Lastname = ?");
        statement.setString(2, lname);
        statement.close();
        connect.close();
        System.out.println("worrrk");


          // this is the working
        //PreparedStatement statement = connect.prepareStatement("DELETE FROM person WHERE Firstname = ?");
        //statement.setString(1, fname);



    } catch (SQLExcepton e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

让我们看看你采取的步骤

您已经创建了一个
预声明
,很好

PreparedStatement statement = connect.prepareStatement("DELETE FROM person WHERE Lastname = ?");
您设置的参数值…不正确

statement.setString(2, lname);
只有一个参数,所以应该是

statement.setString(1, lname);
您关闭了
语句

statement.close();
等等,什么?您是否打算对数据库实际“执行”某些命令

尝试在
语句.close()之前插入
语句.executeUpdate()

现在我们已经讨论了这一点,让我们讨论一下您(缺乏)的资源管理

如果
connect connect=…
connect.close()
之间出现问题,
connect.close()
(可能还有
语句.close()
)语句将永远不会执行,使数据库资源保持打开状态,但不会执行任何操作(被浪费)

幸运的是,举例来说,Java7+现在可以很容易地管理它

try (Connection connect = DriverManager.getConnection(host, username, password)) {
    try (PreparedStatement statement = connect.prepareStatement("DELETE FROM person WHERE Lastname = ?")) {

        statement.setString(1, lname);
        int rowsDeleted = statement.executeUpdate();
        // You could inspect the number of rows deleted
        System.out.println("worrrk");

    }
} catch (SQLException e) {
    e.printStackTrace();
}
请查看以了解更多详细信息

已更新

在某些情况下,
连接
可能未设置为自动提交,因此需要手动执行,因此在
int rowsDeleted=statement.executeUpdate()之后
您应该调用
connection.commit()PreparedStatement
或`连接之前

try (Connection connect = DriverManager.getConnection(host, username, password)) {
    try (PreparedStatement statement = connect.prepareStatement("DELETE FROM person WHERE Lastname = ?")) {

        statement.setString(1, lname);
        int rowsDeleted = statement.executeUpdate();
        if (!connect.getAutoCommit()) { 
            connect.commit();
        }
        // You could inspect the number of rows deleted
        System.out.println("worrrk");

    }
} catch (SQLException e) {
    e.printStackTrace();
}

更改您的
语句.setString(2,lname)
to
statement.setString(1,lname)

的第一个参数是parameterIndex。在您的例子中,SQL子句中只有一个参数,因此它应该是1。

有两个错误

  • PreparedStatement应该设置
    语句。setString(1,lname)
    ,因为查询中只有一个参数(即
  • 您应该调用语句。executeUpdate以便在
    语句之前执行查询。关闭
您可能误解了preparedStatement的工作方式,因此这里有一个小教程来提高您的技能

现在谈到

      // this is the working
    //PreparedStatement statement = connect.prepareStatement("DELETE FROM person WHERE Firstname = ?");
    //statement.setString(1, fname);
为什么此语句有效,它有效是因为您实际设置了正确的参数(即1),上述语句无效是因为您使用了fname尝试使用lname同样的方法也会有效


注意:PreparedStatement的setter方法
ps.setXXX(parameterNo,value)
此处parameterNo与后端表的列不对应,它是查询中存在的参数。

不应
statement.setString(2,lname)
be
statement.setString(1,lname)?你只有一个参数,所以…@takendark Shhh,你破坏了乐趣;)我只是很高兴我能偶尔发现这样的事情。这意味着我的眼睛还没有完全离开我。谢谢你的回答。我将statement.executeUpdate()放在statement.close()之前;运行它。但结果并没有改变change@watata抱歉,被其他事情分散了注意力,您可能还需要调用
连接#提交
,请参阅更新…@MadProgrammer我复制了您的代码进行尝试,但仍然无法工作。我在程序中观察到另一个行为。我在txnameField(JtextFied)上输入一个firstname,如果删除记录,firstname与数据库的第1列一起。但是使用LnameField不起作用。。。