Ошибка при вставке строки с использованием 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

Сообщение: Ошибка при вставке строки


person Moe    schedule 21.07.2012    source источник


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

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

person Ellery Q.    schedule 30.08.2012

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

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

try{
   jrs.acceptChanges();
}catch(SyncProviderException spe){
  //Conflict handling code.
}
person Zhang Zhongyi    schedule 16.08.2012
comment
Спасибо @ZhangZhongyi, я попробовал ваш код, но ничего не изменилось. потому что проблема вызвана rs.insertRow(); . - person Moe; 19.08.2012
comment
попробуйте CachedRowSet jrs=RowSetProvider.newFactory().createCachedRowSet(). Это последнее различие между вашим кодом и моим, за исключением таблиц. - person Zhang Zhongyi; 20.08.2012
comment
хорошо, спасибо @ZhangZhongyi за попытку помочь. я ценю это - person Moe; 27.08.2012
comment
Опс, нажмите Enter по ошибке, в любом случае, это все еще не работает, но все в порядке, я сдаюсь :), и сейчас я использую JdbcRowSetImpl, и он отлично работает. Спасибо еще раз - person Moe; 27.08.2012