2013-04-07 65 views
0

我已經用Java編寫的代碼具有填充點文件。我得到的錯誤,我不知道爲什麼。所有路徑都已設置。異常在MySQL

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) 
+0

你是否已經看http://stackoverflow.com/questions/2120255/java-resultset-exception-before-start-of-result-set?rq=1?由於您顯示的代碼很少,我不確定它是否適用於您的案例, – 2013-04-07 04:02:43

+0

您還應該使用參數來阻止潛在的SQL注入攻擊。 – 2013-04-07 04:05:37

+0

@PM 77-1代碼已被添加用於進一步說明 – Shahzaib 2013-04-07 04:11:27

回答

0

do-while循環的主體執行之前while表達式進行評估。

這意味着你的光標將不會在循環的第一階段推進。你需要使用一個while循環:

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

還要考慮使用PreparedStatement,以防止SQL注入攻擊。

+0

現在我得到」java.sql。 SQLException:結果集結束後「 – Shahzaib 2013-04-07 04:20:28

+0

聽起來像您正在瀏覽結果集的結尾。是while循環中的'rs.next()'是唯一調用'next'的嗎? 'ResultSet#next'返回一個布爾值,你需要在嘗試讀取任何值之前檢查它。在while循環中使用它會執行此檢查 – Reimeus 2013-04-07 04:47:19

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); 
    ... 
    ... 
} 
+0

是的,我正在使用rs。next(),同時在結果集之後填充點文件 – Shahzaib 2013-04-07 04:06:48

+0

更多代碼添加 – Shahzaib 2013-04-07 04:10:17

+1

所以,這是答案,在使用rs.getString(「tot_pub」)之前使用rs.next() – 2013-04-07 04:15:24

1

例外情況是告訴你,將光標定位在第一行數據之前,然後向它請求數據。我無法確定這一點,因爲您沒有在請求數據的地方發佈代碼的一部分,但這是我看到這個異常出現的唯一上下文。您需要致電:

rs.next(); 

將光標移至第一行數據。

編輯:正如我所料,你調用rs.next之前調用diva = Integer.parseInt(rs.getString("tot_pub"));();所以它試圖在數據庫返回的第一行之前從行中獲取一個字符串。在撥打電話之前,只需加上rs.next();即可解決問題。

+0

更多代碼已添加 – Shahzaib 2013-04-07 04:09:23

+0

@Shahzaib請參閱編輯 – drewmoore 2013-04-07 04:21:04

+0

它沒有工作」java.sql.SQLException:結果集結束後「現在它返回此異常 – Shahzaib 2013-04-07 04:32:57

0

請更換而(rs.next())而(rs.hasNext())

和內部do-while循環的第一條語句爲rs.next()

rs.hasNext()將檢查結果集中的任何現有值,如果存在任何值,則會進一步,否則將退出循環。

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

希望這會有所幫助。