2013-01-18 2 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의 이전 질문에 대한 실질적인 대답이 있습니다 그러나 당신은 대답하거나 upvoted하지 않았습니다. 도움이 필요한 경우 여기에 도움이되는 사람들을 격려하기 위해 어떤 형태로든 답장을 보내주십시오. – halfer

답변

2

executeQuery 줄 바로 아래에 resultSet.next();을 넣으십시오. @ HD1에 의해 언급 한 바와 같이

2

, 당신은 executeQuery에 호출 후 ResultSet.next()를 호출해야합니다

while (resultSet.next()) { 
... 
또한

, 더 나은 대신 java.sql.StatementPreparedStatement를 사용하여 매개 변수 자리 표시자를 사용하는 SQL Injection 공격으로부터 보호하기 위해 :

1

for 루프에 문제가 있습니다. 추출 할 행이 더 이상 없을 때 종료 조건이 있어야합니다. 쿼리를 통해 종료 조건이 충족된다는 보장이 없으며 결과 집합의 끝을 지나치게 페치 할 수 있습니다. (for 루프가 입력 될 때조차도 for 루프가 종료 될 경우 해당 루프에 의해 파생 된 순위 값은 비 결정적이며 데이터베이스에 의해 반환되는 행의 순서에 따라 달라집니다.

나는 또한 resultSet.close() 또는 next.close()에 대한 호출을 볼 수 없습니다

.

많은 문제가 시작 위치를 알고 어렵다 여기에있다.


그러나 첫째, 질의와 함께 데이터베이스가 순위를 반환하도록하는 것이 훨씬 더 효율적입니다.

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

모든 행을 되돌리고 모든 점수를 비교하는 것이 아닙니다. 그것은 단지 고통스럽고, 많은 코드가 단지 잡음 일뿐입니다. 이렇게하면 필요한 코드에만 집중할 수 있습니다.

일단 작업을 시작하면 진술이 SQL 삽입에 취약하지 않도록하고 바인드 변수가있는 준비된 명령문이 실제로 거기에 도달하는 방법인지 확인해야합니다.

그리고 실제로 결과 집합, 준비된 문 및 연결에서 close() 메서드를 호출해야합니다. 우리는 전형적으로 이것을 finally 블록에 넣기를 원합니다. 하나 같이 변수가 즉시 초기화됩니다 중첩 된 시도/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() }; 
) 

요점은, 가까운 메소드를 호출해야합니다.