Java 对于MS SQL Server,为什么“is_AUTOINCREMENT元数据”列根据类型返回不一致的值?
我试图从数据库连接动态获取数据库模式信息,但遇到了一个奇怪的问题。我甚至不确定这在结果集中是如何发生的,但这只发生在MS SQL Server上。当我使用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<
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) + ")");