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() 返回空结果的主要内容,如果未能解决你的问题,请参考以下文章

Java判断数据库表是否存在的方法

Java判断数据库表是否存在的方法

Java判断数据库表是否存在的方法

代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件)

Java判断数据库表是否存在的方法