当我调用以下行时:
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
因此,我不明白问题的原因。
请澄清。
答案 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.refreshRow()
,假设更新resultSet
,因此它正确地需要可更新的ResultSet
。我希望现在很清楚。