2014-09-13 2 views
1

CachedRowSet을 사용하고 있습니다. 그러나 insertRow() 메서드를 호출 할 때 SQLException 행을 삽입하지 못했습니다. , 줄 번호 돈을 당신이 insertRow() 호출하면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

오류 스택 추적을 포함하십시오. 스레드 "주요"java.sql.SQLException의에서 –

+0

예외 : 삽입 행 com.sun.rowset.CachedRowSetImpl.insertRow에서 \t (CachedRowSetImpl.java:5449) purchases.NewClass.main에서 \t (NewClass.java:39에 실패) Java 결과 : 1 – ram

+1

그 이상의 정보가 있어야합니다. –

답변

2

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

즉, 행을 삽입 할 때 이 nullable이 아닌 모든 열 (기본 키 포함)에 값을 제공해야합니다. 이 문제를 해결하는 두 가지 방법이 있습니다.

  • (임의의) 값 설정. 이 경우 값이 제공된 경우에도 항상 기본 키가 생성되어야합니다.
  • updateNull을 사용하여 열을 null으로 명시 적으로 설정하십시오. 작동하지 않는 setNull 사용 : 구현 (그것을 autoCommit을 해제하지 않는 한 acceptChanges를 호출 할 때이 같은 오류를 제공하고, 이러한 변화에 코드를 사용할 때 NullPointerException

setObject(idx, null) 결과를 사용하여 나는 SQLExceptioncommented out 인 것으로 보이지만) commit (명시 적으로 autoCommit에있는 경우 유효하지 않음)을 호출합니다. execute에 명시 적으로 연결을 제공하거나 사용자 고유의 구현을 만드는 경우를 제외하고는 해결하기가 쉽지 않은 것 같습니다.

이러한 종류의 문제가 실제적으로 실제로 구현 된 RowSet 구현이 얼마나 적은지를 보여줍니다 (그렇지 않으면 이미 오래 전에 플러시 된 것입니다).

그러나 이것이 실제 필요한 코드이고 CachedRowSet의 연결이 끊긴 특성을 필요로하지 않는다면 단순히 업데이트 가능한 결과 집합을 사용할 수 있습니다.

+0

thanks @Mark Rotteveel – ram

+0

해결책은 비 자동 커밋 모드에서'acceptConnection()'에 연결을 제공하거나 사용중인 경우 해당 연결이나 데이터 소스를 구성하는 것입니다. 나는 사용의 부족에 대해 동의하고, 몇 가지 다른 이상한 점과 버그를 발견했다. 아무도 이것을 전혀 사용하지 않는 것 같습니다. 동정심, 거기에 좋은 아이디어가 있습니다. 문서 버그 보고서를 열어 보겠습니다. – EJP

+0

'acceptChanges().'여야합니다. – EJP