怎么用java读取数据库表结构?
比如:有表名,得到该表的字段名,字段类型。
好像DatabaseMetaData可以得到,但是我没有找到例子。
最好sql server 2000 和 Oracle 写一个例子?

解决方案 »

  1.   

    <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,java.io.*"%>
    <%!
    String typeToString(int i)
    {
      String ret="";
      switch(i)
      {
       case(1):ret="CHAR";break;
       case(2):ret="NUMERIC";break;
       case(3):ret="DECIMAL";break;
       case(4):ret="INTEGER";break;
       case(5):ret="SMALLINT";break;
       case(6):ret="FLOAT";break;
       case(8):ret="DOUBLE";break;
       case(12):ret="VARCHAR";break;
       case(91):ret="DATE";break;
       default:ret="other";
      }
      return ret;
      }
     %>
     <%!
       String getCol(ResultSet rst,int type,int colNum)throws Exception
       {
          String ret="";
          switch(type)
          {
             case(1):ret=rst.getString(colNum);break;
             case(4):ret=String.valueOf(rst.getInt(colNum));break;
             case(5):ret=String.valueOf(rst.getInt(colNum));break;
             case(6):ret=String.valueOf(rst.getFloat(colNum));break;
             case(8):ret=String.valueOf(rst.getDouble(colNum));break;
             case(12):ret=rst.getString(colNum);break;
             default:ret="not know";
          }
          return trans(ret);
     }
     %>
     <%! String trans(String chi)
    {
                   String result = null;
                   byte temp [];
                   try
                   {
                           temp=chi.getBytes("iso-8859-1");
                          result = new String(temp);
                    }
                    catch(UnsupportedEncodingException e)
                    {
                            System.out.println (e.toString());
                    }
    return result;
    }
    %>
     <html>
    <body>
    <center>
    <html>
    <body>
    数据库动态代理v0.5b:<hr>
    <form action="proxy.jsp" method=get>
    <table><tr><td>数据库的名字:<input type=text name=database></td>
    <td>表的名字:<input type=text name=table></td></tr>
    <tr> <td  colspan=2><input type=submit value=提交></td></tr>
    </table>
    </form>
    <%
    String database=(String)request.getParameter("database");
    String table=(String)request.getParameter("table");
    %>
    <table border=1>
    <%
       try
       {
       
        //装载驱动程序
       Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
      
       //创建连接
       Connection con=java.sql.DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433","bn","bn");
       
        Statement stmt=con.createStatement();
         
        ResultSet rst=stmt.executeQuery("use "+database+";select * from  "+table);
        ResultSetMetaData meta=rst.getMetaData()  ;
        int col=meta.getColumnCount();
        out.println("表"+table+"共有:"+col+"个字段,这些字段是:<br>");
        out.println("<tr>");
        for(int i=1;i<col+1;i++)
        {
           out.println("<td>字段名:");
           out.println(meta.getColumnName(i));
           out.println("类型:&nbsp;");
           out.println(typeToString(meta.getColumnType(i)));
           out.println("</td>");
        }
           out.println("</tr>");
       
        while(rst.next())
        {
          out.println("<tr>");
          for(int i=1;i<col+1;i++)
          {
            out.println("<td>"+getCol(rst,meta.getColumnType(i),i)+"</td>");
          }
          out.println("</tr>");
         }
        //关闭连接、释放资源
        rst.close();
        stmt.close();
        con.close();
        }
        catch(Exception e)
        {
        e.printStackTrace();
        }    
        %>  
        </table>  
    <center>
    </body>
    </html>
        
        
    jsp的例子
      

  2.   

    mysql的例子 其他数据库 改一下driver和url即可Connection connection = null;
            PreparedStatement pstmt = null;
            ResultSetMetaData rsmd = null;
            try {
                Class.forName("org.gjt.mm.mysql.Driver");
                connection = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/PIM", "root", "smyl");
                pstmt = connection.prepareStatement("select * from sys_user");
                rsmd = pstmt.getMetaData();
                for (int i = 1; i < rsmd.getColumnCount() + 1; i++) {
                    System.out.println(rsmd.getColumnName(i));
                }
            }
            catch (ClassNotFoundException cnfex) {
                cnfex.printStackTrace();
            }
            catch (SQLException sqlex) {
                sqlex.printStackTrace();
            }
      

  3.   

    是ResultSetMetaData,不是DatabaseMetaData
      

  4.   

    除了得到字段名,类型。能不能得到字段的中文名?中文名士该字段的解释。
    例如:知道tabel名字是“man_info”
          得到field名是“manId,name,sex...等”
          得到field中文名是“男人ID,姓名,性别....等”
          得到field类型名士“NUMERIC,VARCHAR,NUMERIC....等”    
      

  5.   

    sql server 2000 和 Oracle 两个都能得到中文名吗?
      

  6.   

    如果需要得到的信息比较多的话,不要用MetaData
    各种DBMS中都有系统表,有一些系统表会详细记录
    各个表的表名、表结构(表中的列名、列类型...),
    所以可以直接查这些表,当然,你的权限要够
      

  7.   

    其实JDBC驱动的MetaData并不是每一个都实现的很好,权限购的话楼上正解,比如Oracle就提供了很多非常方便的视图,呵呵