Failed on insert row using CachedRowSet

2019-07-14 02:20发布

问题:

I am using CachedRowSetImpl , I can get data from Database , BUT I can not insert .

this is the Code :

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();
    }

}

it throw the Exception :

Exception in thread "main" java.sql.SQLException: Failed on insert row at com.sun.rowset.CachedRowSetImpl.insertRow(CachedRowSetImpl.java:5462) at NewClass.main(NewClass.java:32)

I have tried JdbcRowSetImpl Instead of CachedRowSetImpl , and it's work fine

UPDATE : I used this code to catch more Details about the Exceptions :

    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);
}

and the Output is :

SQLState:null

Error Code:0

Message:Failed on insert row

回答1:

I met the same issue as you , but I put acceptChanges(cnnt) at the end where the exception thrown out, as API stated.

....

cachedSet.moveToInsertRow();
cachedSet.updateInt(1,12);
cachedSet.updateString(2,"Joe");
cachedSet.updateString(3,"abcde");
cachedSet.insertRow();
cachedSet.moveToCurrentRow();
cachedSet.acceptChanges(cnnt);

.....

If I ran it without the last row(acceptChanges(cnnt)), no exceptions are thrown out,but the DB is not updated.

If I ran it with the last one, there will be an exception the same as that you got. I checked , and got the document of acceptChanges() from API:

SQLException - if the cursor is on the insert row 

I checked the document of insertRow():

SQLException - if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY, this method is called on a closed result set, if this method is called when the cursor is not on the insert row, or if not all of non-nullable columns in the insert row have been given a non-null value

Maybe you can get something from it.



回答2:

You need to call rs.acceptChanges(); instead of rs.updateRow();

try to replace rs.updateRow(); with the following:

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