【问题标题】:JDBC Why is it returning me all available tables?JDBC 为什么它返回我所有可用的表?
【发布时间】:2011-12-05 17:22:30
【问题描述】:

我有一段相当复杂的代码,所以我不能全部展示出来,但这部分很简单。

我有一个SELECT * FROM myTable,它返回一个结果集给这个方法,应该打印它,toUse 是传递给这个方法的结果集的名称:

ResultSetMetaData rsmd = (ResultSetMetaData) toUse.getMetaData();      

          System.out.println("");

          int numberOfColumns = rsmd.getColumnCount();

          for (int i = 1; i <= numberOfColumns; i++) {
            if (i > 1) System.out.print(",  ");
            String columnName = rsmd.getColumnName(i);
            System.out.print(columnName);
          }
          System.out.println("");

          while (toUse.next()) {
            for (int i = 1; i <= numberOfColumns; i++) {
              if (i > 1) System.out.print(",  ");
              String columnValue = toUse.getString(i);
              System.out.print(columnValue);
            }
            System.out.println("");
          }

不是打印出我从中选择的表,而是执行SHOW TABLES; 命令?

编辑:

我认为这与之前的运行有关:

java.sql.DatabaseMetaData meta = con.getMetaData();
        results = meta.getTables(null, null, null, new String[]{"TABLE"});

        while (results.next()) {

          String tableName = results.getString("TABLE_NAME");
          if(tableName.equals(parameters)){
              return true;
          }

        }
    results.close();
    return false;

【问题讨论】:

  • ResultSetMetaData 也返回所有可用的(取决于数据库中的用户访问)数据库表,
  • 您能否显示查询以及如何生成toUse 字段?
  • 不是真的,这是一大堆在代码中跳跃的负载。但我确信冲突是由早期运行的这段代码引起的 - 请参阅主编辑
  • @Eric 我误读了您的问题,看来您设法将第二个 sn-p 的结果集作为toUse 传递给第一个。如果这是真的,你真的应该重构。

标签: java jdbc


【解决方案1】:

除非您的 jdbc 驱动程序以某种方式损坏,否则在对 ResultSet 调用 .getMetaData() 之前在 Connection 上调用 .getMetaData() 应该没有问题。您很可能不小心更改了 toUse 的值。验证您没有意外更改其值的一种方法是将局部变量设为 final。

附:而不是这个:

for (int i = 1; i <= numberOfColumns; i++) {
    if (i > 1) System.out.print(",  ");
    String columnValue = toUse.getString(i);
    System.out.print(columnValue);
}

这样做:

String delimiter = "";
for (int i = 1; i <= numberOfColumns; i++) {
    String columnValue = toUse.getString(i);
    System.out.print(delimiter);
    System.out.print(columnValue);
    delimiter = ",  ";
}

循环内不需要分支条件。

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多