【问题标题】:Failed on insert row using CachedRowSet使用 CachedRowSet 插入行失败
【发布时间】:2012-07-21 21:35:58
【问题描述】:

我正在使用 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:null

错误代码:0

消息:插入行失败

【问题讨论】:

  • 您需要检查整个异常。请参阅以下说明以了​​解如何执行此操作:wiki.apache.org/db-derby/UnwindExceptionChain。完成此操作后,请使用完整的详细信息更新您的问题。
  • 谢谢@BryanPendleton :),我更新了我的问题,但看起来没有更多详细信息
  • 尝试在 catch() 块内执行 e.printStackTrace()

标签: java derby cachedrowset


【解决方案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)) 的情况下运行它,则不会抛出异常,但不会更新数据库。

如果我使用最后一个运行它,则会出现与您相同的异常。 我查了一下,从 API 中得到了acceptChanges() 的文档:

SQLException - if the cursor is on the insert row 

我查看了insertRow()的文档:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢@ZhangZhongyi,我试过你的代码,但没有任何改变。因为由“ rs.insertRow(); ”引起的问题。
    • 尝试 CachedRowSet jrs=RowSetProvider.newFactory().createCachedRowSet()。这是你的代码和我的代码之间的最后一个区别,除了表格。
    • 好吧,感谢@ZhangZhongyi 的帮助。我很感激
    • Ops 误按 Enter 了,反正还是不行,不过我放弃也没关系 :),我现在用的是 JdbcRowSetImpl ,效果很好。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2013-01-29
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多