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

Java 无法使用databasemetadata检索数据库中存在的所有表属性,java,jdbc,Java,Jdbc,我正在尝试访问数据库元数据,以检索其中存在的所有表。 getTables应返回10列的ResultSet 当我试图迭代ResultSet以获取所有列数据时,我得到 Exception in thread "main" java.sql.SQLException: Invalid column index 我从第一行检索前5列数据,然后发生异常 打印第6列时,键入\u CAT 相关代码: DatabaseMetaData dbmd = connection1.getMetaData();

我正在尝试访问
数据库元数据
,以检索其中存在的所有表。
getTables
应返回10列的
ResultSet

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

Exception in thread "main" java.sql.SQLException: Invalid column index
我从第一行检索前5列数据,然后发生异常 打印第6列时,
键入\u 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("");
        }
DatabaseMetaData dbmd=connection1.getMetaData();
ResultSet rs=dbmd.getTables(null,null,null,新字符串[]{“TABLE”});
while(rs.next()){

对于(int i=1;i而不是使用值11,请尝试获取并确定列计数以确认检索到的列:

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

从中,您可以获得列名和值,并使用
getColumnName(int)
方法确认正在检索的内容。

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

尽管JDBC指定了结果集的列(至少)如果返回,则由驱动程序实现者实际正确定义
ResultSet
及其值。JDBC“只是”一个规范和一组接口,因此它无法在运行时确保所有驱动程序返回所有指定列。有认证测试,但这需要官僚障碍(开源)或巨额资金+官僚障碍(商业),因此并非所有JDBC驱动程序实现者都会费心测试法规遵从性

在JDBC 2中(Java 1.3)(指向Java 1.3 apidoc的链接)只返回五列:

  • 表格\u目录字符串=>表格目录(可能为空)
  • 表格模式字符串=>表格模式(可能为空)
  • 表格名称字符串=>表格名称
  • 表类型String=>表类型。典型类型为“表”、“视图”、“系统表”、“全局临时”、“本地临时”、“别名”、“同义词”
  • 备注String=>表格上的解释性备注
  • 而JDBC 3.0(/)、JDBC 4.0()和JDBC 4.1()又定义了5列:

  • 表格\u目录字符串=>表格目录(可能是
    null
  • 表\u架构String=>表架构(可能是
    null
  • 表格名称字符串=>表格名称
  • 表类型String=>表类型。典型类型为“表”、“视图”、“系统表”、“全局临时”、“本地临时”、“别名”、“同义词”
  • 备注String=>表格上的解释性备注
  • TYPE_CATString=>类型目录(可能是
    null
  • TYPE_SCHEMString=>类型架构(可能是
    null
  • TYPE\u NAMEString=>类型名称(可能是
    null
  • 自引用列名称String=>类型化表的指定“标识符”列的名称(可能是
    null
  • REF\u GENERATIONString=>指定如何创建自引用列名称中的值。值为“系统”、“用户”、“派生”。(可能为
    null

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

    从1开始计数似乎有些奇怪。@Randy:JDBC就是这样工作的(那里的一切都是基于1的)。请尝试使用
    rs.getMetadata().getColumnCount()打印驱动程序返回的实际列数
    。也许你有一个有缺陷的JDCB驱动程序,它不符合JDBC规范。你在使用哪个DBMS和JDBC驱动程序?是的,我改变了它,它工作正常,只打印前4列,你不认为结果中有10列吗?我可以正确地检索所有4列的列名。我的q问题是,为什么它不返回所有的表属性、所有的10列标记我正在使用的ojdbc14 jar onlyUpgrade到一个新版本的Oracle JDBC驱动程序(顺便说一句,ojdbc14只是告诉您它是针对Java 1.4的,而不是它是哪个版本的驱动程序)否则甲骨文就真的搞砸了,因为他们没有正确地实现他们的——因为他们购买了Sun自己的规范。