Java 对于MS SQL Server,为什么“is_AUTOINCREMENT元数据”列根据类型返回不一致的值?

Java 对于MS SQL Server,为什么“is_AUTOINCREMENT元数据”列根据类型返回不一致的值?,java,resultset,jtds,Java,Resultset,Jtds,我试图从数据库连接动态获取数据库模式信息,但遇到了一个奇怪的问题。我甚至不确定这在结果集中是如何发生的,但这只发生在MS SQL Server上。当我使用ResultSet.getString()请求时,“IS\u AUTOINCREMENT”列值被正确检索为“YES”。但是,当我使用request.getBoolean()请求它时,对于自动递增列,它会错误地返回FALSE public Collection<DBTable> getTables() { HashSet<

我试图从数据库连接动态获取数据库模式信息,但遇到了一个奇怪的问题。我甚至不确定这在结果集中是如何发生的,但这只发生在MS SQL Server上。当我使用
ResultSet.getString()
请求时,
“IS\u AUTOINCREMENT”
列值被正确检索为
“YES”
。但是,当我使用
request.getBoolean()
请求它时,对于自动递增列,它会错误地返回
FALSE

public Collection<DBTable> getTables() {
    HashSet<DBTable> tables = new HashSet<>();
    try {
        ResultSet rs = this.conn().getMetaData().getTables(this.conn().getCatalog(), null, null, new String[] { "TABLE" });
        while (rs.next()) {
            String catalog = rs.getString("TABLE_CAT");
            String schema = rs.getString("TABLE_SCHEM"); 
            String name = rs.getString("TABLE_NAME");
            DBTable table = new DBTable(catalog, schema, name);
            ResultSet columns = this.conn().getMetaData().getColumns(catalog, schema, name, null);
            while (columns.next()) {
                String columnName = columns.getString("COLUMN_NAME");
                int dataType = columns.getInt("DATA_TYPE"); // from java.sql.Types
                String typeName = columns.getString("TYPE_NAME");
                int columnSize = columns.getInt("COLUMN_SIZE");
                boolean isNullable = columns.getBoolean("IS_NULLABLE");
                boolean isAutoIncrement = columns.getBoolean("IS_AUTOINCREMENT");
                String autoIncString = columns.getString("IS_AUTOINCREMENT");
                if (autoIncString.equals("YES") && !isAutoIncrement)
                    throw new IllegalStateException("Why is string YES but boolean FALSE?");
                table.addColumn(new DBColumn(columnName, dataType, typeName, columnSize, isNullable, isAutoIncrement));
            }
            columns.close();
            tables.add(table);
        }
        rs.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return tables;
}

这验证了对于MySQL和MS SQL而言,
“IS_AUTOINCREMENT”
列作为字符串返回(数据类型1来自
java.SQL.Types
)。因此,我觉得我的解决方案就是将它与
“YES”
进行比较,使之成为现实。但我还是想知道这里发生了什么。有什么想法吗?

我想在较低的层次上,“是”的答案是以字符串形式键入的,而不是布尔值形式键入的。然后它以字符串的形式返回给您

对于元数据查询来说,这类事情并非闻所未闻,它们通常在JDBC驱动程序中以时髦的方式组合在一起,并且取决于底层数据库以系统表的方式提供什么

设置字符串的真值类型答案的格式可能更容易(以最小公分母为基础),特别是因为“布尔”支持和数据库之间的兼容性差异很大

Java规范还指出,所有这些都应作为字符串返回

见: -


长话短说——这就是它的方式,只需使用它。有一点需要注意的是:我个人不会依赖于答案的确切情况。

同样的情况发生在
IS_NULLABLE
列上。。。现在我想知道这是否是
JTDS
getBoolean()
的一个更普遍的问题。
for (int x = 1; x <= columns.getMetaData().getColumnCount(); x++)
    System.out.println(x + ": " + columns.getMetaData().getColumnName(x)+ " (" + columns.getMetaData().getColumnType(x) + ")");