2011-06-22 11 views
17

フィールド名とjdbcタイプコードを持つ配列があります。 (これらは、あなたが、私はレベル4ドライバを使用jdbc:java.sql.TypeコードからSQLタイプ名を取得

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

で見つけることができるコードをint型。

私は名前を入力し、対応するSQL(DDL)用のドライバを依頼する方法を見つけ出すことはできません。 これは、JDBCでのネイティブ方言で有用であろう。

私は
(CustomerIdの、1) (顧客名、-8)

を持っています

と私が欲しい

(はcustomerId、INT) (はcustomerId、VARCHAR(200))

私はそれで私を助ける機能を見つけることができます

? 私はjythonでzxJDBC、 経由でjdbcを使用していますので、すべてのJavaとPython DB API 2.0の機能を使用できます。

+0

まだJava 1.4を使用している場合を除き、Javadoc for Java 6(または使用しているバージョン)を使用することをお勧めします。 –

答えて

4

投稿していないJDBCメタデータメソッドを使用しているようです。あなたが見ているのは、列の型を派生させることができるJDBC type constantの列名です。より多くのメタデータを取得する方法については、java.sql APIをご覧ください。

+0

タイプのタイプは実際に質問に記載されています。 – eckes

+0

"404 申し訳ありません、このページは存在しないか、利用できなくなりました。その理由は、リンクで関連する部分を引用すると、ベターに答えてくれるのです。 –

11
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 "?"; 
} 
26

特にあなたが反射を行うことができますJavaのバージョンを使用している場合は、ここではほとんど同じことを小さなユーティリティメソッドがあり、「java.sql.TypeコードからSQLタイプ名を取得します」答えるために事:

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; 
} 

あなたのimport宣言にimport java.lang.reflect.Field;を追加します。

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

String typeName = jdbcMappings.get(-5); // now that will return BIGINT 
... 
+1

非常にいいです。誰もが必要とする場合に備えて、これをscalaに適合させました。 import scala.collection.JavaConverters.asScalaBufferConverter; val sqlTypes = classOf [java.sql.Types] .getFields.toList.map(x =>(x.get(null).asInstanceOf [Int]、x.getName()))toMap –

+0

これは受け入れられる必要があります回答。 –

+0

2017年に受け入れられた答えはヨーヨーのものでなければなりませんでしたが、私はこの答えも創造性のためにアップアップしました。 – isapir

1

春は、列挙型がJdbcTypesEnumと呼ばれる便利なヘルパーを持っていますが、これは、適切なJDBCの一部ではないことを、実に奇妙です:あなたは、次のような場所では、単純にそれを使用することを持っていたら。カラムの型を取得するときしかし、代わりに

rs = connection.getMetaData().getColumns(); 
... 
int dataType = rs.getInt("DATA_TYPE"); 

を使用して、私は

String typeName = rs.getString("TYPE_NAME"); 

を使用します。例えば、特別なVARCHAR_IGNORECASEまたはUUIDタイプでH2 databaseテーブルを検査する場合:

    dataType vs. typeName 
UUID:    -2=BINARY vs. "UUID" 
VARCHAR_IGNORECASE: 12=VARCHAR vs. "VARCHAR_IGNORECASE" 

をしかし、あなたはすべてのデータベースの文字列の型の範囲をカバーできないことに、注意してください、この場合にはintが(多少便利になります結局のところ閉じた列挙型ではない)。

17
APIのの改善により

、Javaの8のよう私たちはJDBCTypeSQLTypeを持っており、次のように他のいくつかの例と同じ精神で簡単に使用することができます。

String typeName = JDBCType.valueOf(-5).getName(); 

しかし、もちろん、なぜ最初に数値型を使用します。習慣を作り、そしてJDBCTypeで定義されたenum定数に数値のから切り替える:

String typeName = JDBCType.BIGINT.getName(); 

らほら!

しかし、DDLで使用するのに十分なものを用意するには不十分かもしれません...ベンダー固有の翻訳を実装する必要があるかもしれません。たとえば、Oracleの場合はVARCHARVARCHAR2に変換することを検討する必要があります。

関連する問題