我正在使用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;
}
}
答案 0 :(得分:0)
请尝试更改OracleCachedRowSet的只读设置,如下所示。
oracleCachedRowSet.setReadOnly(false);
此方法在javax.sql.RowSet中定义,行集类实现。
编辑:根据您发布的代码,
你正确地观察到你正在按价值进行传球。事实上,在java中,它总是按值传递,永远不会通过引用传递。
<强>解决方案:强>
现在你的函数返回void,更改它以返回更新的cachedRowSet
。您的函数定义将类似于
public CachedRowSet updateRowSetData(CachedRowSet cachedRowSet, int columnIndex, int columnType, Object data)
throws SQLException
答案 1 :(得分: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
}
}