无法使用databasemetadata检索数据库中存在的所有表属性

时间:2013-04-03 13:49:48

标签: java jdbc

我正在尝试访问databasemetadata以检索其中的所有表格。 getTables应返回10列的ResultSet

当我尝试迭代ResultSet以获取所有列数据时,我得到了

Exception in thread "main" java.sql.SQLException: Invalid column index

我从第一行检索前5列数据,然后发生异常 打印第6列时,TYPE_CAT

相关守则:

DatabaseMetaData dbmd = connection1.getMetaData();
    ResultSet rs = dbmd.getTables(null, null, null, new String[]{"TABLE"});
        while(rs.next()){
            for(int i=1;i<11;i++){
                System.out.print(rs.getString(i)+"  ");
            }
            System.out.println("");
        }

2 个答案:

答案 0 :(得分:1)

看起来您要么使用非常旧的JDBC 2驱动程序,要么驱动程序不符合JDBC 3.0,4.0和/或4.1,因为没有规范要求的所有列。

尽管JDBC指定了结果集(至少应该返回)的列,但是驱动程序实现者可以实际正确地定义ResultSet及其值。 JDBC只是一个规范和一组接口,因此它无法在运行时确保所有驱动程序返回所有指定的列。有认证测试,但这些需要官僚主义障碍(开源)或大笔资金+官僚障碍(商业),因此并非所有JDBC驱动程序实施者都需要测试合规性。

在JDBC 2(Java 1.3)DatabaseMetaData.getTables(链接到Java 1.3 apidoc)中只返回五列:

  
      
  1. TABLE_CAT String =&gt;表目录(可能为null)
  2.   
  3. TABLE_SCHEM String =&gt;表模式(可以为null)
  4.   
  5. TABLE_NAME 字符串=&gt;表名称
  6.   
  7. TABLE_TYPE 字符串=&gt;表格类型。典型的类型是“TABLE”,“VIEW”,“SYSTEM TABLE”,“GLOBAL TEMPORARY”,“LOCAL TEMPORARY”,“ALIAS”,“SYNONYM”。
  8.   
  9. 备注字符串=&gt;表格上的解释性评论
  10.   

而JDBC 3.0(Java 1.4 / Java 5),JDBC 4.0(Java 6)和JDBC 4.1(Java 7)定义了5个列:

  
      
  1. TABLE_CAT String =&gt;表目录(可能是null
  2.   
  3. TABLE_SCHEM String =&gt;表模式(可能是null
  4.   
  5. TABLE_NAME 字符串=&gt;表名称
  6.   
  7. TABLE_TYPE 字符串=&gt;表格类型。典型的类型是“TABLE”,“VIEW”,“SYSTEM TABLE”,“GLOBAL TEMPORARY”,“LOCAL TEMPORARY”,“ALIAS”,“SYNONYM”。
  8.   
  9. 备注字符串=&gt;表格上的解释性评论
  10.   
  11. TYPE_CAT String =&gt;类型目录(可能是null
  12.   
  13. TYPE_SCHEM 字符串=&gt;类型架构(可能是null
  14.   
  15. TYPE_NAME 字符串=&gt;类型名称(可能是null
  16.   
  17. SELF_REFERENCING_COL_NAME 字符串=&gt;类型表的指定“标识符”列的名称(可以是null
  18.   
  19. REF_GENERATION String =&gt;指定如何创建SELF_REFERENCING_COL_NAME中的值。值为“SYSTEM”,“USER”,“DERIVED”。 (可能是null
  20.   

您可能想要检查数据库是否有更新的驱动程序。

答案 1 :(得分:0)

不要使用11的值,而是尝试获取ResultSetMetaData并确定列数以确认检索到的列:

ResultSetMetaData rsMetaData = rs.getMetaData();
int numberOfColumns = rsMetaData.getColumnCount();

通过它,您可以获取列名称和值,并使用getColumnName(int)方法确认您要检索的内容。