2011-06-23 6 views

Respuesta

3
Connection connection = null; 
    PreparedStatement preparedStatement = null; 
    ResultSet generatedKeys = null; 

    try { 
     connection = m_Connection; 
     preparedStatement = (PreparedStatement) connection.prepareStatement(qString, Statement.RETURN_GENERATED_KEYS); 

     // ... 

     int affectedRows = preparedStatement.executeUpdate(); 
     if (affectedRows == 0) { 
      throw new SQLException("Creating user failed, no rows affected."); 
     } 

     generatedKeys = preparedStatement.getGeneratedKeys(); 
     int id = -1; 
     if (generatedKeys.next()) { 
      id = generatedKeys.getInt(1); 
      id = -1; 
     } else { 
      throw new SQLException("Creating user failed, no generated key obtained."); 
     } 
    } finally { 

    } 
19

Usted tendrá que utilizar el método executeUpdate() para ejecutar la instrucción INSERT, mientras que tendrá que utilizar el método executeQuery() para ejecutar la instrucción SELECT. Esto es debido a los requisitos impuestos por la especificación de JDBC en sus usos:

A partir de la documentación de la API Java para Statement.executeQuery():

ejecuta la sentencia de SQL, que devuelve un único objeto ResultSet .

Parámetros:

sql - una instrucción SQL para ser enviados a la base de datos, por lo general una declaración SQL estático SELECT

y de la documentación de la API Java para Statement.executeUpdate():

Ejecuta la instrucción SQL dada, que puede ser una instrucción INSERT, UPDATE o DELETE o una instrucción SQL que no devuelve nada, como una instrucción SQL DDL.

Parámetros:

SQL - SQL un lenguaje de manipulación de datos (DML), como INSERT, UPDATE o DELETE; o una instrucción SQL que no devuelve nada, como una instrucción DDL.

Su código (publicado aquí pseudo-código) debe aparecer como:

statement.executeUpdate("INSERT INTO Sessions(id_user) VALUES(1)"); // DML operation 
statement.executeQuery("SELECT LAST_INSERT_ID()"); // SELECT operation 

Y, por supuesto, la MySQL documentation demonstrates how to perform the same activity for AUTO_INCREMENT columns, que parece que es lo que necesita.

Si es necesario ejecutar los dos juntos en la misma transacción, mediante la presentación de las declaraciones en una cadena con un punto y coma separa como la siguiente:

statement.execute("INSERT INTO Sessions(id_user) VALUES(1); SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;"); 

entonces usted tendrá que utilizar el método execute() Tenga en cuenta que esto depende del soporte ofrecido por la base de datos y el controlador JDBC para las instrucciones de procesamiento por lotes en una única ejecución(). Esto es compatible con Sybase y MSSQL Server, pero no creo que sea compatible con MySQL.

+0

En MySQL, que puede hacer transacciones haciendo 'ejecutar ("iniciar la transacción") 'al principio y cuando todo está hecho' execute ("commit") 'para confirmar o' execute ('rollback') 'para cancelar. Esto anulará cualquier configuración 'autocommit' que pueda tener para la conexión. ** Solo para un motor que admite transacciones, por ejemplo, InnoDB ** – Johan

+0

@Johan, sí, eso es correcto. No estaba seguro de si eso era posible usando JDBC, donde uno puede usar 'Connection.setAutoCommit (false);' y por lo tanto lo omití. Además, el problema aparentemente estaba en el uso de 'executeQuery' y' executeUpdate'. –

7

puede ser que esté utilizando executeQuery() sino para manipular los datos que realmente necesita executeUpdate() en lugar de executeQuery()

+0

Resolvió mi problema muchas gracias !!!! – Darrell

Cuestiones relacionadas