Ошибка при вставке строки с использованием CachedRowSet

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

это код:

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();
    }

}

Это исключение:

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

Я пробовал JdbcRowSetImpl вместо CachedRowSetImpl, и он отлично работает

ОБНОВЛЕНИЕ: я использовал этот код, чтобы узнать больше об Исключениях:

    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

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

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 - если ошибка доступа к базе данных происходит; параллелизм результирующего набора - CONCUR_READ_ONLY, этот метод вызывается для закрытого результирующего набора, если этот метод вызывается, когда курсор находится не в строке вставки, или если не для всех необнуляемых столбцов в строке вставки был задан нулевое значение

Может быть, вы можете получить что-то из этого.

Вам нужно вызвать rs.acceptChanges(); вместо rs.updateRow();

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

try{
   jrs.acceptChanges();
}catch(SyncProviderException spe){
  //Conflict handling code.
}
Другие вопросы по тегам