標籤:
ResultSet 介面提供用於從當前行擷取列值的擷取 方法(getBoolean、getLong 等)。可以使用列的索引編號或列的名稱擷取值。一般情況下,使用列索引較為高效。列從 1 開始編號。為了獲得最大的可移植性,應該按從左至右的順序讀取每行中的結果集列,每列只能讀取一次。
對於擷取方法,JDBC 驅動程式嘗試將底層資料轉換為在擷取方法中指定的 Java 類型,並返回適當的 Java 值。JDBC 規範有一個表,顯示允許的從 SQL 類型到 ResultSet 擷取方法所使用的 Java 類型的映射關係。
|
SQL Server 類型 |
JDBC 類型 (java.sql.類型) |
Java 語言類型 |
|
bigint |
BIGINT |
long |
|
timestamp
binary |
BINARY |
byte[] |
|
bit |
BIT |
Boolean |
|
charnchar |
CHAR |
String |
|
decimal
money
smallmoney |
DECIMAL |
java.math.BigDecimal |
|
float |
DOUBLE |
double |
|
int |
INTEGER |
int |
|
image |
LONGVARBINARY |
byte[] |
|
text
ntext |
LONGVARCHAR |
String |
|
numeric |
NUMERIC |
java.math.BigDecimal |
|
real |
REAL |
float |
|
smallint
tinyint |
SMALLINT |
short |
|
datetime
smalldatetime |
TIMESTAMP |
java.sql.Timestamp |
|
varbinary |
VARBINARY |
byte[] |
|
varchar
nvarchar
uniqueidentifier |
VARCHAR |
String |
注意: JDBC 驅動程式目前不支援 SQL Server sqlvariant 資料類型。如果使用查詢從包含 sqlvariant 資料類型列的表中檢索資料,則會發生異常。
Getter 方法轉換
基於 SQL Server 2005 的資料類型,以表包含 SQLServerResultSet 類的 get<Type> 方法的 JDBC 驅動程式轉換圖,以及 SQLServerCallableStatement 類的 get<Type> 方法支援的轉換。
JDBC 驅動程式的 getter 方法支援三種基本的轉換類別:
- Non-Lossy (x) :在 getter 類型等於或小於基礎伺服器類型的情況下執行轉換。例如,對基礎伺服器的十進位數列調用 getBigDecimal 時,無需進行轉換。
- Converted (y) :從數字伺服器類型到 Java 語言類型的轉換,此時的轉換為常規轉換,並遵循 Java 語言轉換規則。對於這些轉換,總是直接截取有效位元(從不四捨五入),而溢出則按目標類型模數處理,以較小者為準。例如,對包含“1.9999”的基礎十進位數列調用 getInt 將返回“1”;如果基礎十進位數值為“3000000000”,則 int 值將溢出為“-1294967296”。
- Data Dependent (z) :從基礎字元類型轉換到數字類型時,要求字元類型所包含的值可轉換成數字類型。不執行其他轉換。如果值對於 getter 類型過大,則該值無效。例如,如果對包含“53”的 varchar(50) 列調用 getInt ,則該值作為 int 返回;但如果基礎值為“xyz”或“3000000000”,則發生錯誤。
(摘自微軟的sqljdbc協助文檔)
1. ResultSet中對於getDouble,getFloat,getInt方法由於返回的是基本類型資料,所以null變為了0(如果值為 SQL NULL ,則傳回值為 0 )。這給我們帶來了不少麻煩。為了避免這個問題需要藉助ResultSet#wasNull()方法
2. ResultSet#getDate。以前沒注意過這個傢伙返回的類型是java.sql.Date,探索資料庫欄位類型為datetime時返回來的資料只有年月日,用 ResultSet#getTimestamp就沒問題,鬱悶,到現在還不知道為什麼。
3. 相關資源:
http://java.sun.com/products/jdbc/overview.html
http://msdn.microsoft.com/zh-cn/data/aa937724(en-us).aspx
SQLServer類型與Java類型轉換問題解決