Devolver la id de una inserción

Laura
17 de Marzo del 2006
Hola:
Tengo un problema en mi programa del cual no puedo salir.
El problema es que tengo un metodo en mi dao llamado create, el cual inserta los datos de una persona y quiero que en otro jsp se vea los datos que he insertado.
El caso es que mi método es este:
public BaseDTO create(BaseDTO dto) throws DAOException {
try {
Connection conexion = ds.getConnection();
String sql = "INSERT INTO personas (nombre, apellido1, apellido2, Direccion, Población, Provincia, Telefono, Fnacimiento, CodPostal, DNI) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

PreparedStatement ps = conexion.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);

ps.setString(1, ((PersonaDTO)dto).getNombre());
ps.setString(2, ((PersonaDTO)dto).getApellido1());
ps.setString(3, ((PersonaDTO)dto).getApellido2());
ps.setString(4,((PersonaDTO)dto).getDireccion());
ps.setString(5,((PersonaDTO)dto).getPoblacion());
ps.setString(6,((PersonaDTO)dto).getProvincia());
ps.setString(7,((PersonaDTO)dto).getTelefono());
ps.setString(8,((PersonaDTO)dto).getFnacimiento());
ps.setString(9,((PersonaDTO)dto).getCodPostal());
ps.setString(10,((PersonaDTO)dto).getDNI());
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
int generatedKeys = rs.getInt(1);
dto = findByPrimaryKey(generatedKeys);

} catch (SQLException e) {
e.printStackTrace();
throw new DAOException(e.getMessage());
}
return dto;
}

Y cuando depuro el codigo me dice que generated keys es null. Yo no se ya que hacer.
Saludos

Diana
17 de Marzo del 2006
Saludos...
Bueno lo que yo generalmente hago es hacer el excuteUpdate en el resulset normalmente asi:
int i = ps.excuteUpdate
esto te devuel ve un entero que corresponde al numero de columnas afectadas en la tabla y luego para recuperar mi id de la insersion llamo un metodo que haga lo siguiente:

public String obtenerIdEvento() throws Throwable
{
ResultSet resultSet = null;
PreparedStatement preparedStatement = null;
Connection connection = null;
String stMaxId = "";
String stSql = "";
try
{
connection = this.getConnection();

stSql = " select @@IDENTITY MAXIMOID ";

preparedStatement = connection.prepareStatement(stSql);
resultSet = preparedStatement.executeQuery();
if (resultSet.next())
{

return resultSet.getString("MAXIMOID");

}

} catch (Throwable e)
{
e.printStackTrace();
throw e;
} finally
{
this.closeResultSet(resultSet);
this.closePreparedStatement(preparedStatement);
}
return stMaxId;
}

esta sentencia siempre devuelve el ultimo id insertado en una tabla . Te aclaro que esto lo uso para bases de datos MysQl no se que motor estaras utilizando tu.

Espero que te sirva el codigo

Saludos

Diana
17 de Marzo del 2006
Saludos...
Bueno lo que yo generalmente hago es hacer el excuteUpdate en el resulset normalmente asi:
int i = ps.excuteUpdate
esto te devuel ve un entero que corresponde al numero de columnas afectadas en la tabla y luego para recuperar mi id de la insersion llamo un metodo que haga lo siguiente:

public String obtenerIdEvento() throws Throwable
{
ResultSet resultSet = null;
PreparedStatement preparedStatement = null;
Connection connection = null;
String stMaxId = "";
String stSql = "";
try
{
connection = this.getConnection();

stSql = " select @@IDENTITY MAXIMOID ";

preparedStatement = connection.prepareStatement(stSql);
resultSet = preparedStatement.executeQuery();
if (resultSet.next())
{

return resultSet.getString("MAXIMOID");

}

} catch (Throwable e)
{
e.printStackTrace();
throw e;
} finally
{
this.closeResultSet(resultSet);
this.closePreparedStatement(preparedStatement);
}
return stMaxId;
}

esta sentencia siempre devuelve el ultimo id insertado en una tabla . Te aclaro que esto lo uso para bases de datos MysQl no se que motor estaras utilizando tu.

Espero que te sirva el codigo

Saludos