为什么在调用ResultSet.refreshRow()时看到NotUpdatable



当我调用以下行时:

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_UPDABLE,查询必须只选择一个表,可以不使用函数,必须从该表中选择所有主键。有关更多详细信息,请参阅JDBC 2.1 API规范第5.6节。这结果集必须来自使用结果创建的语句设置ResultSet.CONCUR_UPDABLE的类型,则查询必须只选择一个表,不能使用函数,必须从中选择所有主键那张桌子。有关更多信息,请参阅JDBC 2.1 API规范第5.6节详细信息。

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

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

因此以下方向:database --> ResultSet

我有以下理解:

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

ResultSet --> database

所以我不明白问题的原因。

请澄清。

当您使用ResultSet.CONCUR_READ_ONLY时,您会得到一个异常,即

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

因此,将ResultSet.CONCUR_READ_ONLY更改为ResultSet.CONCUR_UPDATABLE,解决了您的问题。对的

现在,据我所知,你不想那样做。我说得对吗?如果是,那么我认为你混淆了ResultSet和Database,

  • ResultSet.CONCUR_READ_ONLY,意思是只读ResultSet,而不是数据库,类似地
  • ResultSet.CONCUR_UPDABLE,表示可更新的ResultSet,而不是数据库

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

相关内容

  • 没有找到相关文章

最新更新