Oracle上的JDBC更新提交失败
我有JDBC Dao对象,并使用PreparedStatements更新数据库中表中的一行 我还有其他方法,比如选择和插入,它们都是成功的(插入-提交有效)。 但是更新并没有提交更改(根本不起作用)。而相同的UPDATE语句直接从Oracle SQLServer工作Oracle上的JDBC更新提交失败,oracle,jdbc,sql-update,Oracle,Jdbc,Sql Update,我有JDBC Dao对象,并使用PreparedStatements更新数据库中表中的一行 我还有其他方法,比如选择和插入,它们都是成功的(插入-提交有效)。 但是更新并没有提交更改(根本不起作用)。而相同的UPDATE语句直接从Oracle SQLServer工作 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.Result
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class StaffDAO {
private Connection conn;
public StaffDAO() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println("Oracle Driver not found");
System.exit(0);
}
try {
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@db01.xxxdev.com:1521:training",
"training", "training");
} catch (SQLException e) {
System.out.println("Driver manager failed");
}
}
public ResultSet getAllResultSet() {
String sql = "select * from ben_staff";
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
} catch (SQLException ex) {
ex.printStackTrace();
}
return rs;
}
public Staff viewEmployee(String id) throws Exception {
Staff st = new Staff();
String sql = "SELECT * from BEN_STAFF where BEN_STAFF.id =\'" + id
+ "\'";
// String psql = "SELECT * FROM BEN_STAFF WHERE ID = ?";
Statement statement = null;
// PreparedStatement pstatement = null;
try {
statement = conn.createStatement();
// pstatement = conn.prepareStatement(psql);
// pstatement.setString(1, id);
} catch (SQLException e) {
System.out.println("Create Statement failed");
System.exit(1);
}
ResultSet rs = null;
try {
rs = statement.executeQuery(sql);
// rs = pstatement.executeQuery();
while (rs.next()) {
st.setId(rs.getString("ID"));
st.setLastName(rs.getString("LASTNAME"));
st.setFirstName(rs.getString("FIRSTNAME"));
st.setMi(rs.getString("MI"));
st.setAddress(rs.getString("ADDRESS"));
st.setCity(rs.getString("CITY"));
st.setState(rs.getString("STATE"));
st.setTelephone(rs.getString("TELEPHONE"));
st.setEmail(rs.getString("EMAIL"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
statement.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return st;
}
public boolean insert(String id, String last, String first, String mi,
String address, String city, String state, String telephone,
String email) {
PreparedStatement pstmt = null;
String psql = "insert into ben_staff (id, lastname, firstname, mi, address, city, state, telephone, email)"
+ "values (?,?,?,?,?,?,?,?,?)";
try {
pstmt = conn.prepareStatement(psql);
// pstmt.setString(1,st.getId());
// pstmt.setString(2, st.getLastName());
// pstmt.setString(3, st.getFirstName());
pstmt.setString(1, id);
pstmt.setString(2, last);
pstmt.setString(3, first);
pstmt.setString(4, mi);
pstmt.setString(5, address);
pstmt.setString(6, city);
pstmt.setString(7, state);
pstmt.setString(8, telephone);
pstmt.setString(9, email);
pstmt.executeUpdate();
conn.commit();
} catch (SQLException ex) {
ex.printStackTrace();
return false;
} finally {
try {
pstmt.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
return true;
}
public boolean update(String id, String last, String first, String mi,
String address, String city, String state, String telephone,
String email) {
PreparedStatement pstmt = null;
String psql = "update ben_staff set lastname=?, firstname=?, mi=?, address=?, city=?, state=?,"
+ " telephone=?, email=? where id=?";
try {
pstmt = conn.prepareStatement(psql);
pstmt.setString(1, last);
pstmt.setString(2, first);
pstmt.setString(3, mi);
pstmt.setString(4, address);
pstmt.setString(5, city);
pstmt.setString(6, state);
pstmt.setString(7, telephone);
pstmt.setString(8, email);
pstmt.setString(9, id);
pstmt.executeUpdate();
conn.commit();
} catch (SQLException ex) {
ex.printStackTrace();
try{
conn.rollback();
} catch (SQLException exx){
System.out.println("Update Rollback Failed");
}
return false;
} finally {
try {
pstmt.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
return true;
}
public void close() {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
什么是
pstmt.executeUpdate()代码>返回?这将告诉您有多少行正在更新。差不多
int numRows = pstmt.executeUpdate();
System.out.println( "Update modified " + numRows + " rows." );
我猜您的更新实际上并没有修改任何行。这意味着传入的id
不正确。请记住,SQL Server中的字符串比较默认情况下不区分大小写,而Oracle中的字符串比较默认情况下区分大小写。是。该表达式返回0,尽管我检查了是否传递、设置了正确的变量以及所有内容。@mediocr3-好。因此,更新
正在提交。它只是不更新任何行。传入的id
值是什么?您确定表中存在具有该值(区分大小写)的行吗?我通过了正确的测试id。尽管如此,它(Update语句)仅从SQLDeveloper直接工作。代码运行为,在更新过程中不会对任何错误引发任何异常。它在executeUpdate期间仅返回0。。我想知道如何???@mediocr3-一个更新
x成功并且或多或少不更新任何行的谓词是错误的。该行不存在或对当前会话不可见。我发现我在id上使用了大小固定的字符。。我必须将字符填充到全长w。空间。虽然SELECT似乎在没有填充的情况下工作。所以我找到了原因。据我所知,您处于自动提交
,因此调用commit()
或rollback()
总是会导致异常。