【问题标题】:JDBC.SQLServerException: The result set has no current rowJDBC.SQLServerException:结果集没有当前行
【发布时间】:2014-01-20 22:56:25
【问题描述】:

所以,我创建的解决方案抛出了这个异常:jdbc.SQLServerException: The result set has no current row 在下面代码中标记的行上。

public String get64BitEncodedImageBySiteID(int siteID){
    try {           
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        Connection conn = DriverManager.getConnection(url, userName, password);

        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery( "SELECT SitePicture FROM SiteTable WHERE SiteID ="+siteID );

        rs.next();
        // The above line has since been moved to the if statement below where you can see it commented out,
        // which prevents the exception from occuring but still doesn't fix the fact that the row is not being found. 

        if(/*rs.next() &&*/ rs.getBytes("SitePicture")!=null){ // EXCEPTION THROWN HERE!
            byte ba[] = rs.getBytes("SitePicture");            
            return new sun.misc.BASE64Encoder().encodeBuffer(ba);
        }
        else {return null;}
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

上面的方法,在引发异常的实例中,是从直接从同一个表中提取的 Entity 对象中获取真正的 siteID (22379)。在此方法中使用System.out.println(siteID); 时,它声明该数字仍然正确,即仍然是 22379。我通过在 SQL Server 中运行相同的语句直接检查了 SQL Server,所以我知道该行存在于表中,但由于某种原因,它没有被发现。下图。

所以问题是,ResultSet rs 没有找到该行,即使我知道它在那里。有没有人有任何有用的见解?

澄清:为了清楚起见,我知道 ResultsSet 不包含任何行,这就是我收到异常的原因。我也知道将 rs.next() 放入 if 语句将防止异常(如 cmets 中所述)。令我感到困惑的是,ResultSet 不包含任何行,即使具有被解析为它的 ID 的行确实存在,因为我已经直接使用 SQL 服务器对其进行了检查。

【问题讨论】:

  • @JunedAhsan 它应该是 rs.next() 我认为,rs.hasNext() 不存在于结果集中
  • @downvoter - 如果我的问题有问题,我需要知道它是什么。单独投反对票是没有帮助的。
  • 您是否尝试使用常量值而不是 siteID?像SELECT SitePicture FROM SiteTable WHERE SiteID = 42 或直接在 SQL 服务器上执行时产生正确结果的任何东西。
  • @MichałRybak - 实际上,据我所知,这个特殊问题只发生在一个站点的 ID 上,并且在其他所有场合都正确发生。所以,是的,它已尝试使用其他值并且工作正常。
  • @MichałRybak - 看起来我搞砸了。你是对的,我不应该确定我正在查询正确的数据库。我在此解决方案中分别使用 JPA 和 JDBC,JPA 连接详细信息是正确的,但 JDBC 是从没有此条目的旧测试数据库中解析的值。如果您能找到一种方式将其表述为可能对其他人有帮助的答案,那么我将投票并接受它。

标签: java exception jpa jdbc resultset


【解决方案1】:

如果不检查结果是否有条目,您可能无法获得结果。为此使用

while(rs.next()){
  rs.getString("column name");
}

并尝试一下。对我来说效果很好。

谢谢

【讨论】:

    【解决方案2】:

    在我的情况下,在 while 循环中添加结果语句很有帮助。 while(rs.next) { rs.getString("your column name"); }

    【讨论】:

      【解决方案3】:

      结果证明这是一个本地错误,但我还是会发布解决方案,因为这种情况具有一定的教育价值。

      我从@Ralph 对this answer 的评论中了解到,消除“不可能”是解决此类问题的好方法。

      在避免siteID出错的风险后(通过硬编码),我们有以下情况:

      • 完全相同的查询在一种环境下工作,但在另一种环境下却不行,只针对一个特定的SiteID, 2184
      • ResultSet 对于 这个特定的值不起作用是不可能的(我声称是的,因为我总是假设错误在我的代码中,而不是在语言库中)
      • 如果是这样,数据库必须不同

      【讨论】:

      • 我今天遇到了同样的问题。但发现没有 if (rs.next) 条件它失败了,当添加这个条件它工作。
      【解决方案4】:

      最可能的解释是您的 ResultSet 不包含行。你检查过吗?

      如果是这种情况,rs.next() 将返回 false,但您不再检查返回值。把rs.next()放回if块里面就OK了。

      您可以通过以下方式确定:

      if (rs.next()) {
      
        if(rs.getBytes("SitePicture")!=null){ 
           byte ba[] = rs.getBytes("SitePicture");            
           return new sun.misc.BASE64Encoder().encodeBuffer(ba);
        }
      
      } else {
      
         System.out.println("No rows returned");
      
      }
      

      编辑:

      siteID 是什么列类型? 您的方法接受一个 int,但您的 SQL 将它用引号括起来,就好像它是一个字符串一样。

      编辑 2:

      使用 PreparedStatement 可能会解决您的问题。

      PreparedStatement ps = conn.prepareStatement("SELECT SitePicture FROM SiteTable WHERE SiteID = ?");
      ps.setInt(1, siteId);
      ResultSet rs = ps.executeQuery();
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 2013-06-30
      • 1970-01-01
      相关资源
      最近更新 更多