【问题标题】:Use getColumnName() or getColumnLabel() for getString()?为 getString() 使用 getColumnName() 或 getColumnLabel()?
【发布时间】:2019-09-24 19:09:08
【问题描述】:

我遇到了一个我以前从未见过的 SAS jdbc 驱动程序问题,我想知道正确的 JDBC 行为是什么。

假设我有一些ResultSetMetaData:

metadata.getColumnName(index) -> col1
metadata.getColumnLabel(index) -> Column1

这将是运行此查询时的 SQL 结果:

SELECT col1 AS Column1

ResultSet 获取值时,我希望使用这个:

rs.getString("Column1") 

但是,我似乎不得不使用:

rs.getString("col1")

这是意料之中的吗?我的假设在哪里错了?还是这是特定于驱动程序的行为?

【问题讨论】:

    标签: java jdbc sas


    【解决方案1】:

    在 JDBC 中,您通过列标签(别名)而不是列名来检索结果集的值。在您问题的代码中,检索值的正确方法是使用 rs.getString("Column1")(或 - 因为它不区分大小写 - rs.getString("COLUMN1")

    这在 API 中有记录,因为所有基于 String 的 getter 都有以下文档:

    参数:

    columnLabel - 使用 SQL AS 指定的列的标签 条款。如果未指定 SQL AS 子句,则标签为 列名

    从历史上看,JDBC 3 和更早的版本并没有清楚地区分列标签和列名,这导致驱动程序要求您通过列名获取,或者允许您同时通过列名或标签获取,或从ResultSetMetaData.getColumnLabel(int) 返回列名或从ResultSetMetaData.getColumnName(int) 返回列标签,或者具有配置选项来设置要使用的行为。

    【讨论】:

    • 谢谢!所以我正在使用的 SAS 驱动程序行为错误。
    • @RobAu 如果 SAS 驱动程序要求您使用 rs.getString("col1"),那么是的,这是其实现中的一个错误,因为这不是 JDBC 规范和 API 中指定的行为。
    【解决方案2】:

    由于您使用的是别名,因此 jdbc 似乎在该列名参数中需要别名。

    我找到了一个相关链接:DB alias Resultset。 希望这可能会有所帮助

    【讨论】:

    • 谢谢,SAS 驱动程序的行为似乎有点奇怪?
    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多