為了將 Java 程式語言資料類型轉換為 SQL Server 資料類型,Microsoft SQL Server 2005 JDBC Driver 提供 JDBC 規格所需要的資料類型轉換。為了增加更多彈性,Object、String 和 byte[] 這些資料類型都可以互相轉換。
Getter 方法轉換
根據 SQL Server 2005 資料類型,下列圖表包含 SQLServerResultSet 類別之 get<Type> 方法的 JDBC 驅動程式轉換對應,以及 SQLServerCallableStatement 類別之 get<Type> 方法的支援轉換。
.gif)
JDBC 驅動程式的 getter 方法所支援的轉換有三種基本類別:
不失真 (x):轉換的情況為,getter 類型與基礎伺服器類型相同或更小。例如,在基礎伺服器十進位資料行上呼叫 getBigDecimal 時,不需要轉換。
轉換 (y):從數值伺服器類型轉換為 Java 語言類型,這是一般轉換並且會遵循 Java 語言轉換規則。針對這些轉換,一定會截斷有效位數 (絕對不會進位),而溢位則會當做目的地類型的模數來處理 (也就是較小)。例如,在含有 "1.9999" 的基礎 decimal 資料行上呼叫 getInt 將會傳回 "1";而如果基礎 decimal 值是 "3000000000",則 int 值會溢位為 "-1294967296"。
視資料而定 (z):從基礎字元類型到數值類型的轉換,需要字元值包含可轉換為該類型的值。不會執行其他轉換。如果該值對於 getter 類型來說太大,則該值無效。例如,如果在含有 "53" 的 varchar(50) 資料行上呼叫 getInt,則會當做 int 傳回值;但如果基礎值為 "xyz" 或 "3000000000",則會擲回錯誤。
Setter 方法轉換
針對傳遞至 SQLServerResultSet 類別之 update<Type> 方法,以及 SQLServerPreparedStatement 類別之 setObject<Type> 方法的 Java 具類型資料,將套用下列轉換。
.gif)
不具有指定目標類型的 setObject 方法將使用預設對應。參數的具類型 setter、SQLServerPreparedStatement 類別的 set<Type> 方法,以及 SQLServerCallableStatement 類型的 set<Type> 方法,也會使用預設的 Java 到 JDBC 類型對應,並會將該類型傳遞至伺服器。伺服器會嘗試任何一種轉換,並會在發生失敗時傳回錯誤。
至於 String 資料類型,如果值超出 VARCHAR 的長度,則會對應至 LONGVARCHAR。這一點對 byte[] 來說也相同。長度超過 VARBINARY 的值會變成 LONGVARBINARY。
JDBC 驅動程式的 setter 方法所支援的轉換有兩種基本類別:
不失真 (x):轉換的數值狀況為,setter 類型與基礎伺服器類型相同或更小。例如,在基礎伺服器 decimal 資料行上呼叫 setBigDecimal 時,不需要轉換。針對數值到字元的轉換,Java numeric 資料類型會轉換為 String。例如,以值 "53" 在 varchar(50) 資料行上呼叫 setDouble,會在該目的地資料行中產生字元值 "53"。
轉換 (y):從 Java numeric 類型轉換到較小的基礎伺服器 numeric 類型。這是一般轉換並會遵循 SQL Server 轉換慣例。有效位數一律會截斷 (絕不進位),而溢位則會擲出未支援的轉換錯誤。例如,在基礎整數資料行上使用值為 "1.9999" 的 updateDecimal,會在目的地資料行上產生 "1";但如果傳遞 "3000000000",則驅動程式會擲出錯誤。
SQL Server 會執行大量 set 和 update 轉換,並會在發生問題時將錯誤傳回到 JDBC 驅動程式。用戶端轉換是例外狀況,並且只能在 date、time、timestamp、Boolean 和 String 值中執行。
至於 updateObject 和 setObject,方法會查詢所傳遞物件的類型,並呼叫適當的具類型 setter 方法。