2013-08-17 30 views
0

我正在開發一個連接到Oracle 11g數據庫的應用程序,使用ojdbc6作爲JDBC驅動程序。我爲需要添加值的表創建了一個觸發器和一個序列,以便該表的ID列自動增量。當我使用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

確定,這也適用。謝謝! –