Java 异常开始之前的MySQL
我得到一个错误,说明我在结果集开始之前遇到了异常。我试图获取一个值(来自MySQL数据库的分数),并根据玩家分数向Java排名中添加一个值。这是为了创建记分板 因此,如果玩家的分数低于当前分数,则排名为1。如果分数更高,程序将根据MySQL数据库中的下一个条目检查分数。我还没有实现将所有当前条目的排名都改为递增1的功能 一句话:我正在使用MySQL和Java创建记分板。Java程序根据输入创建一个分数条目,然后将其发送到MySQL数据库Java 异常开始之前的MySQL,java,mysql,jdbc,Java,Mysql,Jdbc,我得到一个错误,说明我在结果集开始之前遇到了异常。我试图获取一个值(来自MySQL数据库的分数),并根据玩家分数向Java排名中添加一个值。这是为了创建记分板 因此,如果玩家的分数低于当前分数,则排名为1。如果分数更高,程序将根据MySQL数据库中的下一个条目检查分数。我还没有实现将所有当前条目的排名都改为递增1的功能 一句话:我正在使用MySQL和Java创建记分板。Java程序根据输入创建一个分数条目,然后将其发送到MySQL数据库 System.out.println("You
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行的正下方。PutresultSet.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中有一个实质性的答案,但是你既没有回答也没有赞成。请在接受帮助时考虑以某种形式回答,如果只是鼓励我们需要的那种有用的人。