3

我正在尝试访问databasemetadata以检索其中存在的所有表。 getTables应该返回ResultSet10 列。

当我尝试迭代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("");
        }
4

2 回答 2

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 => 表目录(可能为空)
  2. TABLE_SCHEM String => 表模式(可能为空)
  3. TABLE_NAME String => 表名
  4. TABLE_TYPE String => 表类型。典型的类型是“TABLE”、“VIEW”、“SYSTEM TABLE”、“GLOBAL TEMPORARY”、“LOCAL TEMPORARY”、“ALIAS”、“SYNONYM”。
  5. REMARKS String => 对表格的解释性注释

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

  1. TABLE_CAT String => 表目录(可能是null
  2. TABLE_SCHEM String => 表模式(可能是null
  3. TABLE_NAME String => 表名
  4. TABLE_TYPE String => 表类型。典型的类型是“TABLE”、“VIEW”、“SYSTEM TABLE”、“GLOBAL TEMPORARY”、“LOCAL TEMPORARY”、“ALIAS”、“SYNONYM”。
  5. REMARKS String => 对表格的解释性注释
  6. TYPE_CAT String => 类型目录(可能是null
  7. TYPE_SCHEM String => 类型模式(可能是null
  8. TYPE_NAME String => 类型名称(可能是null
  9. SELF_REFERENCING_COL_NAME String => 类型表的指定“标识符”列的名称(可能是null
  10. REF_GENERATION String => 指定如何创建 SELF_REFERENCING_COL_NAME 中的值。值为“系统”、“用户”、“派生”。(可能是null

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

于 2013-04-03T17:18:12.923 回答
0

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

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

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

于 2013-04-03T14:11:11.307 回答