做了个数据库小程序,有个小问题,郁闷了好几天!请大家帮忙!运行时提示,无效的游标状态,代码如下!import com.sun.rowset.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.sql.rowset.*;
public class ResultSetTable
{
   public static void main(String[] args) throws Exception
   {
      JFrame frame = new ResultSetFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}
class ResultSetFrame extends JFrame
{
   public ResultSetFrame() throws Exception
   {
      setTitle("ResultSet");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
      JMenuBar menuBar=new JMenuBar();
      setJMenuBar(menuBar);
      JMenu edit=new JMenu("操作");
      menuBar.add(edit);
      final JMenuItem addItem=new JMenuItem("添加一行");
      final JMenuItem delItem=new JMenuItem("删除一行");
      edit.add(addItem);
      edit.add(delItem);
      try
      {
        conn = getConnection();
        DatabaseMetaData meta=conn.getMetaData();
        stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
              ResultSet.CONCUR_READ_ONLY);
        String query="select * from 商品表";
        rs=stat.executeQuery(query);
        metaData=rs.getMetaData();
        try
        {
            rs.last();
            rowCount=rs.getRow();
        }
        catch(SQLException x)
        {
            x.printStackTrace();
        } 
        model=new DefaultTableModel(rowCount,metaData.getColumnCount());
        rs.first();
        for(int i=0;i<rowCount;i++)
        {
                while (rs.next())
                {
                    for(int j=0;j<model.getColumnCount();j++)
                    {
                        model.setValueAt(rs.getString(j+1),i,j);
                    }
                }
        }
        table=new JTable(model);
        add(new JScrollPane(table),"Center");
        table.getColumnModel().getColumn(0).setPreferredWidth(10);
        table.getColumnModel().getColumn(1).setPreferredWidth(50);
        table.getColumnModel().getColumn(2).setPreferredWidth(10);
        validate();
     }
     catch (IOException e)
     {
         e.printStackTrace();
     }
     catch (SQLException e)
     {
         e.printStackTrace();
     }
     delItem.addActionListener(new
         ActionListener()
         {
           public void actionPerformed(ActionEvent e)
           {
             int i=table.getSelectedRow();
             try
             {
               rs.absolute(i+1);
               rs.deleteRow();
               model.removeRow(i);
             }
             catch(SQLException x)
             {
               x.printStackTrace();
             }
           }
         });
      addWindowListener(new
         WindowAdapter()
         {
            public void windowClosing(WindowEvent event)
            {
               try
               {
                  if (conn != null) conn.close();
               }
               catch (SQLException e)
               {
                  e.printStackTrace();
               }
            }
         });
   }
   public static Connection getConnection()
      throws SQLException, IOException
   {
      String url="jdbc:odbc:hp";
      try
      {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
      return DriverManager.getConnection(url);
   }
   private int rowCount;
   private JScrollPane scrollPane;
   private DefaultTableModel model;
   private ResultSet rs;
   private Connection conn;
   private Statement stat;
   private boolean scrolling;
   private JTable table;
   private ResultSetMetaData metaData;
   private static final int DEFAULT_WIDTH = 500;
   private static final int DEFAULT_HEIGHT = 300;
}

解决方案 »

  1.   

    莫非是access数据库不支持ResultSet.TYPE_SCROLL_INSENSITIVE ?
      

  2.   

    rs.deleteRow();你已经设置为ResultSet.CONCUR_READ_ONLY了
    结果集的数据不可更新了
      

  3.   

    ResultSet.CONCUR_READ_ONLY   这句改不改都是一样, 我先前是ResultSet.UPDATE
    我认为问题是出在rs.first(),和rs.last()
    我用的SQL SERVER,不是access
      

  4.   

    假如select * from 商品表 里面一条记录都没有,而你要使用rs.last();就会出现无效的游标状态
      

  5.   

    假如select * from 商品表 里面一条记录都没有,而你要使用rs.last();就会出现无效的游标状态
    ======================================
    现在的问题是我的数据库里有数据,但是也会提示游标错误
      

  6.   

    不应该有两个循环吧for和while
      

  7.   

    这里不用用while,直接rs.next就可以了