0

Google でこのトピックについて多くの検索を行いましたが、私が使用している方法で getString() を使用している人をまだ見つけていないため、提案されている通常の方法でこの問題を修正できませんでした。

私がやろうとしているのは、データベースからすべての情報を取得し、それを使用してプログラム内のテーブル モデルにデータを入力することです。そのためには、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.SQLException: com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074) での結果セットの開始前 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988) で 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) で Operations.addDonor (Operations.java:135) で GUI$EventHandler.actionPerformed(GUI.java:145) で javax.swing.AbstractButton.fireActionPerformed で (不明なソース) javax.swing.AbstractButton$Handler で。javax.swing.DefaultButtonModel.fireActionPerformed (不明なソース) で javax.swing.DefaultButtonModel.setPressed (不明なソース) で javax.swing.plaf.basic.BasicButtonListener.mouseReleased (不明なソース) で java.awt. javax.swing.JComponent.processMouseEvent(不明なソース) の javax.swing.JComponent.processMouseEvent(不明なソース) java.awt.Component.processEvent(不明なソース) で java.awt.Container.processEvent(不明なソース) java.awt.Component で。 java.awt.Container.dispatchEventImpl(不明なソース) で java.awt.Component.dispatchEvent(不明なソース) で java.awt.LightweightDispatcher.retargetMouseEvent(不明なソース) で java.awt.LightweightDispatcher.processMouseEvent( java.awt.LightweightDispatcher の不明なソース)。java.awt.Container.dispatchEventImpl での dispatchEvent(未知のソース) java.awt.Window.dispatchEventImpl(未知のソース) での java.awt.Component.dispatchEvent(未知のソース) での java.awt.EventQueue.dispatchEventImpl(ソース不明) java.awt.EventQueue.access$200 (ソース不明) java.awt.EventQueue$3.run (ソース不明) java.awt.EventQueue$3.run (ソース不明) java.security.AccessController.doPrivileged (ネイティブ メソッド) java.security.ProtectionDomain$1.doIntersectionPrivilege (不明なソース) java.security.ProtectionDomain$1.doIntersectionPrivilege (不明なソース) java.awt.EventQueue$4 で実行 (不明なソース) java.awt.EventQueue$4 で.run (不明なソース) で java.security.AccessController.doPrivileged (ネイティブ メソッド) で 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(ソース不明)java.awt.EventDispatchThread.pumpEvents(不明なソース) のpumpEvents(不明なソース) java.awt.EventDispatchThread.run(不明なソース)java.awt.EventDispatchThread.pumpEvents(不明なソース) のpumpEvents(不明なソース) java.awt.EventDispatchThread.run(不明なソース)

java.sql.SQLException: com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074) での結果セットの終了後、com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988) で 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) で Operations.updateTable(Operations.java:164) で GUI$EventHandler .actionPerformed(GUI.java:148) at javax.swing.AbstractButton.fireActionPerformed(不明なソース) javax.swing.AbstractButton$Handler.actionPerformed(不明なソース) で javax.swing.javax.swing.DefaultButtonModel.setPressed の DefaultButtonModel.fireActionPerformed (不明なソース) javax.swing.plaf.basic.BasicButtonListener.mouseReleased (不明なソース) で java.awt.Component.processMouseEvent (不明なソース) javax. java.awt.Component.processEvent(不明なソース) の java.awt.Component.processEvent(不明なソース) java.awt.Component.dispatchEventImpl の java.awt.Component.dispatchEventImpl(不明なソース) で java.awt. java.awt.LightweightDispatcher.retargetMouseEvent の java.awt.Component.dispatchEvent(不明なソース) の Container.dispatchEventImpl(不明なソース) java.awt.LightweightDispatcher.processMouseEvent(不明なソース) java.awt.LightweightDispatcher の. java.awt.Container での dispatchEvent(不明なソース)。java.awt.Window.dispatchEventImpl(不明なソース) で java.awt.Component.dispatchEvent(不明なソース) で java.awt.EventQueue.dispatchEventImpl(不明なソース) で java.awt.EventQueue.access$200 (不明なソース) java.awt.EventQueue$3.run で (不明なソース) java.awt.EventQueue$3.run で (不明なソース) java.security.AccessController.doPrivileged(ネイティブ メソッド) で java.security.ProtectionDomain$1。 java.security.ProtectionDomain$1 の doIntersectionPrivilege (不明なソース)。java.awt.EventQueue$4.run の doIntersectionPrivilege (不明なソース) .doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.java.awt.EventDispatchThread.pumpOneEventForFilters の EventQueue.dispatchEvent (不明なソース) java.awt.EventDispatchThread.pumpEventsForFilter (不明なソース) で java.awt.EventDispatchThread.pumpEventsForHierarchy (不明なソース) java.awt.EventDispatchThread で。 java.awt.EventDispatchThread.pumpEvents(不明なソース) のpumpEvents(不明なソース) java.awt.EventDispatchThread.run(不明なソース)EventDispatchThread.run (不明なソース)EventDispatchThread.run (不明なソース)

エラーは実際には rSet.getInt(1); から生成されています。私の getRowCount() メソッドで。

データは引き続き追加され、すべて正常に機能しますが、これらのメッセージ ウィンドウを閉じなければならないのは面倒です。誰か提案はありますか?

4

3 に答える 3

3

rSet.next()結果を取得する前に getRowCount()を呼び出す必要があります(このコードのどこかに行数クエリを作成しているとは思いません)。

また、データベース リソースを破棄する前に閉じていないため、リソース リークが発生します。 データベース リソースは、使い終わったらすぐに finally ブロックで閉じてください

于 2012-11-11T05:08:16.370 に答える
0

最初の行の前にカーソルを置いてからデータを要求していると思います。カーソルを最初の行に移動する必要があります。

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

これは、if ステートメントまたはループで行うのが一般的です。

if(rSet.next()){
   foundType = result.getString(1);
}
于 2012-11-11T05:08:25.400 に答える
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 プログラミング言語の文字列として取得します。」

ソース: http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html

于 2012-11-11T05:09:56.707 に答える