共用方式為


使用進階資料類型

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 方法。使用這些方法時,您可以擷取及更新 textntextxmlimage 類型的資料行。

注意

CLOB 值可以和 SQL Server 2005 大數值資料類型搭配使用。特別是,CLOB 類型可以和 varchar(max)nvarchar(max) 資料類型搭配使用,而 BLOB 類型則可以和 varbinary(max)xml 資料類型搭配使用。

大數值資料類型

在舊版的 SQL Server 中,使用大數值資料類型需要特別的處理。大數值資料類型是指資料列大小上限超出 8 KB 的資料類型。SQL Server 2005 針對 varcharnvarcharvarbinary 資料類型提供 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);

注意

這個相同的方法也可以用於 textntextnvarchar(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();

注意

此方法也可用於儲存在 textntextnvarchar(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 命令,透過 SQLServerPreparedStatementSQLServerCallableStatement 類別傳遞參數。

如果您必須在大型文字檔 (例如封存的 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 中的內建資料類型,而且與其他內建類型有些相似,例如 intvarchar。如同其他內建類型,您可以將 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 資料行上不支援 AsciiStreamCharacterStream 方法的 getter 或 setter 方法。此外,如同 xml 資料類型一般,JDBC 驅動程式也不支援讀取 UDT 資料類型的預存程序輸出參數。不過,它支援使用 udt 資料類型作為輸入參數。如果您必須使用 udt 資料類型做為輸出參數,則必須先將預存程序中的 udt 資料類型轉換為 varbinary(max) 資料類型,之後才能讀取。

如需使用者定義資料類型的詳細資訊,請參閱《SQL Server 線上叢書》中的<使用和修改使用者自訂類型的執行個體>(Using and Modifying Instances of User-defined Types)。

另請參閱

其他資源

瞭解 JDBC Driver 資料類型