这是令我头疼的代码:
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了解详情。
答案 0 :(得分:7)
H2,HSQLDB(以及Oracle和DB2)符合SQL标准,因此不带引号的对象名称被折叠成大写(SQL Server不会这样做,它会保留您使用的任何情况,加上它可能被配置为不是字符串比较区分大小写。)
create table foo (id integer)
将FOO
存储为系统目录中的列名ID
。
因此,您需要将表名以大写形式传递给JDBC API调用。
关于将其移植到其他DBMS的说明:
Postgres不符合此处的标准,并将所有内容折叠为小写
对于MySQL,它没有明确的答案。它取决于各种配置设置(以及存储引擎和文件系统),因此您永远无法确定不带引号的表名将如何实际存储在系统中。