如何从内存数据库中检索列名?

Igo*_*pov 6 java jdbc derby h2 hsqldb

这是令我头疼的代码:

  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;
  }
Run Code Online (Sandbox Code Playgroud)

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

这是github上的链接.

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

git clone git://github.com/sensui/InMemoryColumns.git
cd InMemoryColumns
gradlew
Run Code Online (Sandbox Code Playgroud)

所有依赖项将自动下载.如果要查看库版本,请查看build.gradle脚本.

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

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

通常你不应该修改它们.我创建了4个测试类,为内存数据库中的每个提供连接细节,你需要运行它们(这DatabaseMetadataCheckerTests是抽象的,所以你不运行它).

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

问题解决了

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

a_h*_*ame 7

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

create table foo (id integer)FOO与列名一起存储ID在系统目录中.

因此,您需要将表名以大写形式传递给JDBC API调用.

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

Postgres不符合此处的标准,并将所有内容折叠为小写

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