2013-08-17 7 views
0

Я разрабатываю приложение, которое подключается к базе данных Oracle 11g, используя ojdbc6 в качестве драйвера JDBC. Я создал триггер и последовательность для таблицы, где мне нужно добавить значение, так что столбец идентификатора этой таблицы автоматически создается. Все отлично работает, когда я добавляю новую строку вручную в базу данных с помощью SQL Developper (моя последовательность и триггер для автоинкремента работают хорошо). Но когда речь идет о добавлении новых строк из моего приложения Java, я получаю следующее сообщение об ошибке:Автоинкремент в oracle11g и JDBC

java.sql.SQLRecoverableException: Внутренняя ошибка на oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers (OraclePre paredStatement.java : 3071) на oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow (Или aclePreparedStatement.java:2247) в oracle.jdbc.driver.OraclePreparedStatement.executeInternal (OraclePrep aredStatement.java:3444) в oracle.jdbc.driver .OraclePreparedStatement.executeUpdate (OraclePrepar edStatement.java:3530) в oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate (Oracl ePreparedStatementWrapper.java:1350)

Это мой Java-код:

String query = "INSERT INTO USER (ID, USERNAME, PASSWORD, FIRSTNAME, LASTNAME, EMAIL) VALUES (?, ?, ?, ?, ?, ?)"; 
     PreparedStatement preparedStatement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
     preparedStatement.setString(2, user.getUsername()); 
     preparedStatement.setString(3, user.getPassword()); 
     preparedStatement.setString(4, user.getFirstName()); 
     preparedStatement.setString(5, user.getFirstName()); 
     preparedStatement.setString(6, user.getEmail()); 

     preparedStatement.executeUpdate(); 

Я не добавлял код для моей последовательности и потому что я не думаю, что проблема возникла из базы данных, так как все отлично работает с sqldevelopper. Я также попытался использовать свою последовательность непосредственно, как:

String query = "INSERT INTO USER (ID, USERNAME, PASSWORD, FIRSTNAME, LASTNAME, EMAIL) VALUES (SEQUENCE.NEXTVAL, ?, ?, ?, ?, ?)"; 

Но это также не

Может кто-то помочь мне исправить это?

ответ

1

В запросе Предоставлять значение некоторые по умолчанию это

String query = "INSERT INTO USER (ID, USERNAME, PASSWORD, FIRSTNAME, LASTNAME, EMAIL) VALUES (?, ?, ?, ?, ?, ?)"; 
    PreparedStatement preparedStatement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
    preparedStatement.setInt(1, 0); // Providing default value as 0 
    preparedStatement.setString(2, user.getUsername()); 
    preparedStatement.setString(3, user.getPassword()); 
    preparedStatement.setString(4, user.getFirstName()); 
    preparedStatement.setString(5, user.getFirstName()); 
    preparedStatement.setString(6, user.getEmail()); 

    preparedStatement.executeUpdate(); 
+0

Спасибо! Он работает сейчас! –

0
String query = "INSERT INTO USER (ID, USERNAME, PASSWORD, FIRSTNAME, LASTNAME, EMAIL) VALUES (0, ?, ?, ?, ?, ?)"; 

Ваш триггер автоматического инкремента обновит 0 до следующего значения в последовательности.

2

Не отсылайте ID от клиента, пусть триггер обрабатывать ID:

String query = "INSERT INTO USER (USERNAME, PASSWORD, FIRSTNAME, LASTNAME, EMAIL)" 
    + " VALUES (?, ?, ?, ?, ?)"; 

PreparedStatement preparedStatement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
preparedStatement.setString(1, user.getUsername()); 
preparedStatement.setString(2, user.getPassword()); 
preparedStatement.setString(3, user.getFirstName()); 
preparedStatement.setString(4, user.getFirstName()); 
preparedStatement.setString(5, user.getEmail()); 

preparedStatement.executeUpdate(); 
+0

нормально, это тоже работает. Спасибо! –

Смежные вопросы