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)
ID NUMBER(2)
NAME VARCHAR2(20)
#2
不要用select *
用select id ,name
用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
我随便搜的document
去看updateString的传入参数
void updateString(int columnIndex,
String x)
throws SQLException
#5
to nihuajie05 updateString(String labelName,String x) 这个方法也有
多谢yaoweijq,再问一下:为什么不能用*呢?
多谢yaoweijq,再问一下:为什么不能用*呢?
#6
不好意思,我没看清楚。
#7
错误贴一下看看
#8
没有错误,oracle的驱动就是这样,如果用*就不能auto mapping,只能select columnName才能更新结果集。
还有同样的语句用Statement和PreparedStatement性能能差几百倍,执行计划竟然不一样。没有理由,只能说oracle很态 ,更变态的是有时可滚动结果集就能乱码, 不滚动就不乱。总之没有道理,什么事都可能发生。
还有同样的语句用Statement和PreparedStatement性能能差几百倍,执行计划竟然不一样。没有理由,只能说oracle很态 ,更变态的是有时可滚动结果集就能乱码, 不滚动就不乱。总之没有道理,什么事都可能发生。
#9
楼上吐槽有力
#10
挖槽 顶!
#11
*不能mapping,要字段名列出来。建议用class12.jar试试看。
另外,楼主这种方法不推荐,要修改数据库数据,请直接调数据库的update,否则你这里不同步,很可能脏读脏写!
另外,楼主这种方法不推荐,要修改数据库数据,请直接调数据库的update,否则你这里不同步,很可能脏读脏写!
#1
users表结构很简单:
ID NUMBER(2)
NAME VARCHAR2(20)
ID NUMBER(2)
NAME VARCHAR2(20)
#2
不要用select *
用select id ,name
用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
我随便搜的document
去看updateString的传入参数
void updateString(int columnIndex,
String x)
throws SQLException
#5
to nihuajie05 updateString(String labelName,String x) 这个方法也有
多谢yaoweijq,再问一下:为什么不能用*呢?
多谢yaoweijq,再问一下:为什么不能用*呢?
#6
不好意思,我没看清楚。
#7
错误贴一下看看
#8
没有错误,oracle的驱动就是这样,如果用*就不能auto mapping,只能select columnName才能更新结果集。
还有同样的语句用Statement和PreparedStatement性能能差几百倍,执行计划竟然不一样。没有理由,只能说oracle很态 ,更变态的是有时可滚动结果集就能乱码, 不滚动就不乱。总之没有道理,什么事都可能发生。
还有同样的语句用Statement和PreparedStatement性能能差几百倍,执行计划竟然不一样。没有理由,只能说oracle很态 ,更变态的是有时可滚动结果集就能乱码, 不滚动就不乱。总之没有道理,什么事都可能发生。
#9
楼上吐槽有力
#10
挖槽 顶!
#11
*不能mapping,要字段名列出来。建议用class12.jar试试看。
另外,楼主这种方法不推荐,要修改数据库数据,请直接调数据库的update,否则你这里不同步,很可能脏读脏写!
另外,楼主这种方法不推荐,要修改数据库数据,请直接调数据库的update,否则你这里不同步,很可能脏读脏写!