因此,我创建的解决方案在以下代码中标记的行上引发了此异常: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服务器,所以我知道该行存在于表,但由于某种原因它没有找到。图片如下。
所以问题是,结果集rs
找不到行,即使我知道它在那里。有没有人有任何有用的见解?
澄清:为了清楚起见,我知道ResultsSet不包含任何行,这就是我得到异常的原因。我也知道将rs.next()放入if语句将防止异常(如注释中所述)。让我感到困惑的是,结果集中没有包含任何行的事实,即使有一个ID被解析为可验证的行确实存在,因为我已经直接用SQL服务器检查了它。
答案 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");
}
然后尝试。对我来说很好。
谢谢