2011-06-22 22 views
17

Tôi có một mảng có Tên Trường và mã loại jdbc. (Những int mã mà bạn có thể tìm thấy trongjdbc: Lấy Tên Loại SQL từ mã java.sql.Type

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

tôi sử dụng một điều khiển cấp độ 4.

tôi không thể tìm ra cách để yêu cầu tài xế cho SQL tương ứng (DDL) Gõ tên . Nó sẽ là hữu ích trong jdbc và trong phương ngữ bản địa.

tôi có
(ID khách hàng, 1) (CustomerName, -8)

.210

và tôi muốn

(ID khách hàng, INT) (ID khách hàng, VARCHAR (200))

Tôi có thể tìm thấy chức năng mà giúp tôi với điều đó ở đâu? Tôi đang sử dụng jdbc trong jython qua zxJDBC, để tôi có thể sử dụng tất cả chức năng API java và python DB API 2.0.

+0

Trừ khi bạn vẫn đang sử dụng Java 1.4 Tôi khuyên bạn nên sử dụng Javadocs cho Java 6 (hoặc phiên bản bạn đang sử dụng) –

Trả lời

4

Dường như bạn đang sử dụng một số phương thức siêu dữ liệu JDBC mà bạn chưa đăng. Tôi tin rằng những gì bạn đang thấy là tên của cột cùng với JDBC type constant mà từ đó bạn có thể lấy được loại cột. Hãy xem số java.sql API để đọc thêm về cách nhận thêm dữ liệu meta.

+0

Loại loại thực sự được đề cập trong câu hỏi. – eckes

+0

"404 Chúng tôi rất tiếc, trang không tồn tại hoặc không còn khả dụng". đó là lý do tại sao trích dẫn phần liên quan với liên kết tạo ra một câu trả lời btter ... –

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

Để cụ thể là trả lời "Lấy Loại SQL Tên từ mã java.sql.Type", nếu bạn đang sử dụng một phiên bản của java có thể làm phản chiếu, đây là một phương pháp hữu ích nhỏ mà khá nhiều hoạt động tương tự điều:

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

Thêm import java.lang.reflect.Field; vào tờ khai nhập của bạn. Một khi bạn đã có tại chỗ, chỉ cần sử dụng nó như sau:

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

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

Rất đẹp. Tôi thích nghi điều này cho scala trong trường hợp bất cứ ai cần nó: nhập khẩu scala.collection.JavaConverters.asScalaBufferConverter; val sqlTypes = classOf [java.sql.Types] .getFields.toList.map (x => (x.get (null) .asInstanceOf [Int], x.getName())). ToMap –

+0

Điều này phải được chấp nhận câu trả lời. –

+0

Trong năm 2017, câu trả lời được chấp nhận nên là của YoYo, nhưng tôi đã upvoted câu trả lời này cũng như cho sự sáng tạo. – isapir

1

Spring có một helper tiện dụng Enum gọi JdbcTypesEnum, nhưng nó thực sự là khá kỳ lạ, rằng đây không phải là một phần của JDBC thích hợp. Tuy nhiên, thay vì sử dụng

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

Tôi sẽ sử dụng

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

khi lấy các loại cột.Ví dụ khi kiểm tra một bảng H2 database với một đặc biệt VARCHAR_IGNORECASE hoặc UUID loại:

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

Nhưng lưu ý, rằng bạn không thể trang trải các phạm vi loại chuỗi cho tất cả các cơ sở dữ liệu, trong trường hợp này int sẽ phần nào có ích hơn (nhưng nó là sau khi tất cả không phải là một loại Enum kín).

17

Với những cải tiến trong của API, như Java 8 chúng tôi đã JDBCTypeSQLType, và trong tinh thần tương tự như một số ví dụ khác có thể được sử dụng đơn giản như sau:

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

Nhưng tất nhiên, tại sao sử dụng các loại số để bắt đầu. Thực hiện một thói quen, và chuyển sang từ của số để các enum hằng quy định tại JDBCType:

String typeName = JDBCType.BIGINT.getName(); 

et thì đấy!

Tuy nhiên, điều đó có thể không đủ để có thứ gì đó đủ tốt để sử dụng trong DDL ... bạn có thể cần triển khai bản dịch cụ thể của nhà cung cấp. Ví dụ: bạn có thể cần xem xét dịch VARCHAR thành VARCHAR2 trong trường hợp của Oracle.

Các vấn đề liên quan