使用高级数据类型

Microsoft JDBC Driver for SQL Server 使用 JDBC 高级数据类型将 SQL Server 数据类型转换为 Java 编程语言所支持的格式。

# 备注

下表列出了高级 SQL Server、JDBC 和 Java 编程语言数据类型之间的默认映射。

SQL Server 类型 | JDBC 类型 (java.sql.Types) | Java 语言类型
--- | --- | ---
varbinary(max) image | LONGVARBINARY | byte[]（默认）、Blob、InputStream、String
text varchar(max) | LONGVARCHAR | String（默认）、Clob、InputStream
ntext nvarchar(max) | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) | String（默认）、Clob、NClob (Java SE 6.0)
xml | LONGVARCHAR SQLXML (Java SE 6.0) | String（默认）、InputStream、Clob、byte[]、Blob、SQLXML (Java SE 6.0)
udt | VARBINARY | String（默认）、byte[]、InputStream

以下部分提供了关于如何使用 JDBC Driver 和高级数据类型的示例。

# BLOB、CLOB 和 NCLOB 数据类型

JDBC Driver 实现了 java.sql.Blob、java.sql.Clob 和 java.sql.NClob 接口的所有方法。

CLOB 值可与 SQL Server 2005（或更高版本）大值数据类型一同使用。具体来说，CLOB 类型可以与 varchar(max) 和 nvarchar(max) 数据类型一起使用，BLOB 类型可以与 varbinary(max) 和 image 数据类型一起使用，NCLOB 类型可以与 ntext 和 nvarchar(max) 一起使用。

# 大值数据类型

在 SQL Server 的早期版本中，使用大值数据类型需要特殊处理。大值数据类型是指超过 8 KB 最大行大小的数据类型。SQL Server 针对 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 驱动程序的最有效方法是直接使用流，如下所示：

    PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (Col1, Col2) VALUES(?,?)");
    File inputFile = new File("CLOBFile20mb.jpg");
    FileInputStream inStream = new FileInputStream(inputFile);
    int id = 1;
    pstmt.setInt(1,id);
    pstmt.setBinaryStream(2, inStream);
    pstmt.executeUpdate();
    inStream.close();

使用 CLOB 或 BLOB 方法不是上载较大数据的有效方法。

# 修改数据库中的大值类型

在大多数情况下，对更新或修改数据库中的大值建议使用的方法为：使用 Transact-SQL 命令（例如 UPDATE、WRITE 和 SUBSTRING）通过 SQLServerPreparedStatement 和 SQLServerCallableStatement 类传递参数。

如果必须替换较大文本文件（例如已存档的 HTML 文件）中某个字的实例，则可以使用 Clob 对象，如下所示：

    String SQL = "SELECT * FROM test1;";
    Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    ResultSet rs = stmt.executeQuery(SQL);
    rs.next();

    Clob clob = rs.getClob(2);
    long pos = clob.position("dog", 1);
    clob.setString(pos, "cat");
    rs.updateClob(2, clob);
    rs.updateRow();

此外，可以在服务器上完成全部工作，仅将参数传递到准备好的 UPDATE 语句。

有关大值类型的详细信息，请参阅 SQL Server 联机丛书中的“使用大值类型”。

# XML 数据类型

SQL Server 提供了 xml 数据类型，该数据类型允许您将 XML 文档和碎片存储在 SQL Server 数据库中。xml 数据类型是 SQL Server 中的内置数据类型，在某些方面类似于其他内置类型，如 int 和 varchar。对于其他内置类型，在作为变量类型、参数类型、函数返回类型或在 Transact-SQL CAST 和 CONVERT 函数中创建表时，可以使用 xml 数据类型作为列类型。

在 JDBC Driver 中，xml 数据类型可以映射为字符串、字节数组、流、CLOB、BLOB 或 SQLXML 对象。字符串是默认映射。从 JDBC Driver 2.0 开始，JDBC Driver 为 JDBC 4.0 API 提供支持，后者引入了 SQLXML 接口。SQLXML 接口定义与 XML 数据交互以及操作 XML 数据的方法。SQLXML 数据类型映射到 SQL Server xml 数据类型。有关如何使用 SQLXML Java 数据类型从/向关系数据库读取/写入 XML 数据的详细信息，请参阅支持 XML 数据。

在 JDBC Driver 中实现 xml 数据类型为以下各项提供了支持：

- 在大多数常见的编程场景中，对作为标准 Java UTF-16 字符串的 XML 的访问

- 输入以 UTF-8 和其他 8 格式进行编码的 XML

- 为了可与其他 XML 处理器和磁盘文件进行互换而以 UTF-16 进行编码时，对作为带有前导 BOM 的字节数组的 XML 的访问

SQL Server 要求以 UTF-16 编码的 XML 具有前导 BOM。当以字节数组形式提供 XML 参数值时，应用程序必须提供此前导 BOM。SQL Server 始终以 UTF-16 字符串形式输出 XML 值，而不带有 BOM 或嵌入式编码声明。当将 XML 值作为 byte[]、BinaryStream 或 Blob 进行检索时，会为该值预置一个 UTF-16 BOM。

有关 xml 数据类型的详细信息，请参阅 SQL Server 联机丛书中的“xml 数据类型”。

# 用户定义的数据类型

通过允许在 SQL Server 数据库中存储对象和自定义数据结构，在 SQL Server 2005 中引入了用户定义的类型 (UDT)，从而扩展了 SQL 类型系统。UDT 可以包含多种数据类型，也可以具有多种行为，这一点使它与传统的由单个 SQL Server 系统数据类型组成的别名数据类型区分开来。可使用 Microsoft .NET 公共语言运行时 (CLR)（生成可验证的代码）所支持的任意一种语言定义 UDT。这些语言包括 Microsoft Visual C# 和 Visual Basic .NET。数据被公开为基于 .NET Framework 的类或结构的字段和属性，行为由类或结构的方法定义。

在 SQL Server 中，UDT 可用作表的列定义、Transact-SQL 批处理的变量或 Transact-SQL 函数或存储过程的参数。

有关用户定义的数据类型的详细信息，请参阅 SQL Server 联机丛书中的“使用和修改用户定义类型的实例”。

# 请参阅

了解 JDBC 驱动程序数据类型
发送有关本主题的反馈至 Microsoft。

© 2012 Microsoft。保留所有权利。