0

我用 Java 编写了一个代码,它必须填充一个点文件。我得到了错误,我不知道为什么。所有的路径都已经设置好了。

Class.forName("com.mysql.jdbc.Driver");                     
Connection connects = DriverManager.getConnection("jdbc:mysql://localhost:3306/userlogin", "root","12345");
Statement stm = connects.createStatement();
ResultSet rs=stm.executeQuery("SELECT * FROM authors_4 WHERE self_authors='"+getTxt+"'");

                         int l=0;
                         /*if(rsx.next())
                         {
                             div = Double.parseDouble(rsx.getString("divs"));


                         }*/


                       do
                         {
                             if(l==0)
                             {

                                 diva = Integer.parseInt(rs.getString("tot_pub"));

                                 //fout.write("a [label=" + "\"" + rsx.getString(2) + "\\n" + rsx.getString(4) + "\"" + "color=blue,fontsize=24,fontcolor=red,style=filled];\r\n");
                                 fout.write("\"" + rs.getString("self_authors") + "\"" + "[fixedsize=true, width="+diva+",height="+diva+", label=" + "\"" + rs.getString("self_authors") + "\\n" + rs.getString("tot_pub") + "\"" + "color=blue,fontsize=24,fontcolor=red,style=filled];\r\n");
                               l++;
                             }


                             divb = Integer.parseInt(rs.getString("tot_pub")) ;

                             fout.write("\"" + rs.getString("co_auths") + "\"" + "[fixedsize=true, width="+divb+",height="+divb+",label=" + "\"" + rs.getString("co_auths") + "\\n" + rs.getString("tot_pub") + "\"];" +"\r\n");    


                             //fout.write("a ->" + "\"" + rsx.getString(6) + "\"" + "[penwidth=" +  rsx.getString(8)  +", label =" + rsx.getString(8) +" ];" + "\r\n");
                               fout.write("\"" + rs.getString("self_authors") + "\" ->" + "\"" + rs.getString("co_auths") + "\"" + "[penwidth=" +  rs.getString("1")  +", label =" + 1 +" ];" + "\r\n");

                             //System.out.println(rsx.getString(1));

                         }while(rs.next());

                         fout.write("}");
                         fout.close();
                     }

我写的代码很长,无法解释,所以我只发布我遇到异常的部分。

例外情况是:

java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:855)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5773)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5693)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5733) 
4

4 回答 4

1

我相信您发布的代码不会引发任何错误。当您尝试访问结果集数据而不将光标移动到第一条记录时,将返回此错误。

ResultSet rs = stm.executeQuery("SELECT * FROM authors_4 WHERE self_authors='"+getTxt+"'");

// Did you use rs.next() ???
while (rs.next())
{
   // You need rs.next() before trying to access 
   // Without rs.next(), you'll see the "Before start of result set" exception
   int myInt = rs.getInt(1);   
   ...
   ...
}
于 2013-04-07T03:58:58.710 回答
1

例外是告诉您将光标定位在第一行数据之前,然后从中请求数据。我不能确定这一点,因为您尚未发布请求数据的代码部分,但这是我看到此异常出现的唯一上下文。您需要致电:

rs.next();

将光标移动到第一行数据。

编辑:正如我所料,你在打电话diva = Integer.parseInt(rs.getString("tot_pub"));之前打电话 rs.next(); 所以它试图从数据库返回的第一行之前的行中获取一个字符串。只需rs.next();在拨打电话之前添加,您的问题就解决了。

于 2013-04-07T03:59:26.653 回答
0

do-while循环体在计算表达式之前执行。while

这意味着您的光标不会在循环的第一遍中前进。您需要使用while循环:

while(rs.next()) {
   ...
}

还可以考虑使用PreparedStatement来防止 SQL 注入攻击。

于 2013-04-07T04:13:16.827 回答
0

请将while(rs.next())替换为while(rs.hasNext())

Do-While 循环中,第一条语句为rs.next()

rs.hasNext()将检查 ResultSet 中的任何现有值,如果存在任何值,那么它将继续前进,否则它将退出循环。

Note: I will suggest to use **While loop** instead of a **Do-While loop**.

希望这会有所帮助。

于 2013-07-20T15:25:35.107 回答