我正在尝试访问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("");
}
答案 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)中只返回五列:
- TABLE_CAT String =&gt;表目录(可能为null)
- TABLE_SCHEM String =&gt;表模式(可以为null)
- TABLE_NAME 字符串=&gt;表名称
- TABLE_TYPE 字符串=&gt;表格类型。典型的类型是“TABLE”,“VIEW”,“SYSTEM TABLE”,“GLOBAL TEMPORARY”,“LOCAL TEMPORARY”,“ALIAS”,“SYNONYM”。
- 备注字符串=&gt;表格上的解释性评论
醇>
而JDBC 3.0(Java 1.4 / Java 5),JDBC 4.0(Java 6)和JDBC 4.1(Java 7)定义了5个列:
- TABLE_CAT String =&gt;表目录(可能是
null
)- TABLE_SCHEM String =&gt;表模式(可能是
null
)- TABLE_NAME 字符串=&gt;表名称
- TABLE_TYPE 字符串=&gt;表格类型。典型的类型是“TABLE”,“VIEW”,“SYSTEM TABLE”,“GLOBAL TEMPORARY”,“LOCAL TEMPORARY”,“ALIAS”,“SYNONYM”。
- 备注字符串=&gt;表格上的解释性评论
- TYPE_CAT String =&gt;类型目录(可能是
null
)- TYPE_SCHEM 字符串=&gt;类型架构(可能是
null
)- TYPE_NAME 字符串=&gt;类型名称(可能是
null
)- SELF_REFERENCING_COL_NAME 字符串=&gt;类型表的指定“标识符”列的名称(可以是
null
)- REF_GENERATION String =&gt;指定如何创建SELF_REFERENCING_COL_NAME中的值。值为“SYSTEM”,“USER”,“DERIVED”。 (可能是
醇>null
)
您可能想要检查数据库是否有更新的驱动程序。
答案 1 :(得分:0)
不要使用11的值,而是尝试获取ResultSetMetaData并确定列数以确认检索到的列:
ResultSetMetaData rsMetaData = rs.getMetaData();
int numberOfColumns = rsMetaData.getColumnCount();
通过它,您可以获取列名称和值,并使用getColumnName(int)
方法确认您要检索的内容。