OracleCachedRowSet обновляет данные в памяти без записи в базу данных - PullRequest
0 голосов
/ 27 марта 2012

Я использую реализацию oracle jdbc cachedrowset, чтобы выбрать несколько строк, возвращаемых из запроса. Затем я обновляю некоторые данные, используя cachedrowset.updateInt () или другие методы обновления. Сначала я возвращаю курсор, используя cachedrowset.beforeFirst (), а затем снова перебираю набор строк для печати данных.

Дело в том, что данные, которые я получаю, используя getInt (), снова являются исходными данными. Я хочу получить данные, которые будут заменены исходными. Я не собираюсь вносить изменения в БД.

Я подумал, что могу использовать объект 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 28 марта 2012

Решением является вызов cachedRowSet.updateRow () после использования соответствующего метода обновления (updateInt (), updateString () и т. Д.) Для внесения изменений, записанных в память.Я не использовал его раньше, потому что JavaDoc этого upateRow () говорит: «Обновляет базовую базу данных новым содержимым текущей строки этого объекта 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

        }
    }
0 голосов
/ 27 марта 2012

Пожалуйста, попробуйте изменить настройки OracleCachedRowSet только для чтения следующим образом.

oracleCachedRowSet.setReadOnly(false);

Этот метод определен в javax.sql.RowSet , который реализуют классы набора строк.

РЕДАКТИРОВАТЬ: Исходя из кода, который вы разместили,

Вы правы, наблюдая, что вы делаете передачу по значению.Фактически, в java он всегда передается по значению и никогда не передается по ссылке.

Решение:

Сейчас ваша функция возвращает void, измените это, чтобы вернуть обновленный cachedRowSet.Ваше определение функции будет выглядеть как

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