ORALCE 数据库中 我用的 SEQUENCE 和触发器自增主键ID
 然后我通过JDBC插入数据 同时希望得到返回的自动生成的主键是什么
结果报错
Exception in thread "main" java.sql.SQLException: 无效的列类型: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.Accessor.unimpl(Accessor.java:358)
at oracle.jdbc.driver.Accessor.getInt(Accessor.java:468)
at oracle.jdbc.driver.OracleReturnResultSet.getInt(OracleReturnResultSet.java:265)
at dao.impl.EmpDAOImpl.save(EmpDAOImpl.java:47)
at dao.impl.EmpDAOImpl.main(EmpDAOImpl.java:65)-------------------------------------
 @Override
public int save(Emp emp)throws Exception {
// TODO Auto-generated method stub
Connection con =null;
con=DBUtil.getConnection();
PreparedStatement pstmt=null;
String sql = "insert into emp(name,salary,age) values(?,?,?)";
pstmt=con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1,emp.getName());
pstmt.setDouble(2,emp.getSalary());
pstmt.setInt(3, emp.getAge());
pstmt.executeUpdate();
ResultSet rs=null;
rs=pstmt.getGeneratedKeys();
int id=-1;
while(rs.next()){
System.out.println(rs.getInt(1));
}
return id;


}

解决方案 »

  1.   

    Oracle 可以自动生成主键?insert into emp(name,salary,age) values(?,?,?)哪一列是主键?
      

  2.   

    这个需要 JDBC 驱动程序支持,获得自动生成的列中值只有在支持 JDBC 3.0 规范的驱动程序才支持。给你一个代码参考吧:import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Timestamp;public class OracleTest {    public static void main(String[] args) {
            Connection con = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                con = OracleConnectionFactory.getConnection();
                DatabaseMetaData dmd = con.getMetaData();            System.out.println("database product name: " + dmd.getDatabaseProductName());
                System.out.println("database product version: " + dmd.getDatabaseProductVersion());
                System.out.println("supports generate keys? " + dmd.supportsGetGeneratedKeys());            String sql = "INSERT INTO t_mt_stat (id, mt_time, stat, stat_time) " +
                        "VALUES (s_mt_stat.nextval, ?, ?, ?)";            ps = con.prepareStatement(sql, new String[]{"ID"});  // 后面一个参数表示需要返回的列            ps.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
                ps.setString(2, "Y");
                ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
                ps.executeUpdate();            if(dmd.supportsGetGeneratedKeys()) {
                    rs = ps.getGeneratedKeys();
                    while(rs.next()) {
                        // 如果使用 rs.getInt("ID") 会报错,奇怪的 Oracle JDBC 驱动!
                        System.out.println("ID: " + rs.getInt(1));
                    }
                }        } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(rs, ps, con);
            }
        }
    }
      

  3.   

    主键是我用sequence和触发器生成的,我的程序编译不会出错,但是运行的时候出错,你具体说下,谢谢啦
      

  4.   

    谢谢,我把Statement.RETURN_GENERATED_KEYS改成 new String(){"id"} ok了 谢谢啦!