当前位置: 代码迷 >> J2SE >> ,查询出错,不知道错在哪
  详细解决方案

,查询出错,不知道错在哪

热度:57   发布时间:2016-04-24 01:53:48.0
请求帮助,查询出错,不知道错在哪?
我是个java新手
今天在练习编写程序的时候出现错误了
请大家帮我看看,谢谢了!~~~

 DB.java

  public ResultSet Findsql(String sq){
  con=getConnection();
  try {
sql=con.createStatement();
res=sql.executeQuery(sq);

} catch (SQLException e) {
e.printStackTrace();
}  
  return res;
  }


  test.java
void finds() throws SQLException{
DB c=new DB();
ResultSet res=c.Findsql("select * from usereg where usename = 'wang'");
  if(!res.next()){
  System.out.println("查无此记录");
  }
  else{
  res.previous();
  while(res.next()){
  String idS=res.getString("ID");
  System.out.println(idS);
  }
  }
}

异常错误  

Exception in thread "main" java.sql.SQLException: Result set type is TYPE_FORWARD_ONLY
at sun.jdbc.odbc.JdbcOdbcResultSet.previous(Unknown Source)

------解决方案--------------------
错误信息已经明确告诉你你的结果集是只能往前查看结果. 换句话说只能next().所以你调用previous的时候报错.
------解决方案--------------------
createStatement()默认是不可以滚动的,如果需要回滚,使用下面的语句创建statement:
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

附一点我以前的学习资料:

1.创建可滚动的ResultSet对象
为了创建一个可滚动的ResultSet对象,需要使用creatStatement()方法的另外一种格式(注意,该格式只适用于JDBC2.0)。
Statement createStatement(int resultSetType,int resultSetConcurrency)
其中,具体的参数及说明如下:
resultSetType
ResultSet.TYPE_FORWARD_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE.SCROLL.SENSITIVE
当使用ResultSet.TYPE_FORWARD_ONLY时(该属性为createStatement()默认属性)则表示产生一个只能前移的Result对象。而另外两种属性则可以实现游标在该结果集中的向前或向后移动。其中ResultSet.TYPE_SCROLL_INSENSITIVE对象不受事务对象底层数据库所做的修改。而另一个ResultSet.TYPE.SCROLL.SENSITIVE对象则可见事务对底层数据库的修改。
ResultSetConcurrency
CONCUR_READ_ONLY
CONCUR_UPDATABLE
CONCUR_UPDATABLE属性表示可以在结果集中修改和创建数据。
2.使用游标在结果集中滚动的方法
当设置了ResultSet.TYPE_SCROLL_INSENSITIVE或ResultSet.TYPE.SCROLL.SENSITIVE属性后,定义一个游标在结果集中的移动可以使用Result的如下的方法:
Boolean preivoue()---移动到前一行
Boolean first()---移动最初一行
Boolean last()---移动到最后一行
Boolean next()---移动到下一行
Boolean absolute(int number)---转移第number行数据
Boolean relative(int number)---从当前行开始移动number行
Void afterlast()---移动到数据集底
Void beforefirst()---移动到数据集的开始(注意和first()的区别)
Boolean isFirsr()---判断是否为数据集中第一个数据
Boolean isBeforeFirst()---判断是否为数据集的开始
Boolean isLast()---判断是否为数据集的最后一个数据
Boolean isAfterLast()---判断是否为数据集的最后
Int getRow()---获得结果集的数目
Void moveToInsertRow()---移动到一个用于结果集插入的特殊行
Void moveToCurrentRow()---调离已插入行,回到数据集中待插入之前的行
3.创建可更新的ResultSet对象
首先查询数据库SQL必须满足如下的条件:
*只引用单个的表
*不含有一个join或者group by子句
*选择主关键字作为那些列之一
然后将Statement createStatement(int resultSetType,int resultSetConcurrency)中的int resultSetConcurrency 属性设置为CONCUR_UPDATABLE,这样就可以利用如下方法修改或者添加你的结果集中的数据了:
updateString(),updateBoolean(),updateByte(),updateShort(),updateInt(),updateDatelong(),updateFloat(),
updateFloat(),updateDouble(),updateBigDecimal(),updateBytes(),updateDate(),updateTime()
updateTimeStamp(),updateAsciiStream(),updateCharacterStream(),updateBinaryStream(),updatedateNull()
  相关解决方案