当我调用ResultSet.refreshRow()时,为什么会看到NotUpdatable?

时间:2014-08-30 13:06:51

标签: java sql jdbc connection resultset

当我调用以下行时:

Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet resultSet = statement.executeQuery("select * from user");
resultSet.next();
resultSet.refreshRow();//exception throws here

我看到以下异常:

  

com.mysql.jdbc.NotUpdatable:结果集不可更新。此结果集   必须来自使用结果集类型创建的语句   ResultSet.CONCUR_UPDATABLE,查询必须只选择一个表,才可以   不使用函数,必须从该表中选择所有主键。   有关更多详细信息,请参阅JDBC 2.1 API规范,第5.6节。这个   结果集必须来自使用结果创建的语句   设置ResultSet.CONCUR_UPDATABLE的类型,查询必须只选择一个   表,不能使用函数,必须从中选择所有主键   那张桌子。有关更多信息,请参阅JDBC 2.1 API规范,第5.6节   的信息。

我想知道这个例外,因为如果阅读refreshRow方法javadoc,我们可以找到以下内容:

  

refreshRow方法为应用程序提供了一种显式方式   告诉JDBC驱动程序从数据库中重新获取行

因此遵循方向:database --> ResultSet

我有以下理解:

可更新是可能使用以下方向:

ResultSet --> database

因此,我不明白问题的原因。

请澄清。

1 个答案:

答案 0 :(得分:1)

当您使用ResultSet.CONCUR_READ_ONLY时,您将获得例外

  

com.mysql.jdbc.NotUpdatable:结果集不可更新。此结果集   必须来自使用结果集类型创建的语句   ResultSet.CONCUR_UPDATABLE,查询必须只选择一个表,才可以   不使用函数,必须从该表中选择所有主键。   有关更多详细信息,请参阅JDBC 2.1 API规范,第5.6节。\

因此,将ResultSet.CONCUR_READ_ONLY更改为ResultSet.CONCUR_UPDATABLE,解决了您的问题。正确的吗?

现在,据我所知,你不想这样做。我对吗?如果是,那么我认为你将ResultSet与数据库混淆,

  • ResultSet.CONCUR_READ_ONLY,表示只读ResultSet,而不是数据库,类似
  • ResultSet.CONCUR_UPDATABLE,表示可更新的ResultSet,而不是数据库。

方法resultSet.refreshRow(),假设更新resultSet,因此它正确地需要可更新的ResultSet。我希望现在很清楚。