Java 为什么错误代码仍然是con.commit()
我已将数据库中的Java 为什么错误代码仍然是con.commit(),java,jdbc,Java,Jdbc,我已将数据库中的stdImage设置为NOTNULL,当我不插入图像时,它会抛出一个错误,但仍然会执行con.commit()计算和数据而不是rollback(),保存到没有图像的数据库。有人能解决此代码中的逻辑错误吗。实际上,rollback()不起作用。我会很感激的 public void stdSave(String stdID, String stdName, String fName, String sSec, String contactNo, Date bdate, String
stdImage
设置为NOTNULL,当我不插入图像时,它会抛出一个错误,但仍然会执行con.commit()计算和数据而不是rollback(),保存到没有图像的数据库。有人能解决此代码中的逻辑错误吗。实际上,rollback()不起作用。我会很感激的
public void stdSave(String stdID, String stdName, String fName, String sSec, String contactNo, Date bdate, String address, byte[] image) throws RemoteException, SQLException {
String stdQuery = "INSERT INTO dbo.StudentTable (stID, stName, stFName, classSection,"
+ "contact, date, pAddress) VALUES (?, ?, ?, ?, ?, ?, ?)";
String imgQuery = "INSERT INTO dbo.StdImage (stdID, stdImage) VALUES (?, ?)";
Savepoint save = null;
try {
try(PreparedStatement stmt = con.prepareStatement(stdQuery);
PreparedStatement stmt1 = con.prepareStatement(imgQuery)) {
con.setAutoCommit(false);
save = con.setSavepoint();
stmt.setString(1, stdID);
stmt.setString(2, stdName);
stmt.setString(3, fName);
stmt.setString(4, sSec);
stmt.setString(5, contactNo);
stmt.setDate(6, bdate);
stmt.setString(7, address);
stmt.execute();
stmt1.setString(1, stdID);
stmt1.setBytes(2, image);
stmt1.execute();
}
}
catch(Exception e) {
try {
con.rollback(save);
}
catch (Exception e1) {
JOptionPane.showConfirmDialog(null, "Cannot add the student to database " + e);
}
}
con.commit();
}
您正在调用
con.commit()代码>在try-catch块之后,由于捕获了所有异常,因此始终调用commit
您可能应该在try块内移动commit
:
...
con.commit();
}
catch(Exception e) {
try {
con.rollback(save);
}
catch (Exception e1) {
JOptionPane.showConfirmDialog(null, "Cannot add the student to database " + e);
}
}
永远不要在catch块中执行con.commit()
,这可能会导致意外提交。将con.commit()
移动到您的try块。
接下来,请查看您正在回滚到一个保存点,但保存点为空。它没有初始化。
con.回滚(保存)代码>已完成,但此处save=null
要么简单地执行con.rollback()
要么初始化保存点,然后回滚到它。我这样做了,但仍然在为空映像引发异常之后,我无法将stdImage添加到数据库中,我不明白为什么。您可以看到我已将autocommit()设置为false,但still@user8297824即使发生异常,也可以调用con.commit()
。不应该。我已将con.commit()放在try块中,但在我尝试使用null image保存数据,然后尝试使用image保存数据后,它不起作用,在表中,它在第二次尝试时未在中保存图像database@user8297824您的意思是要从只插入StudentTable行而不插入相应StdImage行的情况中恢复吗?假设stID是这些表的主键,则不能在StudentTable中插入已经存在的stID。您必须检查该表中是否已经存在stID(使用SELECT语句),并且只有在不存在的情况下,调用INSERT.yes这就是我在StudentTable中插入数据时所说的,没有stdImage它给我一个空的图像异常,然后我将图像添加到同一个表中。它没有给出任何错误,主键已经使用,但没有将图像添加到stdImage表中,所以如何从stdImage的空异常中恢复并将stdImage插入到stdImage表