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