2012-07-21 3 views
2

Я использую CachedRowSetImpl, я могу получить данные из базы данных, НО я не могу вставить.Ошибка при вставке строки с использованием CachedRowSet

это код:

public class NewClass { 

    static final String DATABASE_URL = "jdbc:derby://localhost:1527/TaskDB;create=true"; 
    static final String USERNAME = "user"; 
    static final String PASSWORD = "user"; 

    public static void main (String [] agr) throws SQLException 
    { 
     CachedRowSetImpl rs = new CachedRowSetImpl(); 
     rs.setUrl(DATABASE_URL); 
     rs.setUsername(USERNAME); 
     rs.setPassword(PASSWORD); 

     rs.setCommand("SELECT * FROM TASKTABLE"); 
     rs.execute(); 

     rs.moveToInsertRow(); 
     rs.updateString("Column_Name","DataString"); 

     rs.insertRow(); 
     rs.moveToCurrentRow(); 
     rs.updateRow(); 
    } 

} 

это бросить исключение:

Исключение в нити "основной" java.sql.SQLException: Ошибка при вставке строки в com.sun.rowset .CachedRowSetImpl.insertRow (CachedRowSetImpl.java:5462) в NewClass.main (NewClass.java:32)

Я попытался JdbcRo wSetImpl Вместо CachedRowSetImpl, и это работает прекрасный

UPDATE: Я использовал этот код, чтобы поймать более подробную информацию об исключениях:

catch(SQLException e) { 
    do { 
     System.out.println("SQLState:" + e.getSQLState()); 
     System.out.println("Error Code:" + e.getErrorCode()); 
     System.out.println("Message:" + e.getMessage()); 
     Throwable t = e.getCause(); 
     while(t != null) { 
      System.out.println("Cause:" + t); 
      t = t.getCause(); 
     } 
     e = e.getNextException(); 
    } while (e != null); 
} 

, а выход:

SQLState: нулевой

Код ошибки: 0

Сообщение: Не удалось установить строку

+0

Вам нужно изучить все исключение. Инструкции см. В следующих инструкциях: http://wiki.apache.org/db-derby/UnwindExceptionChain. После того, как вы это сделали, обновите свой вопрос. –

+0

Спасибо @BryanPendleton :), я обновил свой вопрос, но он выглядит больше нет. –

+0

Попробуйте сделать e.printStackTrace() внутри этого catch() block –

ответ

0

Вам необходимо вызвать rs.acceptChanges(); вместо rs.updateRow();

попытайтесь заменить rs.updateRow(); со следующим:

try{ 
    jrs.acceptChanges(); 
}catch(SyncProviderException spe){ 
    //Conflict handling code. 
} 
+0

Спасибо @ZhangZhongyi, я попробовал ваш код, но ничего не изменилось. Потому что проблема вызвана «rs.insertRow();». –

+0

попробуйте CachedRowSet jrs = RowSetProvider.newFactory(). CreateCachedRowSet(). Это последнее различие между вашим кодом и моим, кроме таблиц. –

+0

ну, спасибо @ZhangZhongyi за помощь. Я ценю, что –

2

я встретил такой же вопрос, как вы, но я поставил acceptChanges(cnnt) в конце, когда исключение выбрасывается, как указано API.

....

cachedSet.moveToInsertRow(); 
cachedSet.updateInt(1,12); 
cachedSet.updateString(2,"Joe"); 
cachedSet.updateString(3,"abcde"); 
cachedSet.insertRow(); 
cachedSet.moveToCurrentRow(); 
cachedSet.acceptChanges(cnnt); 

.....

Если я побежал без последнего row(acceptChanges(cnnt)), никаких исключений не выбрасываются, но БД не обновляются.

Если я запустил его с последним, будет исключение, то же самое, что и вы. я проверил и получил документ из acceptChanges() от API:

SQLException - if the cursor is on the insert row 

Я проверил документ insertRow():

SQLException - если ошибка доступа к базе данных; результирующий набор concurrency - это CONCUR_READ_ONLY, этот метод вызывается в закрытом результирующем наборе, если этот метод вызывается, когда курсор не находится в строке вставки вставки , или если не все столбцы с нулевым значением в строке вставки имеют было присвоено ненулевое значение

Возможно, вы можете получить что-то от него.

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

  • Нет связанных вопросов^_^