2014-09-13 37 views
1

我正在使用CachedRowSet。但是當我調用insertRow()方法時,有一個SQLException未能插入行。CachedRowSet未能插入行

這裏是我的代碼:

static final String DATABASE_URL = "jdbc:mysql://localhost:3306/javapos"; 
static final String USERNAME = "root"; 
static final String PASSWORD = "sbc"; 

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 uom order by itemid"); 
    rs.execute(); 

    while(rs.next()){ 
     System.out.println(rs.getString("itemid") + " - " + rs.getString("uom")); 
    } 

    rs.moveToInsertRow(); 
    rs.updateString(2,"Sample code"); 
    rs.insertRow(); 
    rs.moveToCurrentRow(); 

    rs.acceptChanges(); 
} 
+0

請包括錯誤堆棧跟蹤。 – 2014-09-13 03:47:50

+0

異常在線程 「主要」 值java.sql.SQLException:無法在插入行 \t在com.sun.rowset.CachedRowSetImpl.insertRow(CachedRowSetImpl.java:5449) \t在purchases.NewClass.main(NewClass.java:39 ) Java結果:1 – ram 2014-09-13 03:51:56

+1

應該有比這更多的信息。 – 2014-09-13 04:08:00

回答

2

當你調用insertRow()CachedRowSet參考實現執行,如果已填充所有需要的列的檢查,否則它拋出一個異常(來源從Grepcode CachedRowSet.insertRow(),行號別「T完全匹配):

if (onInsertRow == false || 
     insertRow.isCompleteRow(RowSetMD) == false) { 
    throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.failedins").toString()); 
} 

的檢查是在InsertRow.isCompleteRow(RowSetMetaData)執行:

public boolean isCompleteRow(RowSetMetaData RowSetMD) throws SQLException { 
    for (int i = 0; i < cols; i++) { 
     if (colsInserted.get(i) == false && 
       RowSetMD.isNullable(i + 1) == ResultSetMetaData.columnNoNulls) { 
      return false; 
     } 
    } 
    return true; 
} 

換句話說,當插入一行時,必須爲所有不能爲空的列(包括主鍵)提供一個值。似乎有兩種方法解決此問題:

  • 設置(隨機)值。這確實要求始終生成主鍵(即使提供了值)。
  • 使用updateNull明確設置列爲null。使用setNull不起作用:它提供了同樣的錯誤,並在NullPointerException

使用setObject(idx, null)結果時使用的代碼與這些變化我打電話acceptChanges當作爲實現不會禁用autoCommit(它得到一個SQLException似乎是commented out),但它明確地呼籲commit(在autoCommit中時無效)。這似乎並不容易解決,除了可能在execute上明確提供連接,或創建您自己的實現。

我認爲這些問題實際上證明了實際使用的RowSet實現的程度(否則它們早就已經被刷新了)。

但請注意,如果這是您需要的實際代碼,並且不需要CachedRowSet的斷開連接特性,那麼您可以簡單地使用可更新的結果集。

+0

謝謝@Mark Rotteveel – ram 2014-09-15 01:34:17

+0

解決方案是在非自動提交模式下爲'acceptConnection()'提供一個連接,或者如此配置其連接或其數據源(如果這是您正在使用的)。我同意缺乏使用,我發現了其他幾個古怪和錯誤。似乎沒有人使用這一點。可惜真的,那裏有一些好主意。我將打開一個關於它的文檔錯誤報告。 – EJP 2015-09-11 22:14:54

+0

糟糕,那應該是'acceptChanges()。' – EJP 2016-04-11 06:05:41