【问题标题】:How to retrieve column names from an in memory database?如何从内存数据库中检索列名?
【发布时间】:2013-04-27 20:13:14
【问题描述】:

这是让我头疼的代码:

  public List<String> listColumnsForTable(String tableName) throws SQLException {
    List<String> columns = new ArrayList<String>();
    DatabaseMetaData metadata = _connection.getMetaData();
    ResultSet resultSet = metadata.getColumns(null, null, tableName, null);
    while (resultSet.next())
      columns.add(resultSet.getString("COLUMN_NAME"));
    return columns;
  }

这段代码适用于 SQL Server(我还没有检查过 MySQL、Oracle 或其他),但我需要在内存数据库上运行一些集成测试。我尝试过的所有数据库(h2、hsqldb 和 derby)失败

这里是the link on github

如果您想要完整项目(带有针对 h2、hsqldb、derby 和 sql server 的测试),请执行以下操作:

git clone git://github.com/sensui/InMemoryColumns.git
cd InMemoryColumns
gradlew

所有的依赖都会被自动下载。如果要检查库版本,请查看 build.gradle 脚本。

现在在您最喜欢的 IDE(eclipse 或 idea)中导入项目。

测试在DatabaseMetadataCheckerTests 类(canListColumnsForTablecanCheckIfColumnsExistInTable)中可用。

通常你不应该修改这些。我创建了 4 个测试类,它们为每个内存数据库提供连接详细信息,您需要运行它们(DatabaseMetadataCheckerTests 是抽象的,因此您不必运行它)。

注意: 当/如果您找到解决方案而不是该特定数据库的测试将通过。 只需扩展 DatabaseMetadataCheckerTests 类并提供连接详细信息(检查其他测试),您就可以轻松尝试其他数据库,如 Oracle 或 MySQL。

问题已解决

表名和列名应为大写。详情请查看this commit

【问题讨论】:

  • 什么失败了?您没有提供很多甚至有助于理解问题的信息。
  • @a_horse_with_no_name:很抱歉,我发布了错误的示例...我现在修复了它...您可以克隆项目并查看完整代码。
  • @IgorPopov 我们不会调试您的代码:请描述您遇到的导致测试失败的实际问题。
  • @MarkRotteveel:这是一个 SSCCE (sscce.org)。实际上,我真的不知道是什么原因......他们只在内存数据库中失败。在 SQL Server 上,它们通过 :|
  • @a_horse_with_no_name: 我在测试中使用的所有表和列都是小写的

标签: java jdbc hsqldb derby h2


【解决方案1】:

H2、HSQLDB(以及 Oracle 和 DB2)符合 SQL 标准,因此未加引号的对象名称被折叠为大写(SQL Server 不这样做,它保留您使用的任何大小写,并且可能配置为不字符串比较区分大小写)。

create table foo (id integer) 将在系统目录中存储为FOO,列名为ID

因此您需要将大写的表名传递给 JDBC API 调用。

关于将其移植到其他 DBMS 的说明:

Postgres 不符合这里的标准,把所有东西都折叠成小写

对于 MySQL,它如何做到这一点没有明确的答案。它取决于各种配置设置(以及存储引擎和文件系统),因此您永远无法确定未加引号的表名将如何实际存储在系统中。

【讨论】:

    猜你喜欢
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多