无法使用CachedRowSet的插入行(Failed on insert row using Ca

2019-09-20 00:00发布

我使用对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

消息:无法插入行上

Answer 1:

我遇到了同样的问题,因为你,但我把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值

也许你可以从它那里得到一些东西。



Answer 2:

你需要调用rs.acceptChanges(); 代替rs.updateRow();

尝试更换rs.updateRow(); 有以下几点:

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


文章来源: Failed on insert row using CachedRowSet