JDBC.SQLServerException:结果集没有当前行

时间:2014-01-03 09:52:21

标签: java exception jpa jdbc resultset

因此,我创建的解决方案在以下代码中标记的行上引发了此异常: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服务器,所以我知道该行存在于表,但由于某种原因它没有找到。图片如下。

enter image description here

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

澄清:为了清楚起见,我知道ResultsSet不包含任何行,这就是我得到异常的原因。我也知道将rs.next()放入if语句将防止异常(如注释中所述)。让我感到困惑的是,结果集中没有包含任何行的事实,即使有一个ID被解析为可验证的行确实存在,因为我已经直接用SQL服务器检查了它。

4 个答案:

答案 0 :(得分:3)

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

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

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

  • 完全相同的查询在一个环境中工作,但不在另一个环境中工作,仅针对一个特定SiteID,2184
  • ResultSet 它是,因为我总是假设错误在我的代码中,而不是在语言库中)
  • 如果是这样,数据库必须不同

答案 1 :(得分:2)

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

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

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

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();

答案 2 :(得分:1)

在while循环中添加结果语句对我来说很有帮助。 while(rs.next) { rs.getString("your column name"); }

答案 3 :(得分:0)

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

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

然后尝试。对我来说很好。

谢谢