jdbc:从java.sql.Type代码中获取SQL类型名称

And*_*asT 29 java jython jdbc

我有一个包含字段名称和jdbc类型代码的数组.(你可以找到的那些int代码

http://download.oracle.com/javase/1.4.2/docs/api/constant-values.html#java.sql.Types.BIT

我使用4级驱动程序.

我无法弄清楚如何向驱动程序询问相应的SQL(DDL)类型名称.它在jdbc和原生方言中很有用.

我有
(CustomerId,1)(客户名称,-8)

而且我要

(customerId,INT)(customerId,VARCHAR(200))

我在哪里可以找到帮助我的功能?我通过zxJDBC在jython中使用jdbc,所以我可以使用所有java和python DB API 2.0功能.

Kar*_*thi 37

具体回答"从java.sql.Type代码获取SQL类型名称",如果你使用的是Java版本,可以做反思,这里是一个小的实用方法几乎做同样的事情:

public Map<Integer, String> getAllJdbcTypeNames() {

    Map<Integer, String> result = new HashMap<Integer, String>();

    for (Field field : Types.class.getFields()) {
        result.put((Integer)field.get(null), field.getName());
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

添加import java.lang.reflect.Field;到导入声明.完成后,只需按如下方式使用:

...
Map<Integer, String> jdbcMappings = getAllJdbcTypeNames();

String typeName = jdbcMappings.get(-5); // now that will return BIGINT
...
Run Code Online (Sandbox Code Playgroud)

  • 在2017年,可接受的答案应该是YoYo,但是我也为创造力推荐了该答案。 (2认同)

YoY*_*oYo 29

Java 8及更高版本:JDBCType&SQLType

随着API的改进,从Java 8和JDBC 4.2开始,我们已经JDBCTypeSQLType,并且与其他一些示例一样,可以简单地使用如下:

String typeName = JDBCType.valueOf(-5).getName();
Run Code Online (Sandbox Code Playgroud)

但当然,为什么要使用数字类型开头.养成习惯,并从数字切换到以下enum定义的常量JDBCType:

String typeName = JDBCType.BIGINT.getName();
Run Code Online (Sandbox Code Playgroud)

etvoilà!

但是,这可能不足以在DDL中使用足够好的东西......您可能需要实现供应商特定的翻译.例如,在Oracle的情况下,您可能需要考虑转换VARCHARVARCHAR2.


小智 12

public static String getSqlTypeName(int type) {
    switch (type) {
    case Types.BIT:
        return "BIT";
    case Types.TINYINT:
        return "TINYINT";
    case Types.SMALLINT:
        return "SMALLINT";
    case Types.INTEGER:
        return "INTEGER";
    case Types.BIGINT:
        return "BIGINT";
    case Types.FLOAT:
        return "FLOAT";
    case Types.REAL:
        return "REAL";
    case Types.DOUBLE:
        return "DOUBLE";
    case Types.NUMERIC:
        return "NUMERIC";
    case Types.DECIMAL:
        return "DECIMAL";
    case Types.CHAR:
        return "CHAR";
    case Types.VARCHAR:
        return "VARCHAR";
    case Types.LONGVARCHAR:
        return "LONGVARCHAR";
    case Types.DATE:
        return "DATE";
    case Types.TIME:
        return "TIME";
    case Types.TIMESTAMP:
        return "TIMESTAMP";
    case Types.BINARY:
        return "BINARY";
    case Types.VARBINARY:
        return "VARBINARY";
    case Types.LONGVARBINARY:
        return "LONGVARBINARY";
    case Types.NULL:
        return "NULL";
    case Types.OTHER:
        return "OTHER";
    case Types.JAVA_OBJECT:
        return "JAVA_OBJECT";
    case Types.DISTINCT:
        return "DISTINCT";
    case Types.STRUCT:
        return "STRUCT";
    case Types.ARRAY:
        return "ARRAY";
    case Types.BLOB:
        return "BLOB";
    case Types.CLOB:
        return "CLOB";
    case Types.REF:
        return "REF";
    case Types.DATALINK:
        return "DATALINK";
    case Types.BOOLEAN:
        return "BOOLEAN";
    case Types.ROWID:
        return "ROWID";
    case Types.NCHAR:
        return "NCHAR";
    case Types.NVARCHAR:
        return "NVARCHAR";
    case Types.LONGNVARCHAR:
        return "LONGNVARCHAR";
    case Types.NCLOB:
        return "NCLOB";
    case Types.SQLXML:
        return "SQLXML";
    }

    return "?";
}
Run Code Online (Sandbox Code Playgroud)

  • 现在已经过时了。此功能已在实现 [`SQLType` 的新 [`JDBCType`](https://docs.oracle.com/javase/8/docs/api/java/sql/JDBCType.html) 枚举中为您编码](https://docs.oracle.com/javase/8/docs/api/java/sql/SQLType.html),如[YoYo 的兄弟回答](/sf/answers/2131132321/ /642706)。 (2认同)

ale*_*ter 8

你需要ResultSetMetaData当前的对象ResultSet.你可以得到它getMetaData().迭代列并调用foreach列方法

  1. getColumnType(i)
  2. getColumnClassName(i)
  3. getColumnTypeName(i)

你的ResultSetMetaData.

i 表示列号(从1开始).


joo*_*ten -1

您似乎正在使用一些尚未发布的 JDBC 元数据方法。我相信您看到的是列的名称以及 JDBC类型常量,您可以从中派生列类型。查看java.sql API以了解有关如何获取更多元数据的更多信息。

  • 这不是一个答案——只是重申存在一个问题。正确的答案会向用户指出将 Types.INTEGER 等常量转换为字符串“INTEGER”的位置。 (2认同)