Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常开始之前的MySQL_Java_Mysql_Jdbc - Fatal编程技术网

Java 异常开始之前的MySQL

Java 异常开始之前的MySQL,java,mysql,jdbc,Java,Mysql,Jdbc,我得到一个错误,说明我在结果集开始之前遇到了异常。我试图获取一个值(来自MySQL数据库的分数),并根据玩家分数向Java排名中添加一个值。这是为了创建记分板 因此,如果玩家的分数低于当前分数,则排名为1。如果分数更高,程序将根据MySQL数据库中的下一个条目检查分数。我还没有实现将所有当前条目的排名都改为递增1的功能 一句话:我正在使用MySQL和Java创建记分板。Java程序根据输入创建一个分数条目,然后将其发送到MySQL数据库 System.out.println("You

我得到一个错误,说明我在结果集开始之前遇到了异常。我试图获取一个值(来自MySQL数据库的分数),并根据玩家分数向Java排名中添加一个值。这是为了创建记分板

因此,如果玩家的分数低于当前分数,则排名为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());
 }

    }

Put
resultSet.next()在您的executeQuery行的正下方。

Put
resultSet.next()位于executeQuery行的正下方。

如@hd1所述,您需要在调用
executeQuery后调用
ResultSet.next()

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

另外,最好使用
PreparedStatement
而不是
java.sql.Statement
,并使用参数占位符来防止攻击:

如@hd1所述,您需要在调用
executeQuery
后调用
ResultSet.next()

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

另外,最好使用
PreparedStatement
而不是
java.sql.Statement
,并使用参数占位符来防止攻击:

for循环中存在问题;退出条件应为没有更多行可提取时。您的查询不能保证满足退出条件,您可能会尝试获取超过结果集结尾的内容。(即使您的for循环恰好被输入,并且如果for循环恰好被退出,该循环派生的秩值也是不确定的,它取决于数据库返回行的顺序

      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());
 }

    }
我也没有看到对resultSet.close()或next.close()的任何调用

这里有很多问题,很难知道从哪里开始


但首先,让数据库通过查询将排名返回给您会更有效率:

"SELECT COUNT(1) AS rank FROM " + tbName + " WHERE score < " + score 
或者一个大的try/catch块也是可行的:

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

关键是,确实需要调用close方法。

for循环中有一个问题;退出条件应该是当没有更多行可获取时。您的查询不能保证满足退出条件,您可以尝试在结果集结束后获取。(即使您的for循环恰好被输入,并且如果for循环恰好被退出,该循环派生的秩值也是不确定的,它取决于数据库返回行的顺序

      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());
 }

    }
我也没有看到对resultSet.close()或next.close()的任何调用

这里有很多问题,很难知道从哪里开始


但首先,让数据库通过查询将排名返回给您会更有效率:

"SELECT COUNT(1) AS rank FROM " + tbName + " WHERE score < " + score 
或者一个大的try/catch块也是可行的:

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

关键是,确实需要调用close方法。

这个例外是什么,你能提供给我们吗?而且,你可以通过计算得分较低的记录的数量来获得排名。这比用java与数据库中的所有记录进行比较要有效得多。这个老问题有一个实质性的答案从@ SPECSER75 963,但你既没有回答也没有赞成。请考虑在某种程度上回答你收到帮助时,如果只是为了鼓励一些有用的人,我们需要在这里!什么例外,你能提供给我们吗?而且,你可以得到的排名,通过计数记录的分数较低,这将是更多的。然后,在java中与数据库中的所有记录进行比较,从@ SPECSER75 963中有一个实质性的答案,但是你既没有回答也没有赞成。请在接受帮助时考虑以某种形式回答,如果只是鼓励我们需要的那种有用的人。