【问题标题】:java.sql.DatabaseMetaData.getPrimaryKeys() returns empty resultjava.sql.DatabaseMetaData.getPrimaryKeys() 返回空结果
【发布时间】: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(),以便我们可以看到使用的值)

标签: java sql-server spring jdbc metadata


【解决方案1】:

您可能需要在请求主键时设置架构。

String schema = "your_schema_name"
ResultSet rs = dm.getPrimaryKeys(null, schema, dbRecord.getTablename());

您的 SQL Server 可能为您创建的所有数据库使用默认架构,可能是 dbo 或用于连接到数据库的用户名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2021-05-01
    • 2017-08-25
    • 2013-09-27
    相关资源
    最近更新 更多