import javax.swing.*;
import javax.swing.table.AbstractTableModel;import java.awt.*;
import java.sql.*;
import java.awt.event.*;
public class classQuery extends JPanel implements ActionListener{
    /**
     * 从数据库中读取数据做为组合框的小项,然后从中选出一项  查询数据库,显示出来
     */
    private static final long serialVersionUID = 1L;
    
    public  classQuery(){
        layout=new BorderLayout();
        setLayout(layout);
        northPanel=new JPanel();
        className=new JComboBox();
        northPanel.add(className);
        add(northPanel,BorderLayout.NORTH);
        
        try {
            Class
            .forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
         
        String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=成绩管理系统";        String user = "sa";
        String password = "";
        
            conn = DriverManager.getConnection(url, user, password);
        String sql="select * from 班级表";
        stmt=conn.createStatement();
        rs=stmt.executeQuery(sql);
        while(rs.next()){
            className.addItem(rs.getString("班级名称"));
        }
        }catch (SQLException e) {
            
            e.printStackTrace();
        }catch (ClassNotFoundException e) {
            
            e.printStackTrace();
        }
        className.addActionListener(this);
    }
    
    public void actionPerformed(ActionEvent e) {
        
        String sql="select * from 学生成绩表 where 所属班级='"+className.getSelectedItem().toString().trim()+"'";
        try {
            stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                     ResultSet.CONCUR_READ_ONLY);
                    
            rs=stmt.executeQuery(sql);
            model=new ResultSetTableModel(rs);
            JTable table=new JTable(model);
            scrollPanel=new JScrollPane(table);
            add(scrollPanel,BorderLayout.CENTER);
            validate();
        } catch (SQLException e1) {
            
            e1.printStackTrace();
        }
    }
    private JComboBox className;
    private BorderLayout layout;
    private JScrollPane scrollPanel;
    private ResultSet rs;
    private ResultSetTableModel model;
    private JPanel northPanel;
    private Connection conn = null;
    private Statement stmt = null;
}
class ResultSetTableModel extends AbstractTableModel{    /**
     * 
     */
    private static final long serialVersionUID = 1L;    public ResultSetTableModel(ResultSet aResultSet){
        rs=aResultSet;
        try {
            rsmd=(ResultSetTableModel) rs.getMetaData();
        } catch (SQLException e) {
            
            e.printStackTrace();
        }
    }
    public String getColumnName(int c){
        return rsmd.getColumnName(c+1);
    }
    public int getColumnCount() {
        
        return rsmd.getColumnCount();
    }    public int getRowCount() {
        try {
            rs.last();
            return rs.getRow();
        } catch (SQLException e) {
            
            e.printStackTrace();
            return 0;
        }
        
    }    public Object getValueAt(int r, int c) {
        try {
            rs.absolute(r+1);
            return rs.getObject(c+1);
        } catch (SQLException e) {
            
            e.printStackTrace();
            return null;
        }
        
    }
    private ResultSet rs;
    private ResultSetTableModel rsmd;
    
}

这是报错 com.microsoft.jdbc.base.BaseResultSetMetaData cannot be cast to ResultSetTableModel 初次接触这个...不明白哪错了...只是说不能转换... 

