2012-11-11 50 views
0

我已经通过Google对这个主题进行了大量的搜索,但是我还没有找到使用getString()的方式,所以我使用它无法以建议的正常方式解决此问题。JDBC ResultSet.getString ResultSet的开始/结束之前/之后异常

我想要做的是从数据库中获取所有信息,然后使用它在程序中填充表模型。我通过getString获取数据并将其放入String []对象中。这里是我的MySqlConnection类:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import javax.swing.JOptionPane; 
import javax.swing.table.DefaultTableModel; 

public class MySQLConnect 
{ 
    public MySQLConnect() 
    { 
     connect = null; 
     statement = null; 
     rSet = null;  
    } 

    public void Connect(String dbase, String uname, String pword) 
    { 
     try 
     { 
      Class.forName("com.mysql.jdbc.Driver"); 

      connect = DriverManager.getConnection("jdbc:mysql://localhost/" + dbase , uname, pword); 
      JOptionPane.showMessageDialog(null, "Connection successful. Please retry your submission." , "Information", JOptionPane.INFORMATION_MESSAGE);   
     } 

     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(null, e , "SQL Error", JOptionPane.ERROR_MESSAGE); 
     }  
    } 

    public void addDonor(int did, String dname, String dcname, int damount, DefaultTableModel model) 
    { 
     try 
     { 
      statement = connect.createStatement(); 

      statement.execute("Insert Into prg421_w5.donors Values ("+ did + ",'" + dname + "','" + dcname + "'," + damount + ")"); 
      JOptionPane.showMessageDialog(null, "Data entry added successfully." , "Information", JOptionPane.INFORMATION_MESSAGE); 
      getRSet(); 
      updateTable(model); 
     } 

     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(null, e , "SQL Error", JOptionPane.ERROR_MESSAGE); 
     } 
    } 

    public void getRSet() 
    { 
     try 
     { 
      rSet = statement.executeQuery("Select * From donors"); 
     } 

     catch (Exception e) 
     { 

     } 
    } 

    public void updateTable (DefaultTableModel model) 
    { 
     try 
     { 
      for (i = getRowCount(); i > 0; i--) 
      { 
       model.removeRow(0); 
      } 
     } 

     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(null, e , "SQL Error", JOptionPane.ERROR_MESSAGE); 
     } 

     try 
     { 
      while (rSet.next()) 
      { 
       String row[] = {rSet.getString("DonorName"),rSet.getString("DonorCharity"),((String)rSet.getString("DonationAmount"))}; 

       model.addRow(row);  
      } 
     } 

     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(null, e , "SQL Error", JOptionPane.ERROR_MESSAGE); 
     }  
    } 

    public int getRowCount() 
    { 
     try 
     { 
      rowCount = rSet.getInt(1); 
     } 

     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(null, e , "SQL Error", JOptionPane.ERROR_MESSAGE); 
     } 

     return rowCount; 
    } 

    public Boolean isConnected() 
    { 
     return connect != null; 
    } 

    public void Close() 
    { 
     try 
     { 
      if (rSet != null) 
      { 
       rSet.close(); 
      } 

      if (statement != null) 
      { 
       statement.close(); 
      } 

      if (connect != null) 
      { 
       connect.close(); 
      } 
     } 

     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(null, e , "SQL Error", JOptionPane.ERROR_MESSAGE); 
     } 
    } 


    private Connection connect; 
    private Statement statement; 
    private ResultSet rSet; 
    private int rowCount, i; 

    private static Object o = null; 
} 

但是我总是得到一个对话框错误消息,指出这些错误消息的标题:

例外:在结果的开始设置

例外:结束后结果集

下面是栈跟踪:

java.sql.SQLE xception:在开始结果集之前 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)在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)在 com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:854)在 COM .mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2709)在 MySQLConnect.getRowCount(MySQLConnect.java:100)在 MySQLConnect.updateTable(MySQLConnect.java:68)在 MySQLConnect.addDonor(MySQLConnect.java:42 )at Operations.addDonor(Operations.java:135)at GUI $ EventHandler.ac tionPerformed(GUI.java:145)在 javax.swing.AbstractButton.fireActionPerformed(来源不明)在 javax.swing.AbstractButton中的$ Handler.actionPerformed(来源不明)在 javax.swing.DefaultButtonModel.fireActionPerformed(来源不明)在 javax.swing.DefaultButtonModel.setPressed(未知来源)处 javax.swing.JComponent中 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知 源)在java.awt.Component.processMouseEvent(未知来源)。 processMouseEvent(Unknown Source)at java.awt.Component.processEvent(Unknown Source)at java.awt.Container.processEvent(Unknown Source)at java.awt.Component.dispatchEventImpl(Unknown Source)at java.awt.Container.dispatchEventImpl(Unknown Source)at java.awt.Component.dispatchEvent(Unknown Source)at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source )在 java.awt.LightweightDispatcher.dispatchEvent(未知来源)处 java.awt.Window.dispatchEventImpl(未知来源) java.awt.Container.dispatchEventImpl(未知来源)在 java.awt.Component.dispatchEvent( (Unknown Source)at java.awt.EventQueue.dispatchEventImpl(Unknown Source)at java.awt.EventQueue.access $ 200(Unknown Source)at java.awt.EventQueue $ 3.run(Unknown Source)at java.awt。 EventQueue的$ 3.run(Unknown Source) java.security.AccessController.doPrivileged(Native Method) java.security.ProtectionDomain $ 1。doIntersectionPrivilege(未知 来源)在 java.security.ProtectionDomain $ 1.doIntersectionPrivilege(未知 来源)在java.awt.EventQueue中$ 4.run(来源不明)在 java.awt.EventQueue中的$ 4.run(来源不明)在 java.security.AccessController.doPrivileged(Native Method)at java.acurity.ProtectionDomain $ 1.doIntersectionPrivilege(Unknown Source)at java.awt.EventQueue.dispatchEvent(Unknown Source)at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source ) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)at java.awt.EventDispatchThread.pumpEv已废除(未知来源) 处 java.awt.EventDispatchThread.run(未知来源)

