gpt4 book ai didi

java - SQLServer - 确定列是几何列还是地理列

转载 作者:行者123 更新时间:2023-12-01 22:33:10 25 4
gpt4 key购买 nike

有没有办法确定 Microsoft SQLServer 数据库中的列是“geometry”还是“geography”?

理想情况下,我想使用 Java/JDBC 以编程方式执行此操作。我尝试过使用 java.sql.ResultSetMetaData 但得到了不连贯的响应。

String className = rsmd.getColumnClassName(colID));
System.out.println(className);

输出:

"[B"

如果无法通过 JDBC/ResultSetMetaData 完成此操作,是否可以使用 SQL 查询来代替?

最佳答案

不幸的是,无法通过 JDBC ResultSetMetaData 类获取此信息。至少使用 Microsoft 的最新 JDBC 驱动程序 (sqljdbc_4.0.2206) 是不行的。

当前获取此信息的唯一方法是通过查询。示例:

String sql = "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS " +
"WHERE TABLE_NAME='" + tableName + "' AND COLUMN_NAME='" + columnName + "'";

我通过反编译SQLServerResultSetMetaData.class得出了这个结论。 getColumnClassName() 方法的源代码调用此:

this.rs.getColumn(paramInt).getTypeInfo().getSSType().getJDBCType().className();

该链中的关键方法是 getSSType(),它返回 SSType。 SSType 类包含数据库中的数据类型和 JDBC 数据类型之间的映射。没有“几何”或“地理”的映射。恕我直言,这是一个错误。这是 SSType 的来源:

package com.microsoft.sqlserver.jdbc;

enum SSType
{
UNKNOWN(SSType.Category.UNKNOWN, "unknown", JDBCType.UNKNOWN),
TINYINT(SSType.Category.NUMERIC, "tinyint", JDBCType.TINYINT),
BIT(SSType.Category.NUMERIC, "bit", JDBCType.BIT),
SMALLINT(SSType.Category.NUMERIC, "smallint", JDBCType.SMALLINT),
INTEGER(SSType.Category.NUMERIC, "int", JDBCType.INTEGER),
BIGINT(SSType.Category.NUMERIC, "bigint", JDBCType.BIGINT),
FLOAT(SSType.Category.NUMERIC, "float", JDBCType.DOUBLE),
REAL(SSType.Category.NUMERIC, "real", JDBCType.REAL),
SMALLDATETIME(SSType.Category.DATETIME, "smalldatetime", JDBCType.TIMESTAMP),
DATETIME(SSType.Category.DATETIME, "datetime", JDBCType.TIMESTAMP),
DATE(SSType.Category.DATE, "date", JDBCType.DATE),
TIME(SSType.Category.TIME, "time", JDBCType.TIME),
DATETIME2(SSType.Category.DATETIME2, "datetime2", JDBCType.TIMESTAMP),
DATETIMEOFFSET(SSType.Category.DATETIMEOFFSET, "datetimeoffset", JDBCType.DATETIMEOFFSET),
SMALLMONEY(SSType.Category.NUMERIC, "smallmoney", JDBCType.DECIMAL),
MONEY(SSType.Category.NUMERIC, "money", JDBCType.DECIMAL),
CHAR(SSType.Category.CHARACTER, "char", JDBCType.CHAR),
VARCHAR(SSType.Category.CHARACTER, "varchar", JDBCType.VARCHAR),
VARCHARMAX(SSType.Category.LONG_CHARACTER, "varchar", JDBCType.LONGVARCHAR),
TEXT(SSType.Category.LONG_CHARACTER, "text", JDBCType.LONGVARCHAR),
NCHAR(SSType.Category.NCHARACTER, "nchar", JDBCType.NCHAR),
NVARCHAR(SSType.Category.NCHARACTER, "nvarchar", JDBCType.NVARCHAR),
NVARCHARMAX(SSType.Category.LONG_NCHARACTER, "nvarchar", JDBCType.LONGNVARCHAR),
NTEXT(SSType.Category.LONG_NCHARACTER, "ntext", JDBCType.LONGNVARCHAR),
BINARY(SSType.Category.BINARY, "binary", JDBCType.BINARY),
VARBINARY(SSType.Category.BINARY, "varbinary", JDBCType.VARBINARY),
VARBINARYMAX(SSType.Category.LONG_BINARY, "varbinary", JDBCType.LONGVARBINARY),
IMAGE(SSType.Category.LONG_BINARY, "image", JDBCType.LONGVARBINARY),
DECIMAL(SSType.Category.NUMERIC, "decimal", JDBCType.DECIMAL),
NUMERIC(SSType.Category.NUMERIC, "numeric", JDBCType.NUMERIC),
GUID(SSType.Category.GUID, "uniqueidentifier", JDBCType.CHAR),
SQL_VARIANT(SSType.Category.VARIANT, "sql_variant", JDBCType.VARCHAR),
UDT(SSType.Category.UDT, "udt", JDBCType.VARBINARY),
XML(SSType.Category.XML, "xml", JDBCType.LONGNVARCHAR),
TIMESTAMP(SSType.Category.TIMESTAMP, "timestamp", JDBCType.BINARY);

final SSType.Category category;
private final String name;
private final JDBCType jdbcType;

private SSType(SSType.Category paramCategory, String paramString, JDBCType paramJDBCType)
{
this.category = paramCategory;
this.name = paramString;
this.jdbcType = paramJDBCType;
}

public String toString()
{
return this.name;
}

final JDBCType getJDBCType()
{
return this.jdbcType;
}

boolean convertsTo(JDBCType paramJDBCType)
{
return SSType.GetterConversion.converts(this, paramJDBCType);
}
}

关于java - SQLServer - 确定列是几何列还是地理列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27297387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com