当我调用以下行时:
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
。我希望现在一切都清楚了。