为什么Resultset 不能更新?

vintager4 2004-06-18 11:54:42
import java.sql.*;

public class UpdatableResultSet{
public static void main(String args[]){
String query = "SELECT 联系人编号,名字,分机 FROM 联系人";
UpdatableResultSet p = new UpdatableResultSet(query);
}

public UpdatableResultSet(String query) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:Contract");
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData md = rs.getMetaData();

if(rs.getConcurrency() == ResultSet.CONCUR_UPDATABLE)
System.out.println("UPDATABLE");
else
System.out.println("READ_ONLY");

int nColumns = md.getColumnCount();
for (int i=1; i<=nColumns; i++){
System.out.print(md.getColumnLabel(i)+((i==nColumns)?"\n":"\t"));
if (i==2) System.out.print("\t");
}

while (rs.next()) {
rs.updateString(1,"222");
//rs.updateString("分机","000");
rs.updateRow();
for(int i=1; i<=nColumns; i++){
System.out.print(rs.getString(i)+((i==nColumns)?"\n":"\t"));
}
}

}
catch(ClassNotFoundException e){
e.printStackTrace();
}
catch(SQLException e){
e.printStackTrace();
}
}
}

运行结果:

UPDATABLE
联系人编号 名字 分机
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]行中有错误
at sun.jdbc.odbc.JdbcOdbcResultSet.setPos(JdbcOdbcResultSet.java:5135)
at sun.jdbc.odbc.JdbcOdbcResultSet.updateRow(JdbcOdbcResultSet.java:4085)
at UpdatableResultSet.<init>(UpdatableResultSet.java:31)
at UpdatableResultSet.main(UpdatableResultSet.java:6)
Finished executing

使用的数据库是ACCESS,为什么不能更新?
...全文
243 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxben 2004-09-02
  • 打赏
  • 举报
回复
gz
vintager4 2004-06-22
  • 打赏
  • 举报
回复
有没有人知道啊?
wandou999 2004-06-21
  • 打赏
  • 举报
回复
与生命周期有关
zuxingyuan 2004-06-21
  • 打赏
  • 举报
回复
应该是游标的问题吧。
vintager4 2004-06-21
  • 打赏
  • 举报
回复
还是不行,上面提到的方法都试了(除了更换数据库),还是有错。换成con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
后还是报同样的错误。换成Statement stmt = con.createStatement();后rs.updateString(1,"222");报错。晕,到底是为什么?

shuneng 2004-06-18
  • 打赏
  • 举报
回复
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
改成这样会如何呢?
shuneng 2004-06-18
  • 打赏
  • 举报
回复
会不会是ACCESS的问题啊 你试试看SQL SERVER或者其它DBMS产品。
ningIII 2004-06-18
  • 打赏
  • 举报
回复
老大,把错误代码贴出来??

rs.updateRow();

这句是在把stmt改了以后报错的吗??

vintager4 2004-06-18
  • 打赏
  • 举报
回复
老大们,说清楚一点嘛,到底是怎么回事?rs.updateRow();这句报错!!!!
ningIII 2004-06-18
  • 打赏
  • 举报
回复
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);


换成

Statement stmt = con.createStatement();

看看~
hfwsw 2004-06-18
  • 打赏
  • 举报
回复
while (rs.next()) {
rs.updateString(1,"222");
//rs.updateString("分机","000");
rs.updateRow();
for(int i=1; i<=nColumns; i++){
System.out.print(rs.getString(i)+((i==nColumns)?"\n":"\t"));
}
}
这段肯定有问题的啦
vintager4 2004-06-18
  • 打赏
  • 举报
回复
将更新和查询分开后还是不行,会不会是ACCESS不支持更新?但是他返回的明明是UPDATEABLE啊?而且我这个例子是书上的,也是用的ACCESS
晕!!!
hq1305018 2004-06-18
  • 打赏
  • 举报
回复
rs.updateString(1,"222");
主键是不是重复了?
shuneng 2004-06-18
  • 打赏
  • 举报
回复
while (rs.next()) {
rs.updateString(1,"222");
//rs.updateString("分机","000");
rs.updateRow();
for(int i=1; i<=nColumns; i++){
System.out.print(rs.getString(i)+((i==nColumns)?"\n":"\t"));
}
这一段最好分开写更新与查询
即更新后重新查询一次返回一个ResultSet
要么用absolute定位游标,getString好像对游标有影响

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