1

を使用してCachedRowSetいます。しかし、insertRow()メソッドを呼び出すと、SQLException行の挿入に失敗しました。

これが私のコードです:

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

1 に答える 1

2

を呼び出すとinsertRow()、 の参照実装はCachedRowSet、必要な列がすべて入力されているかどうかをチェックし、そうでない場合は例外をスローします (ソースはGrepcodeCachedRowSet.insertRow()から、行番号は正確には一致しません)。

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

つまり、行を挿入するときは、NULL 可能でないすべての列に値を指定する必要があります (これには主キーが含まれます)。これを回避するには、次の 2 つの方法があるようです。

  • (ランダムな) 値の設定。これには、主キーが常に生成される必要があります (値が提供されている場合でも)。
  • 列を明示的にnullusingに設定しますupdateNull。を使用setNullしても機能しません。同じエラーが発生し、使用setObject(idx, null)するとNullPointerException

これらの変更を加えてコードを使用すると、実装が無効にならないため(コメントアウトされSQLExceptionているようです)、呼び出し時にエラーが発生しますが、明示的に呼び出します(これは in の場合は無効です)。で明示的に接続を提供するか、独自の実装を作成することを除いて、これは簡単に解決できないようです。acceptChangesautoCommitcommitautoCommitexecute

この種の問題は、実装が実際にほとんど使用されていないことを実際に示していると思いますRowSet(そうでなければ、実装はずっと前に洗い流されていたでしょう)。

ただし、これが必要な実際のコードであり、 の切断された特性を必要としない場合はCachedRowSet、更新可能な結果セットを使用するだけでよいことに注意してください。

于 2014-09-13T11:32:57.140 に答える