【发布时间】: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)失败。
如果您想要完整项目(带有针对 h2、hsqldb、derby 和 sql server 的测试),请执行以下操作:
git clone git://github.com/sensui/InMemoryColumns.git
cd InMemoryColumns
gradlew
所有的依赖都会被自动下载。如果要检查库版本,请查看 build.gradle 脚本。
现在在您最喜欢的 IDE(eclipse 或 idea)中导入项目。
测试在DatabaseMetadataCheckerTests 类(canListColumnsForTable 和canCheckIfColumnsExistInTable)中可用。
通常你不应该修改这些。我创建了 4 个测试类,它们为每个内存数据库提供连接详细信息,您需要运行它们(DatabaseMetadataCheckerTests 是抽象的,因此您不必运行它)。
注意:
当/如果您找到解决方案而不是该特定数据库的测试将通过。
只需扩展 DatabaseMetadataCheckerTests 类并提供连接详细信息(检查其他测试),您就可以轻松尝试其他数据库,如 Oracle 或 MySQL。
问题已解决
表名和列名应为大写。详情请查看this commit。
【问题讨论】:
-
什么失败了?您没有提供很多甚至有助于理解问题的信息。
-
@a_horse_with_no_name:很抱歉,我发布了错误的示例...我现在修复了它...您可以克隆项目并查看完整代码。
-
@IgorPopov 我们不会调试您的代码:请描述您遇到的导致测试失败的实际问题。
-
@MarkRotteveel:这是一个 SSCCE (sscce.org)。实际上,我真的不知道是什么原因......他们只在内存数据库中失败。在 SQL Server 上,它们通过 :|
-
@a_horse_with_no_name: 我在测试中使用的所有表和列都是小写的