【问题标题】:Apache Derby: Retrieve column names for an empty tableApache Derby:检索空表的列名
【发布时间】:2011-12-15 13:50:52
【问题描述】:

在没有设置JDBC元数据时,如果结果集为空,则无法执行getColumnNames()。

我尝试查询 derby 系统表:

SYS.SYSTABLES 表包含 REFERENCEIDCOLUMNAMECOLUMNUMBER、...

COLUMNAME 是我正在寻找的。但我认为不可能将此表与 SYS.SYSTABLES 或任何其他表连接起来。

【问题讨论】:

  • 如果结果集为空,您确定未设置 ResultSetMetaData 吗?我很确定 ResultSetMetaData 是大多数工具获取列信息的方式,所以听到这个我很惊讶。

标签: java derby


【解决方案1】:

您可以使用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

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:
      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;
         }
      

      【讨论】:

      • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因
      • 这些库都用到了 import import java.sql.ResultSet;导入java.sql.SQLException;导入 java.sql.Statement;导入 java.sql.ResultSetMetaData;这是一个接受变量字符串的方法,在数据库中查询表中与该字符串匹配的所有列,然后将其存储在结果集对象中,从中创建结果集元数据对象以找出表中存在多少列。然后使用一个初始化为 1 的 for 循环,列数作为测试条件。那就是我们可以将循环迭代传递给 getColumnName 而不会溢出。
      • 在这里我们讨论代码是否可能有用,但以必须插入或添加所有声明才能使其工作的形式呈现。一旦完成,它确实有效,但我无法让自己投票赞成。可以在此处找到更好的展示方式:tutorialspoint.com/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多