结果集不可更新

时间:2021-09-12 12:05:04
public class TestUpdatableResultSet {
public static void main(String[] args){
Connection conn = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
conn = DriverManager.getConnection(url,"scott","scott");
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("select * from users");
// 更新结果集
while(rs.next()){
//showOneRow(rs);
}
//更新和删除记录
rs.beforeFirst();
while(rs.next()){
//System.out.println(rs.getString(1)+" "+rs.getString(2));
int id = rs.getInt("id");
if(id==5){
//String name = rs.getString("name");
//System.out.println(ResultSet.CONCUR_UPDATABLE);
rs.updateString("name", "guang");//这句出错,
rs.updateRow();//紧跟调用
}else if(id == 11){
rs.deleteRow();
}
}
//插入新记录
/*rs.moveToInsertRow();
rs.updateInt("id", 12);
rs.insertRow();
rs.close();*/

//结果集更新后后台数据库中数据
System.out.println("----------------------------");
rs = stmt.executeQuery("select * from users");
while(rs.next()){
showOneRow(rs);
}
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(conn!=null){
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}

public static void showOneRow(ResultSet rs) throws SQLException{
System.out.println("第"+rs.getRow()+"行");
System.out.print(rs.getInt("id"));
System.out.println("\t"+rs.getString("name"));
}
}

在上面那句updateString()出错,我用的是eclipse 3.5.1,ojdbc14_g.jar
DatabaseMetaData支持ResultSet.CONCUR_UPDATABLE,也支持ResultSet.TYPE_SCROLL_SENSITIVE
结果报错了:对只读结果集的无效操作: updateString
为什么会出现这样的错误呢?

11 个解决方案

#1


users表结构很简单:
ID   NUMBER(2)                              
NAME VARCHAR2(20)  

#2


不要用select *
用select id ,name

#3


代码写得不错……顶一个……

#4


http://www.jingningedu.com/manage/java_api/java/sql/ResultSet.html#updateString%28int,%20java.lang.String%29

我随便搜的document
去看updateString的传入参数
void updateString(int columnIndex,
                  String x)
                  throws SQLException

#5


to nihuajie05 updateString(String labelName,String x) 这个方法也有

多谢yaoweijq,再问一下:为什么不能用*呢?

#6


不好意思,我没看清楚。

#7


错误贴一下看看

#8


没有错误,oracle的驱动就是这样,如果用*就不能auto mapping,只能select columnName才能更新结果集。

还有同样的语句用Statement和PreparedStatement性能能差几百倍,执行计划竟然不一样。没有理由,只能说oracle很态 ,更变态的是有时可滚动结果集就能乱码, 不滚动就不乱。总之没有道理,什么事都可能发生。

#9


楼上吐槽有力

#10


挖槽 顶!

#11


*不能mapping,要字段名列出来。建议用class12.jar试试看。
另外,楼主这种方法不推荐,要修改数据库数据,请直接调数据库的update,否则你这里不同步,很可能脏读脏写!

#1


users表结构很简单:
ID   NUMBER(2)                              
NAME VARCHAR2(20)  

#2


不要用select *
用select id ,name

#3


代码写得不错……顶一个……

#4


http://www.jingningedu.com/manage/java_api/java/sql/ResultSet.html#updateString%28int,%20java.lang.String%29

我随便搜的document
去看updateString的传入参数
void updateString(int columnIndex,
                  String x)
                  throws SQLException

#5


to nihuajie05 updateString(String labelName,String x) 这个方法也有

多谢yaoweijq,再问一下:为什么不能用*呢?

#6


不好意思,我没看清楚。

#7


错误贴一下看看

#8


没有错误,oracle的驱动就是这样,如果用*就不能auto mapping,只能select columnName才能更新结果集。

还有同样的语句用Statement和PreparedStatement性能能差几百倍,执行计划竟然不一样。没有理由,只能说oracle很态 ,更变态的是有时可滚动结果集就能乱码, 不滚动就不乱。总之没有道理,什么事都可能发生。

#9


楼上吐槽有力

#10


挖槽 顶!

#11


*不能mapping,要字段名列出来。建议用class12.jar试试看。
另外,楼主这种方法不推荐,要修改数据库数据,请直接调数据库的update,否则你这里不同步,很可能脏读脏写!