Java ApacheDerby:检索空表的列名

Java ApacheDerby:检索空表的列名,java,derby,Java,Derby,在JDBC中,未设置元数据,如果结果集为空,则无法执行getColumnNames() 我尝试查询derby systables: SYS.SYSTABLES表包含REFERENCEID,COLUMNAME,COLUMNUMBER COLUMNAME是我要搜索的内容。但是我认为没有可能将此表与SYS.SYSTABLES或任何其他表联接。使用TABLEID=REFERENCEID select TABLENAME,COLUMNNAME, t.* FROM sys.systables t, sys

在JDBC中,未设置元数据,如果结果集为空,则无法执行getColumnNames()

我尝试查询derby systables:

SYS.SYSTABLES
表包含
REFERENCEID
COLUMNAME
COLUMNUMBER


COLUMNAME
是我要搜索的内容。但是我认为没有可能将此表与SYS.SYSTABLES或任何其他表联接。

使用
TABLEID=REFERENCEID

select TABLENAME,COLUMNNAME, t.* 
FROM sys.systables t, sys.syscolumns 
WHERE TABLEID = REFERENCEID and tablename = 'SYSCOLUMNS'

 TABLENAME  COLUMNNAME         REFERENCEID                          COLUMNNAME         COLUMNNUMBER COLUMNDATATYPE                                   COLUMNDEFAULT COLUMNDEFAULTID AUTOINCREMENTVALUE AUTOINCREMENTSTART AUTOINCREMENTINC
 ---------- ------------------ ------------------------------------ ------------------ ------------ ------------------------------------------------ ------------- --------------- ------------------ ------------------ ----------------
 SYSCOLUMNS AUTOINCREMENTINC   8000001e-00d0-fd77-3ed8-000a0a0b1900 AUTOINCREMENTINC              9 BIGINT                                           NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS AUTOINCREMENTSTART 8000001e-00d0-fd77-3ed8-000a0a0b1900 AUTOINCREMENTSTART            8 BIGINT                                           NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS AUTOINCREMENTVALUE 8000001e-00d0-fd77-3ed8-000a0a0b1900 AUTOINCREMENTVALUE            7 BIGINT                                           NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS COLUMNDATATYPE     8000001e-00d0-fd77-3ed8-000a0a0b1900 COLUMNDATATYPE                4 org.apache.derby.catalog.TypeDescriptor NOT NULL NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS COLUMNDEFAULT      8000001e-00d0-fd77-3ed8-000a0a0b1900 COLUMNDEFAULT                 5 java.io.Serializable                             NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS COLUMNDEFAULTID    8000001e-00d0-fd77-3ed8-000a0a0b1900 COLUMNDEFAULTID               6 CHAR(36)                                         NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS COLUMNNAME         8000001e-00d0-fd77-3ed8-000a0a0b1900 COLUMNNAME                    2 VARCHAR(128) NOT NULL                            NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS COLUMNNUMBER       8000001e-00d0-fd77-3ed8-000a0a0b1900 COLUMNNUMBER                  3 INTEGER NOT NULL                                 NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS REFERENCEID        8000001e-00d0-fd77-3ed8-000a0a0b1900 REFERENCEID                   1 CHAR(36) NOT NULL                                NULL          NULL                          NULL               NULL             NULL
publicstaticstring[]检索列(stringtablename)抛出SQLException
{
rs=st.executeQuery(“从”+表名中选择*);
rsmd=rs.getMetaData();
int numberOfColumns=rsmd.getColumnCount();
字符串名[];
名称=新字符串[numberOfColumns];

对于(int i=1;i如果结果集为空,您确定没有设置ResultSetMetaData吗?我非常确定ResultSetMetaData是大多数工具获取列信息的方式,所以听到这个消息我很惊讶。虽然这个代码片段可能是解决方案,但确实有助于提高文章的质量。请记住,您回答的问题是供阅读的这些库被用来导入导入java.sql.ResultSet;导入java.sql.SQLException;导入java.sql.Statement;导入java.sql.ResultSetMetaData;这是一个接受变量字符串的方法,在数据库中查询表中包含的所有列t检查该字符串,然后将其存储在resultset对象中,从中创建resultsetmetadata对象,以确定表中存在多少列。然后使用一个以列数为测试条件初始化为1的for循环。也就是说,我们可以将循环迭代传递到getColumnName,而不会溢出。
public static String[] retriveColumns(String tablename) throws SQLException
    {
        rs = st.executeQuery("SELECT * FROM " + tablename);
        rsmd = rs.getMetaData();
        int numberOfColumns = rsmd.getColumnCount();
        String names[];
        names = new String[numberOfColumns];
        for(int i=1; i<numberOfColumns; i++)
            {    
             names[i-1] = rsmd.getColumnName(i);
             System.out.println(names[i-1]);
            }
        return names;
   }