解决方案 »

  1.   

    你把下面的代码拷过去试试(我把你的用汉字的地方替换了,你可以自己再替换回来)我这里编译通过了。我觉得你是导入包的时候,导入错了。比如 ResultSet 有java.sql.ResultSet; 和 com.mysql.jdbc.ResultSet;(只是例子,不是说问题在这)import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;import javax.swing.JComboBox;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    public class classQuery extends JPanel implements ActionListener{
        private static final long serialVersionUID = 1L;
       
        public  classQuery(){
            layout=new BorderLayout();
            setLayout(layout);
            northPanel=new JPanel();
            className=new JComboBox();
            northPanel.add(className);
            add(northPanel,BorderLayout.NORTH);
           
            try {
                Class
                .forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
           
            String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=system";        String user = "sa";
            String password = "";
           
                conn = DriverManager.getConnection(url, user, password);
            String sql="select * from t_class";
            stmt=conn.createStatement();
            rs=stmt.executeQuery(sql);
            while(rs.next()){
                className.addItem(rs.getString("classname"));
            }
            }catch (SQLException e) {
               
                e.printStackTrace();
            }catch (ClassNotFoundException e) {
               
                e.printStackTrace();
            }
            className.addActionListener(this);
        }
       
        public void actionPerformed(ActionEvent e) {
           
            String sql="select * from result where class='"+className.getSelectedItem().toString().trim()+"'";
            try {
                stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                        ResultSet.CONCUR_READ_ONLY);
                       
                rs=stmt.executeQuery(sql);
                model=new ResultSetTableModel(rs);
                JTable table=new JTable(model);
                scrollPanel=new JScrollPane(table);
                add(scrollPanel,BorderLayout.CENTER);
                validate();
            } catch (SQLException e1) {
               
                e1.printStackTrace();
            }
        }
        private JComboBox className;
        private BorderLayout layout;
        private JScrollPane scrollPanel;
        private ResultSet rs;
        private ResultSetTableModel model;
        private JPanel northPanel;
        private Connection conn = null;
        private Statement stmt = null;
    }
    import java.sql.ResultSet;
    import java.sql.SQLException;import javax.swing.table.AbstractTableModel;class ResultSetTableModel extends AbstractTableModel
    { /**
     *
     */
    private static final long serialVersionUID = 1L; public ResultSetTableModel(ResultSet aResultSet)
    {
    rs = aResultSet;
    try
    {
    rsmd = (ResultSetTableModel) rs.getMetaData();
    }
    catch(SQLException e)
    { e.printStackTrace();
    }
    } public String getColumnName(int c)
    {
    return rsmd.getColumnName(c + 1);
    } public int getColumnCount()
    { return rsmd.getColumnCount();
    } public int getRowCount()
    {
    try
    {
    rs.last();
    return rs.getRow();
    }
    catch(SQLException e)
    { e.printStackTrace();
    return 0;
    } } public Object getValueAt(int r, int c)
    {
    try
    {
    rs.absolute(r + 1);
    return rs.getObject(c + 1);
    }
    catch(SQLException e)
    { e.printStackTrace();
    return null;
    } } private ResultSet rs; private ResultSetTableModel rsmd;
    }
      

  2.   

    com.microsoft.jdbc.base.BaseResultSetMetaData cannot be cast to ResultSetTableModel 
    不能从**类型到**类型的转化
    你转化错误,仔细检查下
      

  3.   

    我的编译也可以通过啊...但是JComboBox 事件的时候,才报的错!
      

  4.   


    是这句报错的吧:在ResultSetTableModel.java里
    rsmd=(ResultSetTableModel) rs.getMetaData();
      

  5.   

    你是不是应该让 ResultSetTableModel 实现 ResultSetMetaData接口呢?
      

  6.   

    我觉得你应该在ResultSetTableModel里面保存一个全局的ResultSetMetaData然后在你实现AbstractTableModel里的方法的时候,
    就调用ResultSetMetaData的方法。比如你要实现getColumnName方法实现可以这样:
    public String getColumnName(int c)
    {
    String colName = "";
    try
    {
    colName = rsmd.getColumnLabel(c + 1);// java.sql.ResultSetMetaData rsmd
    }
    catch(SQLException e)
    {
    // TODO 自動生成された catch ブロック
    e.printStackTrace();
    }
    return colName;
    }
      

  7.   

    这是我修改的ResultSetTableModel你调试下看看。另外:看你的代码明显有个BUG,
    就是当我第二次选则 JComboBox 的值的时候,
    无法刷新你的table。
    你自己再改改吧。
    import java.sql.ResultSet;
    import java.sql.SQLException;import javax.swing.table.AbstractTableModel;
    class ResultSetTableModel extends AbstractTableModel
    {
    private static final long serialVersionUID = 1L; public ResultSetTableModel(ResultSet aResultSet)
    {
    rs = aResultSet;
    try
    {
    rsmd = (java.sql.ResultSetMetaData) rs.getMetaData();
    }
    catch(SQLException e)
    { e.printStackTrace();
    }
    } public String getColumnName(int c)
    {
    String colName = "";
    try
    {
    colName = rsmd.getColumnLabel(c + 1);// java.sql.ResultSetMetaData rsmd
    }
    catch(SQLException e)
    {
    e.printStackTrace();
    }
    return colName;
    } public int getColumnCount()
    {
    int count = 0;
    try
    {
    count = rsmd.getColumnCount();
    }
    catch(SQLException e)
    {
    e.printStackTrace();
    }
    return count;
    } public int getRowCount()
    {
    try
    {
    rs.last();
    return rs.getRow();
    }
    catch(SQLException e)
    { e.printStackTrace();
    return 0;
    } } public Object getValueAt(int r, int c)
    {
    try
    {
    rs.absolute(r + 1);
    return rs.getObject(c + 1);
    }
    catch(SQLException e)
    { e.printStackTrace();
    return null;
    } } private ResultSet rs; private java.sql.ResultSetMetaData rsmd;
    }
      

  8.   


    public ResultSetTableModel(ResultSet aResultSet){ 
            rs=aResultSet; 
            try { 
                rsmd=(ResultSetTableModel) rs.getMetaData(); 
            } catch (SQLException e) { 
                
                e.printStackTrace(); 
            } 
        } 红色的部分可以转么???AbstractTableModel  =  ResultSetMetaData???