2013-04-29 35 views
0

我一直在试图弄清楚过去2小时的结果集有什么问题。我试图连接到MS Access数据库,并且我有一个类似的工作方法,几乎​​完全相同,只是sql语句不同。由于sql语句突出显示了表中的所有内容,我假定结果集可以工作,但显然不是。任何人都可以给我一个指针?不确定如何修复无效光标状态

这里是我的代码:

public static Video[] searchdatabase(String videoname, String uploadername, int likes, int dislikes, int favorites, int subscribers,int views, String category) throws SQLException 
{ 
    String sql = "SELECT COUNT(VideoID) AS Num FROM tblYoutubeVideo"; 
Statement stmt = conn.createStatement(); 
ResultSet rs = stmt.executeQuery(sql); 

rs.next(); 

int numrows = rs.getInt("Num"); 
    System.out.println("Numrows: "+numrows); 
Video[] arr2 = new Video[numrows]; 

    sql = ("SELECT * FROM tblVideo, tblUploader WHERE tblVideo.Video_Name LIKE '"+videoname+"' AND tblUploader.Uploader_Name LIKE '"+uploadername+"'AND tblVideo.Views>"+views+" AND tblVideo.Likes>"+likes+" AND tblVideo.Dislikes<"+dislikes+" AND tblVideo.Favorites>"+favorites+" AND tblUploader.Subscribers>"+subscribers+"ORDER BY (Likes+(Views*0.5)+(Favorites*2)+(Subscribers*2))-2"); 
System.out.println(sql); 
    stmt = conn.createStatement(); 
rs = stmt.executeQuery(sql); 


    for (int i=0;i<arr2.length;i++) 
    { 
     rs.next(); 
     int uploaderid2 = rs.getInt("UploaderID"); 
     String uploader_name2 = rs.getString("Uploader_name"); 
     int subscribers2 = rs.getInt("Subscribers"); 
     int videoid2 = rs.getInt("VideoID"); 
     String video_name2 = rs.getString("Video_name"); 
     int favorites2 = rs.getInt("Favorites"); 
     String category2 = rs.getString("Category"); 
     int views2 = rs.getInt("Views"); 
     int likes2 = rs.getInt("Likes"); 
     int dislikes2 = rs.getInt("Dislikes"); 

     Video temp = new Video(uploaderid2, uploader_name2, subscribers2, videoid2, video_name2, favorites2, category2, views2, likes2, dislikes2); 

     System.out.println(arr2[i]); 
     arr2[i] = temp; 
    } 


    return arr2; 

} 

感谢提前:)

+0

除了其他任何事情之外,您还应该修复缩进并使用预准备语句避免SQL注入攻击。 – 2013-04-29 18:19:50

回答

0

我怀疑问题就在这里:

rs.next(); 

你忽略的next()的返回值,它告诉你是否实际上移动到另一个有效行,或者是否已达到结果的结尾。您目前假设您有numrows结果,即使numrowstblYoutubeVideo中的行数,并且您的实际查询已过滤。

我会亲自卸下第一个查询完全 - 只需使用一个ArrayList<Video>而不是和,而不是你的for循环,有:

List<Video> videos = new ArrayList<Video>(); 
while (rs.next()) 
{ 
    ... read data ... 
    videos.add(new Video(...)); 
} 

此外,不是你当前的代码很容易受到SQL injection attacks。您不应该直接在SQL中包含值,而应该使用参数化SQL PreparedStatement。您可以在SQL本身中指定占位符,并在语句中设置参数值。

此外,您应该关闭finally块中的语句和结果集。 (我也亲自关闭连接 - 使用连接池,以便始终可以打开连接,使用它并关闭它。)

+0

谢谢你,我正忙着通过你的建议改变代码。我真的很感谢详细的文章,我希望能够现在得到这个工作:) – user2276831 2013-04-29 19:51:07