2011-06-23 6 views

Odpowiedz

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

trzeba będzie użyć metody executeUpdate(), aby wykonać INSERT, gdy trzeba użyć metody executeQuery(), aby wykonać SELECT. Wynika to z wymagań nałożonych przez specyfikację JDBC na ich zwyczajów:

Z dokumentacji API Java dla Statement.executeQuery():

Wykonuje daną instrukcję SQL, która zwraca jedną ResultSet obiekt.

Parametry:

SQL - instrukcja SQL do wysłania do bazy danych, zazwyczaj statyczny SQL SELECT

iz dokumentacji API Java dla Statement.executeUpdate():

Wykonuje daną instrukcję SQL, która może być instrukcją INSERT, UPDATE lub DELETE lub instrukcją SQL, która niczego nie zwraca, taka jak instrukcja SQL DDL.

Parametry:

sql - SQL Data Manipulation Language (DML) oświadczenie, takich jak INSERT, UPDATE lub DELETE; lub instrukcja SQL, która nie zwraca niczego, takiego jak instrukcja DDL.

Twój kod (pseudo-kod zamieszczone tutaj) powinien pojawić się jako:

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

I oczywiście MySQL documentation demonstrates how to perform the same activity for AUTO_INCREMENT columns, który jest podobno to, czego potrzebujesz.

Jeśli trzeba wykonać oba razem w tej samej transakcji, poprzez złożenie oświadczenia w jeden ciąg z średnikiem oddzielając je jak następuje:

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

wtedy musisz użyć metoda execute(). Zauważ, że zależy to od wsparcia oferowanego przez Bazę Danych i sterownik JDBC dla grupowania instrukcji w jednym wykonaniu(). Jest to obsługiwane w Sybase i MSSQL Server, ale nie sądzę, że jest obsługiwane w MySQL.

+0

w MySQL, można zrobić transakcji wykonując 'execute ("start transakcji") 'na początku i kiedy wszystko jest zrobione' wykonaj ("zatwierdz") 'do zatwierdzenia lub' wykonaj ("wycofanie") ', aby anulować. To zastąpi wszelkie ustawienia "autocommit", które możesz mieć dla połączenia. ** Tylko dla silnika obsługującego transakcje, np. InnoDB ** – Johan

+0

@Johan, tak to prawda. Nie byłem pewien, czy było to możliwe przy użyciu JDBC, gdzie można użyć 'Connection.setAutoCommit (false) ;, a więc pominięto to. Problem dotyczył także użycia 'executeQuery' i' executeUpdate'. –

7

może używasz executeQuery(), ale do manipulowania danymi faktycznie potrzeba executeUpdate() zamiast executeQuery()

+0

Rozwiązałem mój numer dziękuję bardzo !!!! – Darrell

Powiązane problemy