JDBC 進階資料類型是在 JDBC 2.0 核心 API 中導入的。Microsoft SQL Server 2005 JDBC Driver 會使用 JDBC 進階資料類型,將 SQL Server 資料類型轉換為 Java 程式語言可以理解的格式。
下表列出進階 SQL Server、JDBC 和 Java 程式語言資料類型之間的預設對應。
| SQL Server 類型 | JDBC 類型 (java.sql.Types) | Java 語言類型 |
|---|---|---|
varbinary(max) image |
LONGVARBINARY |
byte[] (預設值)、Blob、CharacterStream、BinaryStream、String |
text ntext varchar(max) nvarchar(max) |
LONGVARCHAR |
String (預設值)、Clob、CharacterStream、BinaryStream |
xml |
LONGVARCHAR |
String (預設值)、CharacterStream、Clob、byte[]、BinaryStream、Blob |
udt |
VARBINARY (大小上限為 8000 個位元組) |
String (預設值)、byte[]、BinaryStream、Object |
下列章節會提供如何使用 JDBC 驅動程式和進階資料類型的範例。
BLOB 和 CLOB 資料類型
JDBC 驅動程式會實作 java.sql.Blob 和 java.sql.Clob 介面的所有 JDBC 3.0 方法。使用這些方法時,您可以擷取及更新 text、ntext、xml 和 image 類型的資料行。
注意
CLOB 值可以和 SQL Server 2005 大數值資料類型搭配使用。特別是,CLOB 類型可以和 varchar(max) 與 nvarchar(max) 資料類型搭配使用,而 BLOB 類型則可以和 varbinary(max) 與 xml 資料類型搭配使用。
大數值資料類型
在舊版的 SQL Server 中,使用大數值資料類型需要特別的處理。大數值資料類型是指資料列大小上限超出 8 KB 的資料類型。SQL Server 2005 針對 varchar、nvarchar 和 varbinary 資料類型提供 max 規範,以允許 2^31 個位元組這麼大的儲存值。資料表資料行和 Transact-SQL 變數可以指定 varchar(max)、nvarchar(max) 或 varbinary(max) 資料類型。
使用大數值類型的主要狀況包括從資料庫擷取它們,或將它們加入資料庫中。下列章節說明完成這些工作的不同方法。
從資料庫擷取大數值類型
從資料庫擷取非二進位的大數值資料類型 (例如 varchar(max) 資料類型) 時,有個方法是將該資料當作字元資料流來讀取。在下列範例中,SQLServerStatement 類別的 executeQuery 方法可用於從資料庫擷取資料,並將該資料當作結果集傳回。而 SQLServerResultSet 類別的 getCharacterStream 方法可用於從結果集讀取大數值資料。
ResultSet rs = stmt.executeQuery("SELECT TOP 1 * FROM Test1");
rs.next();
Reader reader = rs.getCharacterStream(2);
注意
這個相同的方法也可以用於 text、ntext 和 nvarchar(max) 資料類型。
從資料庫擷取二進位的大數值資料類型 (例如 varbinary(max) 資料類型) 時,有數種方法可供您使用。最有效的方法就是將資料當作二進位資料流來讀取,如下所示:
ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
Rs.next();
InputStream is = rs.getBinaryStream(2);
您也可以使用 getBytes 方法,將資料當作位元組陣列來讀取,如下所示:
ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
Rs.next();
byte [] b = rs.getBytes(2);
注意
您也可以將資料當作 BLOB 讀取。不過,比起上面顯示的兩種方法,這個方法比較沒有效率。
將大數值類型加入資料庫
以 JDBC 驅動程式上傳大型資料非常適合記憶體大小的情況,至於大於記憶體的情況,資料流則是最佳的選項。不過,上傳大型資料的最有效方式,其實是透過資料流介面。
也可以選擇使用字串或位元組,如下所示:
PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (?, ?)");
pstmt.setInt(1, 1);
pstmt.setString(2, htmlStr);
pstmt.executeUpdate();
注意
此方法也可用於儲存在 text、ntext 和 nvarchar(max) 資料行中的值。
如果您在伺服器上具有影像程式庫,且必須將整個二進位影像檔上載到 varbinary(max) 資料行,則使用 JDBC 驅動程式最有效的方法就是直接使用資料流,如下所示:
Statement stmt = con.createStatement();
PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1
VALUES( ?, ? )");
FileReader in = new FileReader(new File("CLOBFile20mb.txt");
long len = fileIn.length();
int id = 1;
pstmt.setInt(1,id);
pstmt.setCharacterStream(2, in, (int)len);
pstmt.executeUpdate();
in.close();
注意
使用 CLOB 或 BLOB 方法並不是上載大型資料的最有效方法。
修改資料庫中的大數值類型
在多數情況下,在資料庫上更新或修改大數值的建議方法是使用 UPDATE、WRITE 和 SUBSTRING 這類 Transact-SQL 命令,透過 SQLServerPreparedStatement 和 SQLServerCallableStatement 類別傳遞參數。
如果您必須在大型文字檔 (例如封存的 HTML 檔案) 中取代文字的例項,可以使用 Clob 物件,如下所示:
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test1");
rs.next();
Clob clob = rs.getClob(2);
long pos = clob.position("dog", 1);
clob.setString(1, "cat", len, 3);
rs.updateClob(2, clob);
rs.updateRow();
此外,您可以在伺服器上執行所有工作,而只將參數傳遞至準備好的 UPDATE 陳述式。
如需大數值類型的詳細資訊,請參閱《SQL Server 線上叢書》中的<使用大數值類型>(Using Large-Value Types)。
XML 資料類型
SQL Server 2005 提供的 xml 資料類型,可讓您在 SQL Server 資料庫中儲存 XML 文件和片段。xml 資料類型是 SQL Server 中的內建資料類型,而且與其他內建類型有些相似,例如 int 與 varchar。如同其他內建類型,您可以將 xml 資料類型當做建立資料表時的資料行類型;當做變數類型、參數類型或函數傳回的類型使用;或者在 Transact-SQL CAST 和 CONVERT 函數中使用。
在 JDBC 驅動程式中,xml 資料類型可以對應為字串、位元組陣列、資料流、CLOB 或 BLOB 物件。預設表示法為字串。JDBC 驅動程式中 xml 資料類型的實作提供下列項目的支援:
在大多數的一般程式設計案例中,存取 XML 作為標準 Java UTF-16 字串
UTF-8 和其他 8 位元編碼 XML 的輸入
採用 UTF-16 編碼以與其他 XML 處理器和磁碟檔案進行交換時,存取 XML 作為具有開頭 BOM 的位元組陣列
SQL Server 在 UTF-16 編碼的 XML 中需要開頭 BOM。提供 XML 參數值作為位元組陣列時,應用程式必須提供此項。SQL Server 一定會將 XML 值輸出為不含 BOM 或內嵌編碼宣告的 UTF-16 字串。擷取 XML 值當作 byte[]、BinaryStream 或 Blob 時,會將 UTF-16 BOM 附加至值的開頭。
注意
JDBC 驅動程式不支援讀取 xml 資料類型的預存程序輸出參數。不過,它支援使用 xml 資料類型做為輸入參數。如果您必須使用 xml 資料類型做為輸出參數,則必須先將預存程序中的 xml 資料類型轉換為 VARCHAR 或 LONGVARCHAR,之後才能讀取。
如需有關 xml 資料類型的詳細資訊,請參閱《SQL Server 線上叢書》中的<xml 資料類型>。
使用者定義資料類型
SQL Server 2005 中導入使用者自訂類型 (UDT),可讓您在 SQL Server 資料庫中儲存物件和自訂資料結構,因而擴充了 SQL 類型系統的功能。UDT 可包含多個資料類型並可具有不同的行為,此點與只含單一 SQL Server 系統資料類型組的傳統別名資料類型有所不同。使用能產生可驗證程式碼並由 Microsoft .NET Common Language Runtime (CLR) 支援的任何語言,即可定義 UDT。這包括 Microsoft Visual C# 和 Visual Basic .NET。資料會公開為 .NET Framework 類別或結構的欄位和屬性,而行為則是由類別或結構的方法所定義。
在 SQL Server 2005 中,UDT 可以用做資料表的資料行定義、Transact-SQL 批次中的變數,或是 Transact-SQL 函數或預存程序的引數。
注意
JDBC 驅動程式在 UDT 資料行上不支援 AsciiStream 和 CharacterStream 方法的 getter 或 setter 方法。此外,如同 xml 資料類型一般,JDBC 驅動程式也不支援讀取 UDT 資料類型的預存程序輸出參數。不過,它支援使用 udt 資料類型作為輸入參數。如果您必須使用 udt 資料類型做為輸出參數,則必須先將預存程序中的 udt 資料類型轉換為 varbinary(max) 資料類型,之後才能讀取。
如需使用者定義資料類型的詳細資訊,請參閱《SQL Server 線上叢書》中的<使用和修改使用者自訂類型的執行個體>(Using and Modifying Instances of User-defined Types)。