2012-07-21 38 views
2

我正在使用CachedRowSetImpl,我可以從數據庫中獲取數據,但我無法插入。使用CachedRowSet插入行失敗

這是代碼:

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)

我已經試過JdbcRo wSetImpl而是對CachedRowSetImpl的,它的做工精細

UPDATE:我用這個代碼來捕獲有關異常的更多詳細信息:

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

消息:插入行失敗

+0

您需要檢查整個異常。請參閱以下說明以了​​解如何執行此操作:http://wiki.apache.org/db-derby/UnwindExceptionChain。完成後請詳細更新您的問題。 – 2012-07-22 17:33:18

+0

謝謝@BryanPendleton :),我更新了我的問題,但它看起來沒有更多詳細信息 – 2012-07-22 21:19:47

+0

嘗試做e.printStackTrace()內catch()塊 – 2012-07-23 13:41:19

回答

0

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

嘗試替換rs.updateRow();有以下幾點:

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

謝謝@ZhangZhongyi,我試過你的代碼,但沒有任何改變。由「rs.insertRow();」引起的問題。 – 2012-08-19 01:34:26

+0

嘗試CachedRowSet jrs = RowSetProvider.newFactory()。createCachedRowSet()。這是你的代碼和我的代碼之間的最後一個區別,除了表格。 – 2012-08-20 07:12:23

+0

好,謝謝@張中義幫忙。我明白, – 2012-08-26 22:18:21

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)),沒有異常拋出,但不更新數據庫。

如果我將它與最後一個一起運行,將會出現與您得到的相同的異常。 我檢查,並從API得到了acceptChanges()文件:

SQLException - if the cursor is on the insert row 

我檢查的insertRow()文件:

SQLException - 如果發生數據庫訪問錯誤;結果集 併發性爲CONCUR_READ_ONLY,如果在遊標不在 插入行上時調用此方法,或者如果插入行 中的所有非空值列都不是全部,則在關閉的 結果集上調用此方法被賦予非空值

也許你可以從中得到一些東西。