0

oracle jdbc cachedrowset実装を使用して、クエリから返される複数の行を選択しています。次に、cachedrowset.updateInt()または他の更新メソッドを使用していくつかのデータを更新します。最初にcachedrowset.beforeFirst()を使用してカーソルを戻し、次に行セットを再度トラバースしてデータを印刷します。

getInt()を使用して取得したデータは元のデータです。元のデータに置き換えられたデータを取得したいのですが。dbに変更をコミットするつもりはありません。

データ操作と表示のためだけに、データベース上のデータを変更せずに、Rowsetオブジェクトをデータラッパーとして使用できると思いました。元の日付の代わりに更新された日付を取得する方法はありますか?自分のデータラッパーオブジェクトをコーディングしたくありませんでした

編集:これは私がデータを取得する方法であり、以下は私がそれを更新する方法です

public OracleCachedRowSet getCachedRowset( String query, Connection con)
        throws DTSException {
    try {
        OracleCachedRowSet cachedRowSet = new OracleCachedRowSet();
        cachedRowSet.setReadOnly(false);
        cachedRowSet.setCommand(query);
        cachedRowSet.execute(con);
        return cachedRowSet;
    } catch (SQLException sqle) {
        throw new DTSException("Error fetching data! :" + sqle.getMessage(), sqle);
    }
}

更新コード:

public void updateRowSetData(CachedRowSet cachedRowSet, int columnIndex, int columnType,    Object data)
        throws SQLException {

    switch (columnType) {
    case Types.NUMERIC:
    case Types.DECIMAL:
        cachedRowSet.updateBigDecimal(columnIndex, (BigDecimal) data);
        return;
    case Types.CHAR:
    case Types.VARCHAR:
    case Types.LONGNVARCHAR:
        cachedRowSet.updateString(columnIndex, data == null ? null : data.toString());
        return;
    case Types.INTEGER:
        cachedRowSet.updateInt(columnIndex, (Integer) data);
        return;
    case Types.DATE:
        cachedRowSet.updateDate(columnIndex, (Date) data);
        return;
    case Types.TIMESTAMP:
        cachedRowSet.updateTimestamp(columnIndex, (Timestamp) data);
        return;
    case Types.TIME:
        cachedRowSet.updateTime(columnIndex, (Time) data);
        return;
    case Types.BIGINT:
        cachedRowSet.updateLong(columnIndex, data == null ? null : Long.parseLong(data.toString()));
        return;
    case Types.DOUBLE:
    case Types.FLOAT:
        cachedRowSet.updateDouble(columnIndex, (Double) data);
        return;
    case Types.SMALLINT:
        cachedRowSet.updateShort(columnIndex, data == null ? null : Short.parseShort(data.toString()));
        return;
    case Types.TINYINT:
        cachedRowSet.updateByte(columnIndex, Byte.parseByte(data == null ? null : data.toString()));
        return;
    case Types.BINARY:
    case Types.VARBINARY:
        cachedRowSet.updateBytes(columnIndex, (byte[]) data);
        return;
    case Types.CLOB:
        if (data != null) {
            cachedRowSet.updateClob(columnIndex, ((Clob) data).getCharacterStream());
        } else {
            cachedRowSet.updateClob(columnIndex, (Clob) data);
        }
        return;
    case Types.ARRAY:
        cachedRowSet.updateArray(columnIndex, (Array) data);
        return;
    case Types.BLOB:
        if (data != null) {
            cachedRowSet.updateBlob(columnIndex, data == null ? null : ((Blob) data).getBinaryStream());
        } else {
            cachedRowSet.updateBlob(columnIndex, (Blob) data);
        }
        return;
    case Types.REAL:
        cachedRowSet.updateFloat(columnIndex, (Float) data);
        return;
    case Types.BIT:
    case Types.BOOLEAN:
        cachedRowSet.updateBoolean(columnIndex, (Boolean) data);
        return;
    case Types.REF:
        cachedRowSet.updateRef(columnIndex, (Ref) data);
        return;
    case Types.LONGVARBINARY:
        cachedRowSet.updateBinaryStream(columnIndex, (InputStream) data);
        return;
    default:
        cachedRowSet.updateObject(columnIndex, data);
        return;
    }
}
4

2 に答える 2

0

解決策は、適切な更新メソッド(updateInt()、updateString()など)を使用して変更をメモリに書き込んだ後、cachedRowSet.updateRow()を呼び出すことです。このupateRow()のJavaDocは、「このResultSetオブジェクトの現在の行の新しいコンテンツで基になるデータベースを更新する」と言っているため、以前は使用していませんでした。

それだけが起こることではありません。updateRow()は、基になるデータベースではなく、メモリ上のデータを更新します。リンクのドキュメントで解決策を見つけました:http ://www.scribd.com/doc/68052701/8/Setting-Up-a-CachedRowSet-Object

したがって、私が行ったことは、データを更新した後にupdateRowを呼び出すことでした。

    while (cachedRowSet.next()) {
        for (int i = 0; i < columnCount; i++) {

                dataHandler.updateRowSetData(cachedRowSet, i + 1, columnTypes[i], getUpdatedData());
                cachedRowSet.updateRow(); //Adding this line solves the problem. Otherwise changes are not made

        }
    }
于 2012-03-28T08:02:35.100 に答える
0

OracleCachedRowSetの読み取り専用設定を次のように変更してみてください。

oracleCachedRowSet.setReadOnly(false);

このメソッドは、行セットクラスが実装するjavax.sql.RowSetで定義されています。

編集:あなたが投稿したコードに基づいて、

あなたは自分が値渡しをしているのを観察しているのは正しいです。実際、Javaでは、常に値を渡し、参照を渡すことはありません。

解決:

現在、関数はvoidを返しています。これを変更して、更新されたを返しcachedRowSetます。関数定義は次のようになります

public CachedRowSet updateRowSetData(CachedRowSet cachedRowSet, int columnIndex, int columnType,    Object data)
        throws SQLException
于 2012-03-27T09:34:16.863 に答える