2013-04-29 43 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