2014-09-29 75 views
0

得到的字符串我有一個JList (稱爲「李施德林」)這在我的MySQL數據庫成功地提取從表一整列。現在我有一個的JButton將拉動從數據庫(稱爲dosrocket)兩個字符串,然後通過在命令到Apache下議院Exec的API來執行。程序拒絕從MySQL數據庫

以下是代碼如下:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
    String selgame=listerine.getSelectedValue().toString(); 
    String qu="select filepath from dosrocket where name="+"'"+selgame+"'"; 
    String gname=null,gpath=null; 
    try{ 
      ras=st.executeQuery(qu); 
      gname=ras.getString(3); 
      gpath=ras.getString(4); 

     String command="C:/Program Files/DOSBox-0.74/DOSBox.exe"; 
    CommandLine cmdinstance=CommandLine.parse(command); 
    cmdinstance.addArgument("mount c:"+gpath); 
    cmdinstance.addArgument(gname); 
    DefaultExecutor exac=new DefaultExecutor(); 
    int exitval=exac.execute(cmdinstance); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
    try{ 
     ras.close();  
     st.close(); 
     con.close(); 
    } 
    catch(SQLException e){ 
     e.printStackTrace(); 
    } 

}   

然而,當我按下按鈕,出現此錯誤:

java.sql.SQLException: Before end of result set 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919) 
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 Client.jButton2ActionPerformed(Client.java:518) 
at Client.access$1400(Client.java:28) 
at Client$12.actionPerformed(Client.java:194) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6527) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6292) 
at java.awt.Container.processEvent(Container.java:2234) 
at java.awt.Component.dispatchEventImpl(Component.java:4883) 
at java.awt.Container.dispatchEventImpl(Container.java:2292) 
at java.awt.Component.dispatchEvent(Component.java:4705) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) 
at java.awt.Container.dispatchEventImpl(Container.java:2278) 
at java.awt.Window.dispatchEventImpl(Window.java:2739) 
at java.awt.Component.dispatchEvent(Component.java:4705) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746) 
at java.awt.EventQueue.access$400(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:697) 
at java.awt.EventQueue$3.run(EventQueue.java:691) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) 
at java.awt.EventQueue$4.run(EventQueue.java:719) 
at java.awt.EventQueue$4.run(EventQueue.java:717) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
BUILD SUCCESSFUL (total time: 31 seconds) 

請幫助!

+0

你需要使用'ResultSet.next()'。 – 2014-09-29 09:58:10

+0

@a_horse_with_no_name'while(ResultSet.next())'或'if(ResultSet.next())'? – 2014-09-29 10:01:57

+0

@a_horse_with_no_name所以我試着'while(ResultSet.next())'。我得到這個:'java.sql.SQLException:列索引超出範圍,3> 1' – 2014-09-29 10:11:02

回答

0

傻我。當我的表只提供一個時,我引用了第3列和第4列。

更正代碼:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
    String selgame=listerine.getSelectedValue().toString(); 
    String qu="select filename,filepath from dosrocket where name="+"'"+selgame+"'"; 
    String gname=null,gpath=null; 
    try{ 
      ras=st.executeQuery(qu); 
      while(ras.next()){ 
       gname=ras.getString(1); 
      gpath=ras.getString(2); 
      } 
     String cdcommand="cd C:/Program Files/DOSBox-0.74"; 

     CommandLine cmdinstance=CommandLine.parse(cdcommand); 

    cmdinstance.addArgument("dosbox"); 
      cmdinstance.addArgument("mount c:"+gpath); 
    cmdinstance.addArgument(gname); 

    DefaultExecutor exac=new DefaultExecutor(); 

    int exitval2=exac.execute(cmdinstance); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
    try{ 
     ras.close();  
     st.close(); 
     con.close(); 
    } 
    catch(SQLException e){ 
     e.printStackTrace(); 
    } 

}    
0

如指出的那樣,你需要訪問返回的數據之前調用resultSet.next()。

我有如果我可以threeother評論 - 1.利用PreparedStatement代替聲明。它更有效率。代碼將被編譯一次,而不是每次執行。

PreparedStatemt ps = con.createPreparedStatement ("select filename,filepath from dosrocket where name= ?"); 
ps.setString (1, selgame); 
rs = ps.execute(); 
  • 訪問結果集值時,我更喜歡使用的柱,而不是它的數值的位置的名稱。我認爲這樣更安全。

  • 在捕獲異常

    ,呼叫connection.rollback();

  • 相關問題