java - 我可以像这样比较结果集吗?我面临以下错误

标签 java loops jdbc resultset

我有 2 个结果集。第一个结果集包含数据库 1 中表 1 的记录,第二个结果集包含数据库 2 中表 2 的记录。我需要结果集 1 中不存在于结果集 2 中的记录列表。为此,我编写了这个逻辑,但它不起作用并抛出以下错误。

java.sql.SQLException:只读结果集的无效操作:deleteRow

if ( table1ResultSet != null )
  {
    while ( table1ResultSet.next() )
    {
      final String table1Record = table1ResultSet.getString( 1 );

      if ( table2ResultSet != null )
      {
        while ( table2ResultSet.next() )
        {
          final String table2Record = table2ResultSet.getString( 1 );

          if ( table1Record.toString().equalsIgnoreCase( table2Record.toString() ) )
          {
            table1ResultSet.deleteRow();

            break;
          }
        }
      }
    }


  }

  return table1ResultSet;

最佳答案

该异常说明了问题所在 - 您的结果集不支持删除。为了获得可更新的结果集,有一些要求:

当您准备语句时,您是否使用 ResultSet.CONCUR_UPDATABLE 来制作它?

查询只能从单个表中进行选择,而无需任何联接操作。 查询必须选择所有不可为空的列以及所有没有默认值的列。查询不能使用“SELECT *”。无法选择派生列或聚合,例如一组列的 SUM 或 MAX。

在进行您正在做的事情之前,您可能希望将结果集移动到 Java 集中,因为使用 deleteRow 实际上会从数据库中删除该行(除非这是预期的结果)

但是您的代码还有另一个问题。即使删除有效,您的代码也会在结果集 1 的第二次迭代中失败,因为您从未重置 table2ResultSet,并且对于第二次迭代,table2resulset 中不会有更多结果。

但最重要的是。为什么您要经历所有这些麻烦并获取您不需要的所有行,而不是使用单个查询来完成,例如:

select * from table 1 where id not in select id from table 2

delete from table 1 where id not in select id from table 2

如果这就是目标

关于java - 我可以像这样比较结果集吗?我面临以下错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50169020/

相关文章:

java - 如何让NumberFormat以 double 类型返回

java - 如何制作一个考虑插入顺序的优先级 int 列表,以防 Java 中出现重复?

ios - 在IOS中添加具有属性名称的变量值

JDBC MySQL 错误 : Statement cancelled due to timeout or client request

java - 使用 PreparedStatement 时出现 com.mysql.jdbc.exceptions.MySQLSyntaxErrorException

java - Oracle JDBC 7 作为 Maven 依赖项

java - 终止 Java 线程

java - 使用 Java 和 BoofCV 检测图像文件中的形状

c - 循环 C 内重复出现错误

c++ - 在类中使用 random 进行循环