SQL Server 2008 中的大型 UDT (ADO.NET)

SQL Server 2005 中引入的用户定义类型 (UDT) 允许开发人员通过在 SQL Server 数据库中存储公共语言运行库 (CLR) 对象来扩展服务器的标量类型系统。 UDT 可以包含多个元素并可具有多种行为,与传统别名数据类型不同,它们由单一 SQL Server 系统数据类型组成。

注意注意

必须安装 .NET Framework 3.5 SP1(或更高版本)才能利用针对大型 UDT 增强的 SqlClient 支持。

以前,UDT 的最大大小限制为 8KB。 在 SQL Server 2008 中,对于具有 UserDefined 格式的 UDT,此限制已被取消。

有关用户定义类型的完整文档,请参见与您所使用的 SQL Server 版本对应的 SQL Server 联机丛书。

SQL Server 2005

SQL Server 2008

CLR User-Defined Types(CLR 用户定义类型)

CLR User-Defined Types(CLR 用户定义类型)

使用 GetSchema 检索 UDT 架构

SqlConnectionGetSchema 方法可返回 DataTable 中的数据库架构信息。 有关更多信息,请参见 SQL Server 架构集合 (ADO.NET)

UDT 的 GetSchemaTable 列值

SqlDataReaderGetSchemaTable 方法可返回描述列元数据的 DataTable。 下表介绍了 SQL Server 2005 与 SQL Server 2008 中大型 UDT 的列元数据的差异。

SqlDataReader 列

SQL Server 2005

SQL Server 2008

ColumnSize

不定

不定

NumericPrecision

255

255

NumericScale

255

255

DataType

Byte[]

UDT 实例

ProviderSpecificDataType

SqlTypes.SqlBinary

UDT 实例

ProviderType

21 (SqlDbType.VarBinary)

29 (SqlDbType.Udt)

NonVersionedProviderType

29 (SqlDbType.Udt)

29 (SqlDbType.Udt)

DataTypeName

SqlDbType.VarBinary

以 Database.SchemaName.TypeName 形式指定的由三部分组成的名称。

IsLong

不定

不定

SqlDataReader 注意事项

SqlDataReader 在 SQL Server 2008 中已得到扩展,可支持检索大型 UDT 值。 [SqlDataReader] 处理大型 UDT 值的方式取决于您所使用的 SQL Server 版本以及连接字符串中指定的 Type System Version。 有关更多信息,请参见 SQL Server 2008 中的新增功能 (ADO.NET) 中的“类型系统版本更改”部分。

在早期版本的 SQL Server 中或当 Type System Version 未指定 SQL Server 2008 时,SqlDataReader 的下列方法将返回 SqlBinary 而不是 UDT 实例:

在早期版本的 SQL Server 中或当 Type System Version 未指定 SQL Server 2008 时,下列方法将返回一个 Byte[] 数组而不是 UDT 实例。

请注意,不会对 ADO.NET 的当前版本进行任何转换。

指定 SqlParameters

下面的 SqlParameter 属性已得到扩展,可以与大型 UDT 一起使用。

SqlParameter 属性

说明

Value

获取或设置表示参数值的对象。 默认值为 null。 此属性可以是 SqlBinary、Byte[] 或一个托管对象。

SqlValue

获取或设置表示参数值的对象。 默认值为 null。 此属性可以是 SqlBinary、Byte[] 或一个托管对象。

Size

获取或设置要解析的参数值的大小。 默认值为 0。 此属性可以是表示参数值大小的一个整数。 对于大型 UDT,此属性可以是 UDT 的实际大小,也可以是 -1 以表示未知大小。

检索数据示例

下面的代码段演示如何检索大型 UDT 数据。 connectionString 变量假定已与 SQL Server 数据库建立有效的连接,commandString 变量假定存在首先列出主键列的有效 SELECT 语句。

using (SqlConnection connection = new SqlConnection( 
    connectionString, commandString))
{
  connection.Open();
  SqlCommand command = new SqlCommand(commandString);
  SqlDataReader reader = command.ExecuteReader();
  while (reader.Read())
  {
    // Retrieve the value of the Primary Key column.
    int id = reader.GetInt32(0);
      
    // Retrieve the value of the UDT.
    LargeUDT udt = (LargeUDT)reader[1];

    // You can also use GetSqlValue and GetValue.
    // LargeUDT udt = (LargeUDT)reader.GetSqlValue(1);
    // LargeUDT udt = (LargeUDT)reader.GetValue(1);

    Console.WriteLine(
     "ID={0} LargeUDT={1}", id, udt);
  }
reader.close
}
Using connection As New SqlConnection( _
    connectionString, commandString)
    connection.Open()
    Dim command As New SqlCommand(commandString, connection)
    Dim reader As SqlDataReader
    reader = command.ExecuteReader

    While reader.Read()
      ' Retrieve the value of the Primary Key column.
      Dim id As Int32 = reader.GetInt32(0)

      ' Retrieve the value of the UDT.
      Dim udt As LargeUDT = CType(reader(1), LargeUDT)

     ' You can also use GetSqlValue and GetValue.
     ' Dim udt As LargeUDT = CType(reader.GetSqlValue(1), LargeUDT)
     ' Dim udt As LargeUDT = CType(reader.GetValue(1), LargeUDT)

      ' Print values.
      Console.WriteLine("ID={0} LargeUDT={1}", id, udt)
    End While
    reader.Close()
End Using

请参见

概念

配置参数和参数数据类型 (ADO.NET)

SQL Server 数据类型映射 (ADO.NET)

其他资源

检索数据库架构信息 (ADO.NET)

SQL Server 二进制和大值数据 (ADO.NET)