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自己的规范。