2013-01-18 62 views
1

開始前,我得到一個錯誤,說明我有一個結果集開始前一個例外。我試圖獲得一個值(來自MySQL數據庫的分數),並根據玩家分數將其添加到Java排名中。這是創建一個記分牌。MySQL的例外

所以,如果玩家的得分比目前降低分數時,它會與秩1貼如果是更高的,該程序會針對在MySQL數據庫中的下一個條目的分數。我還沒有實現一個功能,改變的當前所有條目級別的由1

底線遞增:我創建使用MySQL和Java記分牌。 Java程序根據輸入創建一個分數條目,然後將其發送到MySQL數據庫。

 System.out.println("Your score is: "+score*2+" (A lower score is better.)"); 
     try { 
    // create a java mysql database connection 
    String myDriver = "com.mysql.jdbc.Driver"; 
    String myUrl = "jdbc:mysql://4.30.110.246:3306/apesbridge2013"; 
    String dbName = "apesbridge2013"; 
    String tbName = period + "period"; 
    Class.forName(myDriver); 
    Connection conn = DriverManager.getConnection(myUrl, "user", CENSORED); 
    next = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 
    ResultSet resultSet = next.executeQuery("SELECT * FROM " + tbName); 
    int cscore = resultSet.getInt("score"); 
    for(int sscore = score; sscore > cscore;){ 
     resultSet.next(); 
     cscore = resultSet.getInt("score"); 
     rank++; 
    } 

    stmt = conn.createStatement(); 
    stmt.executeUpdate("insert into " + dbName + "." + tbName + " " + "values(" + rank + ", '" + name + "', " + score + ")"); 
    stmt.close(); 
    conn.close(); 
} 
catch (Exception e) 
{ 
    System.err.println("Got an exception! "); 
    System.err.println(e.getMessage()); 
} 

    } 
+2

這是什麼例外,你可以提供給我們嗎? – demongolem

+2

也可以通過計算得分較低的記錄數來得到排名..然後在java中比較數據庫中的所有記錄會更有效 –

+0

對於來自@ spencer7593的這個舊問題有一個實質性的答案但你既沒有回覆也沒有投票。請您考慮以某種形式回覆您獲得幫助,如果只是爲了鼓勵我們在這裏需要幫助的人們! – halfer

回答

2

resultSet.next();放在你的executeQuery行的正下方。

2

如前所述通過@ HD1,則需在通話後打電話到ResultSet.next()executeQuery

while (resultSet.next()) { 
... 

此外,最好使用PreparedStatement,而不是java.sql.Statement和使用參數佔位符,以防止SQL Injection攻擊:

1

您的for循環存在問題;退出條件應該是沒有更多行要取的時候。您的查詢不能保證退出條件會被滿足,並且您可能會嘗試通過結果集的末尾進行提取。 (即使你的for循環確實碰巧進入了,並且當for循環確實發生退出時,由該循環派生的rank值也是非確定性的,它依賴於數據庫返回的行的順序。

我還沒有看到resultSet.close()或next.close()任何調用。

有這麼多的問題,在這裏,你很難知道從哪裏開始。


但是首先,這將是更有效的讓數據庫的排名歸還給您,使用查詢:

"SELECT COUNT(1) AS rank FROM " + tbName + " WHERE score < " + score 

,而不是拉回所有行後面,每個分數進行比較。這很痛苦,而且很多代碼只是噪聲。這將允許您專注於需要在那裏的代碼。

一旦你得到那個工作,你需要確保你的說法是不容易受到SQL注入,並使用綁定變量的預處理語句是真的去那裏的路上。

而且您確實需要確保調用結果集,準備語句和連接上的close()方法。我們通常希望這些在最後一塊。無論是使用嵌套的try/catch塊,其中的變量會立即初始化,就像這樣:

try { 
    Connection conn = DriverManager.getConnection(... 

    try { 
     stmt = conn.CreateStatement(); 

     String query = "SELECT COUNT(1) AS `rank` FROM " + tbName + " WHERE `score` < " + score ; 

     try { 
      ResultSet rs = stmt.executeQuery(query); 
      while (rs.next()) { 
       rank = rs.getInt("rank"); 
      } 
     } finally { 
      if (rs!=null) { rs.close() }; 
     } 
    } finally { 
     if (stmt!=null) { stmt.close() }; 
    } 
} finally { 
    if (conn!=null) { conn.close() }; 
} 

或者一個大try/catch塊也可以是可行的:

} finally { 
    if (resultSet!=null) { resultSet.close() }; 
    if (next!=null) { next.close() }; 
    if (conn!=null) { conn.close() }; 
) 

的一點是,在靠近方法確實需要被調用。