我从数据库中获取一行信息放入ResultSet(RS),并不清楚每一列的数据类型(有String,有Int,有Date),然后将其放入到JTable中,纵向展示(第一列放RS的列名称,第二列放列的数据),代码如下:public void initInfo(String id) {
        MyCon mycon = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            mycon = new MyCon();//此处自己写的打开数据库程序,运行OK
            stmt = mycon.con.createStatement();
            String querycommand = "SELECT * FROM Table WHERE ID='" + id + "'";
            rs = stmt.executeQuery(querycommand);
            ResultSetMetaData rsmd = rs.getMetaData();            DefaultTableModel dataModel = new DefaultTableModel();
            Object[][] values = new Object[0][0];
            values = new Object[rsmd.getColumnCount()][2];            for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                //values[i] = new Object[2];
                values[i][0] = rsmd.getColumnName(i);
                System.out.println(rsmd.getColumnName(i));//此处OK
                values[i][1] = rs.getObject(rsmd.getColumnName(i));//运行到此处报错,错误代码如下
            }
            String header[] = {"基本信息", "内容"};
            dataModel.setDataVector(values, header);
            JTable table = new JTable(dataModel);
            JScrollPane pane = new JScrollPane(table);
            this.add(pane, BorderLayout.CENTER);        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            mycon.MyClose(mycon.con, stmt, rs);//自己写的一个关闭数据库程序,运行OK
        }
    }
错误如下:
java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的游标状态
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(JdbcOdbc.java:3811)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(JdbcOdbcResultSet.java:5638)
at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(JdbcOdbcResultSet.java:583)
at sun.jdbc.odbc.JdbcOdbcResultSet.getObject(JdbcOdbcResultSet.java:1693)
有哪位能帮我调试一下,赶紧不尽

解决方案 »

  1.   

    你用的数据源是用ODBC桥搭建的?
    你用这个ODBC桥搭建,那么查询元数据的信息就无法获得或者不完整,所以ResultSetMetaData rsmd的很多API可能无法调用,解决这个问题的办法就是换掉ODBC的连接方法,而用纯JDBC的连接,比如连接MySQL添加MySQL的JDBC驱动,这样ResultSetMetaData 的API绝大部分都支持了
      

  2.   


    我没太明白,你看我这么写是桥接的么?public MyCon() {
            try {
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            } catch (java.lang.ClassNotFoundException e) {
                JOptionPane.showMessageDialog(null, e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
            }
            try {
                con = DriverManager.getConnection("jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=" + System.getProperty("user.dir") + "\\data\\data.mdb", "", null);
            } catch (SQLException sqle) {
                JOptionPane.showMessageDialog(null, sqle.getMessage(), " 异常", JOptionPane.ERROR_MESSAGE);
            }
        }
      

  3.   

    对,你的数据源是Access,是桥接的方法——这个没办法了,没有纯JDBC的Access的驱动
    要么你把数据全部迁移到MySQL这样的数据库
    要么你就放弃使用ResultSetMetaData,必须要知道每一列的数据类型,
    再牛一些的就是你自己写个ResultSetMetaData,但是这个不是很现实,程序可能不够健壮,楼主权衡下选择一种折中方案吧,反正现在这种方案是不行的
      

  4.   

    试试:public JTable createTableFromSQL(Connection connection,String sql , Object[] name)throws Exception{
        Statement stmt = connection.createStatement(
        ResultSet.TYPE_SCROLL_INSENSITIVE,// 对滚动不敏感,结果集可滚来滚去
        ResultSet.CONCUR_READ_ONLY);// 只能够读取里边的内容,
        ResultSet rs = stmt.executeQuery(sql);//开始执行查询语句,结果存储在rs中
        rs.last();// 指到定位到最后一行
        int row = rs.getRow();// 获得总行数
        rs.beforeFirst();// 定位到开始
        ResultSetMetaData rsmd1 = rs.getMetaData();// 计算字段个数
        int col = rsmd1.getColumnCount(); // 计算字段个数
        Object a[][] = new Object[row][col];//确定表格存储数据的大小
        JTable jTable = new JTable(a, name);//建立表格
        for (int index = 0; rs.next(); index++)//使用查询返回的结果初始化表格
    for (int j = 0; j < col; j++)
        a[index][j] = rs.getString(j + 1);
    return jTable;
        }