如题...

解决方案 »

  1.   

    select tb2.teacherName,tb1.studentName from tb2,tb1 where tb2.teacherManageStuent=tb1.studentID
    解析出结果集里面的colname和tablename
      

  2.   

    /*
     * 1 从databaseMetaData 取出Database元数据
     *
     * getColumns 检索可在指定类别中使用的表列的描述。
     */
    DatabaseMetaData databaseMetaData = DBConn.getMetaData();
    RS = databaseMetaData.getColumns("jobcn_boss", null,TableName, null); //jobcn_boss数据库,TableName表

    /*
     * 2 利用 ResultSetMetaData 查询上面各列各个属性名 
     *
    /*
    ResultSetMetaData rsmd = RS.getMetaData();
    int ColnumConut = rsmd.getColumnCount();   //还有getColumName(),getColumnType(), ......................
    System.out.println(ColnumConut);
    for (int i=1; i < ColnumConut+1; i++) {
    System.out.println(i+":"+rsmd.getColumnName(i));
    }
    */
    while (RS.next())
    {
    colname+=RS.getString("COLUMN_NAME")+",";
    coltype+=RS.getString("TYPE_NAME")+",";
    colnumber+=RS.getString("COLUMN_SIZE")+",";
    }
    String [] ColName = colname.split(",");
    String [] ColType = coltype.split(",");
    String [] ColNumber = colnumber.split(",");
    ColType[0]=ColType[0].substring(0,ColType[0].indexOf(" "));
    RS.close();
      

  3.   

    stmt=con.createStatement();
    rst=stmt.executeQuery("select * from users");
    ResultSetMetaData meta=rst.getMetaData();
    int col=meta.getColumnCount();
    int i;
    for(i=1;i<=col;i++)
    {
    out.println(meta.getColumnName(i));
    out.println(meta.getColumnType(i));
    ...................
    }
    这些.......................
      

  4.   

    ORACLE的meta.getTableName(i)是取不到表名的 ~~,还有getColumnName(i)有可能是别名~
      

  5.   

    自已写一个类去分析这条SQL语句????
      

  6.   

    自已写一个类去分析这条SQL语句????
    是的
      

  7.   

    首先找select 和from 它分成这两段,然后再慢慢的去分析,一般是表名(或者别名).字段名
    还要分析where.....好像太麻烦了吧?
      

  8.   

    呵呵,我写过,解析字符串,去空格,,,一段段的分析
    但是太麻烦了
    特别是where子句的分析,简直没法进行
      

  9.   

    那么oracle的那个方法可以得出来也可以~~
      

  10.   

    如果全是tablename.colname,用正则也可以吧?
      

  11.   

    先从sql里的from子句解析出表名 
    在从DatabaseMetaData 的getColumns方法里取得所有列名
    然后从sql里找匹配的列名。
      

  12.   

    Coolfatman(180) ( ) 信誉:98    Blog 这是在写编译器。--------------------------------------
    汗~~
      

  13.   

    select tb2.teacherName,tb1.studentName from tb2,tb1 where tb2.teacherManageStuent=tb1.studentID
    cloumnName是tb2.teacherName和tb1.studentName 
    tableName是tb2和tb1
    以上如果有as那它会取别名这个我在sqlserver上试验过
      

  14.   

    sqlserver应该可以用meta.getTableName(i),虽然是别名,但是oracle连别名也取不出来
      

  15.   

    ResultSet.getMetaData
    ResultSetMetaData getMetaData()
                                  throws SQLException
    检索此 ResultSet 对象的列的编号、类型和属性。 返回:
    此 ResultSet 对象的列的描述 
    抛出: 
    SQLException - 如果发生数据库访问错误
    ========================ResultSetMetaData.getColumnName
    String getColumnName(int column)
                         throws SQLException
    获取指定列的名称。 参数:
    column - 第一列是 1,第二个列是 2,…… 
    返回:
    列名称 
    抛出: 
    SQLException - 如果发生数据库访问错误
    =================ResultSetMetaData.getTableName
    String getTableName(int column)
                        throws SQLException
    Gets the designated column's table name. Parameters:
    column - the first column is 1, the second is 2, ... 
    Returns:
    table name or "" if not applicable 
    Throws: 
    SQLException - if a database access error occurs
      

  16.   

    “正则轻松!”“正则表达式”……
    这种回答不如不要回答啦,到底有没有解决过同类问题啊?楼主,我正好在做这种BT的事情,所以刚好搜到这里,说实话,到目前仍然没有很好的解决办法,我把几个我尝试过的路子拿出来讨论一下。分两部分:【字段名】
    这个好办,通过ResultSetMetaData就可以获取每列的字段别名(Alias),而字段别名(Alias)和字段名(Field)之间的对应关系可以通过正则表达式截取字段区域,然后用StringTokenizer以","为分割符……这样分析出一个对照表。
    这个分析确实简单,不写代码了,共享一下我截取SQL语句字段区域的正则:
      String str = sql.toUpperCase();
      str = str.replaceFirst("SELECT \\s*", "");
      str = str.replaceAll(" \\s*FROM .+", "");【表名】
    这个是让人郁闷的地方,楼上贴的ResultSetMetaData.getTableName()它只是JDBC的规范,实现不实现是各个数据库驱动厂商的事情。
    如果他有真正写代码验证,就会发现Oracle的thin根本没有实现这个方法,返回的总是"",我试了Oracle, SQLSvr, MySQL,只有MySQL有实现这个方法,所以此路不通……象上面那样搞个对照表如何?万一遇到"SELECT A.*, B.* FROM ..."这样的语句,#$#$#%^&,呵呵。
    所以我只能规定一个SQL语句里面只能用一个".*",例如"SELECT A.CODE, B.*, C.NAME FROM ..."这种语句中,可以通过自己做一个词法解析器计算出A的字段个数和对应关系,C的字段个数和对应关系,然后在查询后用ResultSetMetaData.getColumnCount()扣减A表和C表的字段数,得到B.*的字段数,这样就形成一个HashMap,key是ColumnIndex,value是TableName。目前这个方案是我能想到的唯一“不用查询两次数据库”的解决方案了,希望对你有帮助,@_@,遇到这种BT的需求……没辙,共勉一下。
      

  17.   

    对哦,以为蛮简单,看了 yeliming(贱神) 的答复,才想到的确很满分