java.sql.DatabaseMetaData.getPrimaryKeys() 返回空结果
Posted
技术标签:
【中文标题】java.sql.DatabaseMetaData.getPrimaryKeys() 返回空结果【英文标题】:java.sql.DatabaseMetaData.getPrimaryKeys() returns empty result 【发布时间】:2016-09-09 16:15:19 【问题描述】:我正在开发 Spring Boot 并使用 JdbcTemplate。 我需要在运行时获取表列名。 为什么 getPrimaryKeys() 返回空记录? 我的目标数据库是 SQL Server。 我的代码在这里...
@RestController
@RequestMapping("/db")
public class WebPosDBController
@Autowired
private JdbcTemplate jdbcTemplate;
// ...
private void loadMetadata(DBRecord dbRecord)
try
Connection conn = jdbcTemplate.getDataSource().getConnection();
DatabaseMetaData dm = conn.getMetaData();
ResultSet rs = dm.getPrimaryKeys(null, null, dbRecord.getTablename());
List<String> pkNames = new ArrayList<>();
while (rs.next())
// NEVER GET HERE
pkNames.add(rs.getString("COLUMN_NAME"));
rs.close();
rs = dm.getColumns(null, null, dbRecord.getTablename(), null);
List<String> fieldNames = new ArrayList<>();
while (rs.next())
fieldNames.add(rs.getString("COLUMN_NAME"));
rs.close();
conn.close();
catch (SQLException e)
e.printStackTrace();
// ...
【问题讨论】:
您使用的是哪个 JDBC 驱动程序? ...微软的? ...jTDS? ...? 显示表格的 DDL 并用最简单的版本替换您的代码(即:使用硬编码值而不是dbRecord.getTablename()
,以便我们可以看到使用的值)
【参考方案1】:
您可能需要在请求主键时设置架构。
String schema = "your_schema_name"
ResultSet rs = dm.getPrimaryKeys(null, schema, dbRecord.getTablename());
您的 SQL Server 可能为您创建的所有数据库使用默认架构,可能是 dbo 或用于连接到数据库的用户名。
【讨论】:
以上是关于java.sql.DatabaseMetaData.getPrimaryKeys() 返回空结果的主要内容,如果未能解决你的问题,请参考以下文章