java.sql.SQLException中java.awt.EventDispatchThread.pumpEvents(未知来源):结果的端设定在 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)在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)在 com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:854)在 com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl。 java:2709)at MySQLConnec t.getRowCount在 Operations.updateTable(Operations.java:164)(MySQLConnect.java:100)在 MySQLConnect.updateTable(MySQLConnect.java:68)在 GUI $ EventHandler.actionPerformed(GUI.java:148)在 javax.swing.AbstractButton.fireActionPerformed(Unknown Source)at javax.swing.AbstractButton $ Handler.actionPerformed(Unknown Source)at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)at javax.swing.DefaultButtonModel.setPressed(Unknown源)在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知 源)在java.awt.Component.processMouseEvent(未知源)在 javax.swing.JComponent.processMouseEvent(未知源)在 java.awt.Component.processEvent(Unknown Source)at java.awt.Container.processEvent(Unknown Source)at java.awt.Component.dispatchEventImpl(Unknown Source)at java.awt.Container.dispatchEventImpl(Unknown Source)在 java.awt.Component.dispatchEvent(未知来源)在处 java.awt.LightweightDispatcher.dispatchEvent java.awt.LightweightDispatcher.processMouseEvent(未知来源) java.awt.LightweightDispatcher.retargetMouseEvent(未知源)(未知源)在 java.awt.Container.dispatchEventImpl(未知源)在 java.awt.Window.dispatchEventImpl(未知源)在 java.awt.Component.dispatchEvent(未知源)在 java.awt.EventQueu e.dispatchEventImpl(Unknown Source)at java.awt.EventQueue.access $ 200(Unknown Source)at java.awt.EventQueue $ 3.run(Unknown Source)at java.awt.EventQueue $ 3.run(Unknown Source)at java.security.AccessController.doPrivileged(本机方法)在 java.security.ProtectionDomain $ 1.doIntersectionPrivilege(未知 来源)在 java.security.ProtectionDomain $ 1.doIntersectionPrivilege(未知 来源)在java.awt.EventQueue中$ 4运行(Unknown Source) java.awt.EventQueue $ 4.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ 1。doIntersectionPrivilege(未知 源)在java.awt.EventQueue.dispatchEvent(未知来源)在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在java.awt中。 EventDispatchThread.pumpEventsForHierarchy(未知 来源)在java.awt.EventDispatchThread.pumpEvents(来源不明) 在java.awt.EventDispatchThread.pumpEvents(来源不明)在 java.awt.EventDispatchThread.run(来源不明)

错误实际上是从rSet.getInt(1)生成的;在我的getRowCount()方法中。

数据仍然被添加,一切正常,但它只是讨厌不得不关闭这些消息窗口。有没有人有一些建议?

+0

你能请张贴更多的代码和堆栈跟踪查看代码的行为,并解释你/警告你面对什么样的错误? –

+0

为您的班级编写完整的代码。 –

+0

@BhavikAmbani完成。 – Geowil

回答

3

您需要在getRowCount()中调用rSet.next()才能得到结果(我甚至不认为您在此代码中的任何位置创建行计数查询)。

另外,在丢弃它们之前,您并未关闭数据库资源,这会导致资源泄漏。 总是只要你完成它们就关闭finally块中的数据库资源。

+0

我刚才也想到了这一点。至于关闭他们在那里,但只能通过Close()方法。我不想在他们完成之前关闭他们。该程序不断等待添加新数据,但是一旦用户单击另一个类中的“退出”按钮,我会将其称为关闭。 – Geowil

+0

是的,这阻止了这些错误。 – Geowil

+0

@Geowil - 每次您重新分配语句和rSet成员变量时,都会关闭前一个Statement/ResultSet_的引用(每次调用addDonor()时,都会创建一个新Statement和多个新ResultSet实例)。当你这样做时,你正在泄漏资源。你必须在丢弃它们之前将它们关闭 – jtahlborn

0

我想你是在第一行之前定位光标,然后请求数据。您需要将光标移至第一行。

rSet.next(); 
String foundType = rSet.getString(1); 

在if语句或循环中这很常见。

if(rSet.next()){ 
    foundType = result.getString(1); 
} 
0

而是考取一个字符串作为参数传递给ResultSet.getString(“的ColumnName”)的;,可以尝试考绩列的数量,作为一个int。开始计算@ 1

ResultSet rs = getRSet(); 
if(rs != null) { 
    while(rs.next()) { 
     String rows[] = { rs.getString(1), rs.getString(2), rs.getString(3) }; 
     model.add(rows); 
    } 
} //else, error handling 

的getString(INT columnIndex):返回字符串
“获取此ResultSet对象的Java编程语言中的String的当前行中指定列的值。”

来源:http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html

+0

数据被检索找到,我的错误位置表示为我原始发布中的错误点。这些错误实际上来自getRowCount方法。 – Geowil

相关问题