6

这是让我头疼的代码:

  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)都失败了。

这是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 。

问题已解决

名和列名应该大写。检查此提交以获取详细信息。

4

1 回答 1

7

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

create table foo (id integer)将与系统目录中FOO的列名一样存储。ID

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

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

Postgres 不符合这里的标准并将所有内容折叠为小写

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

于 2013-05-03T12:41:06.617 回答