使用CachedRowSet在插入行上失败

时间:2012-07-21 21:35:58

标签: java derby 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中的异常:插入行失败         at 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 个答案:

答案 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))的情况下运行它,则不会抛出任何异常,但DB不会更新。

如果我用最后一个运行它,会有一个与你得到的异常相同的异常。 我查了一下,从API获得了acceptChanges()的文档:

SQLException - if the cursor is on the insert row 

我查看了insertRow()的文件:

  

SQLException - 如果发生数据库访问错误;结果集   并发性是CONCUR_READ_ONLY,此方法在关闭时调用   结果集,如果在光标不在时调用此方法   插入行,或者如果不是插入行中的所有非可空列   已被赋予非空值

也许你可以从中得到一些东西。

答案 1 :(得分:0)

你需要调用rs.acceptChanges();而不是rs.updateRow();

尝试替换rs.updateRow();以下内容:

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