回lastsweetop 兄弟  异常捕获了 返回的就是空值

解决方案 »

  1.   

    测试程序:
    public static void main(String[] args) {
    try {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn = DriverManager.getConnection(
    "jdbc:oracle:thin:@localhost:1521:test", "t", "t");
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt
    .executeQuery("select  po.id,po.port,ag.agent_full_name from " +
    " t_flying_port  po,t_flying_agent ag where po.agent_id=ag.agent_id ");
    ResultSetMetaData rsmd = rs.getMetaData();
       
    OracleResultSetMetaData   orsmd = (OracleResultSetMetaData) rs.getMetaData();
    orsmd.isSearchable(1);
    int num = rsmd.getColumnCount();
    for (int i = 0; i <num; i++) {
    System.out.println("=========第"+i+"列信息=========");
    System.out.println("rsmd.getColumnClassName("+(i+1)+")--->"+orsmd.getColumnClassName(i+1));
    System.out.println("rsmd.getCatalogName("+(i+1)+")--->"+orsmd.getCatalogName(i+1));
    System.out.println("rsmd.getSchemaName("+(i+1)+")--->"+orsmd.getSchemaName(i+1));
    System.out.println("rsmd.getColumnLabel("+(i+1)+")--->"+orsmd.getColumnLabel(i+1));
    System.out.println("rsmd.getColumnName("+(i+1)+")--->"+orsmd.getColumnName(i+1));
    System.out.println("rsmd.getTableName("+(i+1)+")--->"+orsmd.getTableName(i+1));
    System.out.println("rsmd.getColumnTypeName("+(i+1)+")--->"+orsmd.getColumnTypeName(i+1));
    System.out.println("===================");
    }

    } catch (ClassNotFoundException e) { e.printStackTrace();
    } catch (SQLException e) { e.printStackTrace();
    }
    }输出结果:
    =========第0列信息=========
    rsmd.getColumnClassName(1)--->java.math.BigDecimal
    rsmd.getCatalogName(1)--->
    rsmd.getSchemaName(1)--->
    rsmd.getColumnLabel(1)--->ID
    rsmd.getColumnName(1)--->ID
    rsmd.getTableName(1)--->
    rsmd.getColumnTypeName(1)--->NUMBER
    ===================
    =========第1列信息=========
    rsmd.getColumnClassName(2)--->java.lang.String
    rsmd.getCatalogName(2)--->
    rsmd.getSchemaName(2)--->
    rsmd.getColumnLabel(2)--->PORT
    rsmd.getColumnName(2)--->PORT
    rsmd.getTableName(2)--->
    rsmd.getColumnTypeName(2)--->VARCHAR2
    ===================
    =========第2列信息=========
    rsmd.getColumnClassName(3)--->java.lang.String
    rsmd.getCatalogName(3)--->
    rsmd.getSchemaName(3)--->
    rsmd.getColumnLabel(3)--->AGENT_FULL_NAME
    rsmd.getColumnName(3)--->AGENT_FULL_NAME
    rsmd.getTableName(3)--->
    rsmd.getColumnTypeName(3)--->VARCHAR2
    ===================
    数据查询结果:
            ID      PORT    AGENT_FULL_NAME
    5 500 海尔集团子公司
    4 400 TCL集团子公司
    1 100 大红鹰集团
    2 200 联想集团
    3 300 TCL集团
      

  2.   

    我不知道你的SQL是什么? 我建议你先用一个单表进行测试,
    下面是API的部分, column 是从第一列开始的。
    --------------------------------------------------------
    getTableName
    String getTableName(int column)
                        throws SQLException获取指定列的名称。 参数:
    column - 第一列是 1,第二个列是 2,…… 
    返回:
    表名称;如果没有可应用的名称,则返回 "" 
    抛出: 
    SQLException - 如果发生数据库访问错误--------------------------------------------------------------------------------getCatalogName
    String getCatalogName(int column)
                          throws SQLException获取指定列的表目录名称。 参数:
    column - 第一列是 1,第二个列是 2,…… 
    返回:
    在其中显示给定列的表的目录名称;如果可应用的名称,则返回 "" 
    抛出: 
    SQLException - 如果发生数据库访问错误
      

  3.   

    获得表名不能是不ResultSet里面的ResultSetMetaData,要用Connection里面的ResultSetMetaData方法.给个MSSQL的例子给你把,自己改去,估计大同小异:
    package com.cpoysy.test;
     
    import static java.lang.System.*;
     
    /** 导入下面要用到的所有类 */
    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.util.Scanner;
     
    public class Client {
     /**
      * 定义几个全局变量
      */
     private Connection con = null;
     
     private PreparedStatement pstmt = null;
     
     private ResultSet rs = null;
     
     private ResultSetMetaData rsmd = null;
     
     private String url = "";
     
     /**
      * 首先使用static块加载mysql的驱动,static块里面的代码在 Client类一加载就执行,且只执行一次
      */
     static {
      try {
       Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
      } catch (ClassNotFoundException e) {
       e.printStackTrace();
      }
     }
     
     /**
      * useMysql方法,功能是使用use命令进入参数指定的数据库
      * 
      * @param dbName
      *            数据库名
      * @return void
      */
     public void useMysql(String dbName) {
      url = "jdbc:microsoft:sqlserver://192.168.1.106:1433;DatabaseName=" + dbName;
      try {
       con = DriverManager.getConnection(url, "sa", "");
       out.println("数据库已改变!");
      } catch (Exception e) {
       out.println("Exception:" + e.getMessage());
      }
     }
     
     /**
      * execute 方法根据参数判断执行指定的命令
      * 
      * @param prefix
      *            命令的第一个单词
      * @param sql
      *            要执行sql语句sql语句
      */
     public void execute(String prefix, String sql) {
      if (prefix.equals("use")) {
       useMysql(sql);
      } else if (prefix.equals("show")) {
       show(sql);
      } else if (prefix.equals("desc")) {
       desc(sql);
      } else if (prefix.equals("select")) {
       select(prefix + " " + sql);
      } else if (prefix.equals("update") || prefix.equals("insert") || prefix.equals("delete")) {
       update(prefix + " " + sql);
      } else {
       out.println("错误的命令!");
      }
     }
     
     /**
      * update方法 用于执行update、insert、delete命令
      * 
      * @param sql
      *            要执行sql语句
      */
     private void update(String sql) {
      if (con == null) {
       out.println("请先使用use命令!");
      } else {
       try {
        pstmt = con.prepareStatement(sql);
        // 如果影响行数不为则说明sql语句执行成功
        if (pstmt.executeUpdate(sql) != 0) {
         out.println("执行成功!");
        }
       } catch (Exception e) {
        out.println(e.getMessage());
       }
      }
     }
     
     /**
      * select 方法,用于执行select语句。此方法写了大量的格式化语
      * 句。也使用到了jdk1.5的新语法。那就是System.out.printf()方法。 使用方法和C语言差不多。
      * 
      * @param sql
      *            要执行sql语句
      */
     private void select(String sql) {
      if (con == null) {
       out.println("请先使用use命令!");
      } else {
       try {
        pstmt = con.prepareStatement(sql);
        rs = pstmt.executeQuery();
        rsmd = rs.getMetaData();
     
        int j = 15 * rsmd.getColumnCount() + rsmd.getColumnCount() - 1;
     
        out.print("+");
        for (int i = 0; i < j; i++)
         out.print("-");
        out.print("+\n");
     
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
         out.printf("|%-15s", rsmd.getColumnName(i));
        }
        out.print("|\n+");
     
        for (int i = 0; i < j; i++)
         out.print("-");
        out.print("+\n");
     
        // 表中数据的信息
        while (rs.next()) {
         for (int i = 1; i <= rsmd.getColumnCount(); i++) {
          out.printf("|%-15s", rs.getObject(i).toString());
         }
         out.println("|");
        }
        out.print("+");
     
        for (int i = 0; i < j; i++)
         out.print("-");
        out.print("+\n");
       } catch (Exception e) {
        out.println(e.getMessage());
       }
      }
     }
      

  4.   

     
     /**
      * desc方法,用于查看指定表的具体信息,类似于mysql命令的desc语句的功能
      * 
      * @param table
      *            指定的表名
      */
     private void desc(String table) {
      if (con == null) {
       out.println("请先使用use命令!");
      } else {
       try {
        pstmt = con.prepareStatement("select * from " + table);
        rs = pstmt.executeQuery();
        rsmd = rs.getMetaData();
     
        out.print("+");
        for (int i = 0; i < 68; i++)
         out.print("-");
        out.print("+\n");
     
        out.printf("|%-25s|%-15s|%-10s|%-15s|\n", "Field", "Type",
          "Null", "Extra");
        out.print("+");
     
        for (int i = 0; i < 68; i++)
         out.print("-");
        out.print("+\n");
     
        // 表的详细信息
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
         out.printf("|%-25s", rsmd.getColumnName(i));
         out.printf("|%-15s", rsmd.getColumnTypeName(i) + "("
           + rsmd.getColumnDisplaySize(i) + ")");
         out.printf("|%-10s", ((rsmd.isNullable(i) == 1) ? "YES"
           : "NO"));
         out.printf("|%-15s|\n",
           rsmd.isAutoIncrement(i) ? "auto_increment" : "");
        }
        out.print("+");
     
        for (int i = 0; i < 68; i++)
         out.print("-");
        out.print("+\n");
     
       } catch (Exception e) {
        out.println(e.getMessage());
       }
      }
     }
     
     /**
      * show 方法,根据用户输入的信息判断是show tables 还是show databases 再进行处理
      * 
      * @param obj
      *            要查看的对象
      */
     private void show(String obj) {
      if (obj.equals("tables")) {
       if (con == null) {
        out.println("请先使用use命令!");
       } else {
        try {
         DatabaseMetaData dsmd = con.getMetaData();
         rs = dsmd.getTables(null, null, null, null);
     
         out.print("+");
         for (int i = 0; i < 78; i++)
          out.print("-");
         out.print("+\n");
     
         out.printf("|%-27s|%-12s|%-12s|%-12s|", "表名称", "表类别",
           "表类型", "表模式");
         out.println();
         out.print("+");
     
         for (int i = 0; i < 78; i++)
          out.print("-");
         out.print("+");
         out.println();
     
         while (rs.next()) {
          out.printf("|%-30s|%-15s|%-15s|%-15s|", rs
            .getString("TABLE_NAME"), rs
            .getString("TABLE_CAT"), rs
            .getString("TABLE_TYPE"), rs
            .getString("TABLE_SCHEM"));
          out.println();
         }
     
         out.print("+");
         for (int i = 0; i < 78; i++)
          out.print("-");
         out.print("+");
         out.println();
        } catch (Exception e) {
         out.println(e.getMessage());
        }
       }
      } else if (obj.equals("databases")) {
       try {
        url = "jdbc:microsoft:sqlserver://192.168.1.106:1433;DatabaseName=emhr2007";
        con = DriverManager.getConnection(url, "sa", "");
        DatabaseMetaData dsmd = con.getMetaData();
        rs = dsmd.getCatalogs();
     
        out.print("+");
        for (int i = 0; i < 30; i++)
         out.print("-");
        out.print("+");
     
        out.println();
        out.printf("|%-30s|\n", "DATABASE");
     
        out.print("+");
        for (int i = 0; i < 30; i++)
         out.print("-");
        out.print("+");
     
        out.println();
        while (rs.next()) {
         out.printf("|%-30s|\n", rs.getString(1));
        }
     
        out.print("+");
        for (int i = 0; i < 30; i++)
         out.print("-");
        out.print("+");
        out.println();
       } catch (Exception e) {
        out.println(e.getMessage());
       }
      } else {
       out.println("错误的命令!");
      }
     }
     
     public static void main(String[] args) {
      /**
       * Scanner也是jdk1.5新加进来的一个类,在java.util 包中,具体用法可以查看jdk1.5的API,这里是从键盘获
       * 得一个输入流,比用BufferedReader简单的多了。
       */
      Scanner scanner = new Scanner(System.in);
      Client client = new Client();
      out.println("查看所有数据库使用show databases命令");
      out.println("进入数据库使用use命令(use databaseName)");
      out.println("查看数据库表信息使用show tables命令");
      out.println("显示表信息使用desc命令(desc tableName)");
      out.println("执行sql命令使用select,update,delete");
      out.println("退出请使用 quit ");
      String command = "";
      while (true) {
       try {
        out.print("mysql> ");
        command = scanner.nextLine();
        // 判断输入的命令是否为quit或者QUIT,是则跳出循环,退出程序
        if (command.trim().equals("quit")
          || command.trim().equals("QUIT")) {
         break;
        }
        // 使用正则表达式去掉输入字符串的前后空格后再把中间所有超过一
        // 个空格的地方转换为一个空格
        command = command.trim().replaceAll(" +", " ");
        // 经过上面处理后取到命令的第一个关键字
        String prefix = command.substring(0, command.indexOf(" "));
        String sql = command.substring(command.indexOf(" ") + 1);
        client.execute(prefix, sql);
       } catch (Exception e) {
        out.println(e.getMessage());
       }
      }
     }
    }
      

  5.   

    首先非常感谢楼上兄弟的帮助与参与!
    我恳请诸位 花5分钟测试一下 ResultSetMetaData 类的方法
    自己测试后就知道 ResultSetMetaData 的那个方法可以返回值 那个返回"";
    API 既然提供了获得查询结果字段的表名 那么就肯定能获得!
    而现在返回的是""; 这是为什么呢?如果需要设置什么特定参数 那么在那里设置?
    再次感谢诸位!
      

  6.   

    请大家看看这个 http://edocs.bea.com.cn/wls/docs92/jdbc_drivers/oracle.html#wp1075290
    bea 对 ResultSet 的描述 ResultSetMetaDataOptions 在那里设置?
      

  7.   

    试过了,String getCatalogName(int index)返回数据库名,String getColumnName(int index)和String getColumnLable(int index)都返回的是列名称。
      

  8.   

    回 Leisure512 
    ==============
    getTableName() 值呢
    既然能返回值 那么可以不可以帖出代码和测试sql 谢谢
      

  9.   

    顶,怎么得到单张表的名字,比如我有一条sql语名,sql="select * from student";我要得到student这一张表怎么做,高人帮帮忙