Oracle上的JDBC更新提交失败

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

我有JDBC Dao对象,并使用PreparedStatements更新数据库中表中的一行

我还有其他方法,比如选择和插入,它们都是成功的(插入-提交有效)。 但是更新并没有提交更改(根本不起作用)。而相同的UPDATE语句直接从Oracle SQLServer工作

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()
总是会导致异常。