2

我正在使用 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();
    }

}

它抛出异常:

线程“主”java.sql.SQLException 中的异常:在 NewClass.main(NewClass.java:32) 的 com.sun.rowset.CachedRowSetImpl.insertRow(CachedRowSetImpl.java:5462) 插入行失败

我试过 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);
}

输出是:

SQL 状态:空

错误代码:0

消息:插入行失败

4

2 回答 2

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,在关闭的结果集上调用此方法,如果在光标不在插入行上时调用此方法,或者如果插入行中的所有非可空列都没有被赋予非-空值

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

于 2012-08-30T15:43:23.437 回答
0

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

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

try{
   jrs.acceptChanges();
}catch(SyncProviderException spe){
  //Conflict handling code.
}
于 2012-08-16T00:38:27.957 回答