比如说,我要查询一个表的全部内容并输出,select * from table;但是我事先不知道table有几个字段的情况下,如何能得到字段的名称和字段的个数?

解决方案 »

  1.   

    调用 resultset.getMetaData(),能得到一个 ResultSetMetaData 对象。多看看 java.sql.* 的文档吧,不算复杂。
      

  2.   

    多谢楼上的,终于知道怎么用了,不过还有一个问题:
    public void outAllInfoOfTable(String tableName){
    this.tableName = tableName;
    String sql="desc " + tableName;
    try {
    result = stmt.executeQuery(sql);
    metadata = result.getMetaData();
    tempCount = metadata.getColumnCount();
    System.out.println("tempCount is "+tempCount);
    } catch (SQLException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    }
    System.out.println("---------------");
    System.out.println("desc "+ tableName + ":");
    this.printTableInfo();
    }
    我写了一个打印表字段信息的函数,现在的问题是我的表中只有2个字段name,age可是显示的tempCount=6; 如果后面在用到这个值的时候肯定是越界了,请问各位帮忙这是为什么?如何解决?
      

  3.   

    hehe, 楼主,你把 1 楼和 2 楼的“解决方案”混在一起用了,这样不行的!如果你用 1 楼的解决方案,sql 语句是 desc table,那么,不用检查 metadata,它的返回结果一定是 6 列,具体是什么意思,你用数据库客户端软件执行一下就知道了。如果你用 2 楼的解决方案,sql 语句应该就是你原来的那个:select * from table
      

  4.   

    回楼上:select * from table,我已经实现了,没有问题,我现在是想得到table的字段数,因为table是个参数,字段数是不固定的,比如说table有2个字段,name和age,在mysql客户端上显示的是这样的:
    desc table;
    name
    age
    对吧,我现在就像得到有几个这样的字段?我的方法不行,那如何能得到呢?
      

  5.   

    唉,楼主还是没明白 metadata 的意思。如果像你说的,你的 table 里有两个字段,那 select * from table 的 ResultSet 里每行记录就应该有这样两个字段,但现在你并不知道有这样两个字段,对吧?所以,就调用 rs.getMetaData(),它能告诉你这个 ResultSet 的每行记录有几个字段、都叫什么名字、类型是什么。
      

  6.   

    select * from table;查到的是表中的数据,这个我知道了,先不说这个了
    desc tables;得到的是表的字段,现在我就想得到字段个数如何做啊?
      

  7.   

    下面这段程序分别用两种办法查询并打印出 table 的结构信息,希望楼主仔细看看,别辜负我敲的这么多字  ;)    Class.forName("com.mysql.jdbc.Driver").newInstance();
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:336/test?user=root&useUnicode=true&characterEncoding=utf8");
        String table = "test";    String sql = "desc " + table;
        PreparedStatement pstmt = conn.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        System.out.println("table name: " + table);
        int cnt = 0;
        while (rs.next()) {
            System.out.println("Column " + (++cnt) + ":");
            System.out.println("\t Field  : " + rs.getString(1));
            System.out.println("\t Type   : " + rs.getString(2));
            System.out.println("\t Null   : " + rs.getString(3));
            System.out.println("\t Key    : " + rs.getString(4));
            System.out.println("\t Default: " + rs.getString(5));
            System.out.println("\t Extra  : " + rs.getString(6));
        }
        rs.close();
        pstmt.close();    System.out.println("==================================");    sql = "select * from " + table;
        pstmt = conn.prepareStatement(sql);
        rs = pstmt.executeQuery();
        ResultSetMetaData rsmd = rs.getMetaData();
        int numberOfColumns = rsmd.getColumnCount();
        System.out.println("table name: " + table);
        for (int i=1; i<=numberOfColumns; i++) {
            System.out.println("Column " + i + ":");
            System.out.println("\t ColumnLabel       : " + rsmd.getColumnLabel(i));
            System.out.println("\t ColumnName        : " + rsmd.getColumnName(i));
            System.out.println("\t ColumnDisplaySize : " + rsmd.getColumnDisplaySize(i));
            System.out.println("\t ColumnType        : " + rsmd.getColumnType(i));
            System.out.println("\t ColumnTypeName    : " + rsmd.getColumnTypeName(i));
            System.out.println("\t Nullable          : " + rsmd.isNullable(i));
            System.out.println("\t Precision         : " + rsmd.getPrecision(i));
            System.out.println("\t Scale             : " + rsmd.getScale(i));
        }
        rs.close();
        pstmt.close();    conn.close();
      

  8.   

    现在我明白第二个程序段了,第一个还是不太明白?
    就是为什么desc table;就是6列 ?是对于每个表这个值都是一样的?
      

  9.   

    哦,多谢maquan('ma:kju) ,我终于知道了