是啥导致了这个“无效的游标状态”错误?

Posted

技术标签:

【中文标题】是啥导致了这个“无效的游标状态”错误?【英文标题】:What causes this "invalid cursor state" error?是什么导致了这个“无效的游标状态”错误? 【发布时间】:2011-12-09 17:47:19 【问题描述】:

运行此代码时出现“无效光标状态”错误。

我使用此代码从 Access 数据库中获取结果集,然后将其存储在表中。

这段代码只是为了从结果集中获取数据:

data=new Object[numberOfRows][numberOfColumns];
for(int i=0;i<numberOfRows;i++)
  int j=0;
  while(j<numberOfColumns)
    // int colType=rsmd.getColumnType(j+1); 
    // System.out.println(colType);
    data[i][j]=rs.getInt("course_id");
    System.out.print("0th: "+data[i][j]+"    ");
    j++;
    data[i][j]=rs.getString("course_name");
    System.out.print("1st:"+data[i][j]+"    ");
    j++;
    data[i][j]=rs.getString("course_date");
    System.out.print("2nd:"+data[i][j]+"    ");
    j++;
    data[i][j]=rs.getString("course_number");
    System.out.print("3rd: "+data[i][j]+"    ");
    j++;
    System.out.print("j:"+j);
  
  System.out.print("Done line:"+i);

【问题讨论】:

看起来你有一些有用的调试输出。请将其包含在您的问题中。 【参考方案1】:

我认为主要问题是您从不调用rs.next() 来滚动光标。但是,根据您对记录结构的说明,您的 while 循环似乎也很混乱。请尝试以下操作:

data=new Object[numberOfRows][numberOfColumns];
for(int i=0;i<numberOfRows;i++) 
  if (!rs.next())
    throw new IllegalStateException();
  int j=0;
  // int colType=rsmd.getColumnType(j+1); 
  // System.out.println(colType);
  data[i][j]=rs.getInt("course_id");
  System.out.print("0th: "+data[i][j++]+"    ");
  data[i][j]=rs.getString("course_name");
  System.out.print("1st:"+data[i][j++]+"    ");
  data[i][j]=rs.getString("course_date");
  System.out.print("2nd:"+data[i][j++]+"    ");
  data[i][j]=rs.getString("course_number");
  System.out.print("3rd: "+data[i][j++]+"    ");
  while(j<numberOfColumns) 
    data[i][j]=rs.getString(j + 1);
    System.out.print(j+"th: "+data[i][j++]+"    ");
  
  System.out.println();
  System.out.println("Done line:"+i);

【讨论】:

我有一张名为 "course" 的表,该表包括 4 个字段,分别是: "course_id" ,"course_name" ,"course_date" 和 "course_number" >> 这是我的表的样子: course_id course_name course_date course_number data data data data >> 我的表格如下所示: course_id course_name course_date course_number data data data data data data data data data data data data data data 我使用第一个循环来获取行数和我使用第二个循环来获取列数,这将有助于了解每行中的列数。我不明白为什么我不需要它,如果我不使用它,我将无法获取数据! @GhadeerWalid 我现在了解您的结构。这不是我从你的代码中猜到的。我会更新我的答案。 非常感谢它的工作!但是您能否为我解释一下这一行: data[i][j]=rs.getString(j + 1); $ @GhadeerWalid JDBC API 使用基于 1 的列的索引,而不是大多数编程语言使用的基于 0 的索引。所以,要获得第一列(你称之为“0th”),你可以使用rs.getInt(1) 而不是rs.getInt("course_id")。由于我不知道您的“额外”数据列的名称,因此我只使用它们的索引;加一会将基于 0 的数组索引 j 转换为基于 1 的 JDBC 索引。而且几乎任何数据类型的列都可以作为String检索,所以我使用getString()方法来获取每个字段。

以上是关于是啥导致了这个“无效的游标状态”错误?的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致了这个推进错误?

Python MySQLdb错误 - 是啥导致了这个

是啥导致了这个“jpackage 不存在”错误?

是啥导致了这个 ActiveRecord::ReadOnlyRecord 错误?

是啥导致了这个 QT 4.7.3 错误?

是啥导致了这个错误? “CALayer 位置包含 NaN:[240 nan]”