Java sql Delete上没有错误,但不';t删除记录(除非我在Where子句中使用Firstname)
我创建了一个方法来删除数据库中的人名。使用firstname(where子句),sql命令正在工作并成功删除记录。但是,在sql命令中使用“Lastname”可以工作,但不会删除记录。我输入了lastname,在它是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 = "
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)
tostatement.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)
bestatement.setString(1,lname)代码>?你只有一个参数,所以…@takendark Shhh,你破坏了乐趣;)我只是很高兴我能偶尔发现这样的事情。这意味着我的眼睛还没有完全离开我。谢谢你的回答。我将statement.executeUpdate()放在statement.close()之前;运行它。但结果并没有改变change@watata抱歉,被其他事情分散了注意力,您可能还需要调用连接#提交
,请参阅更新…@MadProgrammer我复制了您的代码进行尝试,但仍然无法工作。我在程序中观察到另一个行为。我在txnameField(JtextFied)上输入一个firstname,如果删除记录,firstname与数据库的第1列一起。但是使用LnameField不起作用。。。