大型 UDT
用户定义类型 (UDT) 使开发人员可以通过在 SQL Server 数据库中存储公共语言运行时 (CLR) 对象来扩展服务器的标量类型系统。 UDT 可以包含多个元素,也可以具有多种行为,不同于传统的由单个 SQL Server 系统数据类型组成的别名数据类型。
备注
必须安装 .NET Framework 3.5 SP1(或更高版本)才能利用针对大型 UDT 增强的 SqlClient 支持。
以前 UDT 的最大大小限制为 8 KB。 在 SQL Server 2008 中,对于 UserDefined 格式的 UDT,已不再进行此限制。
有关用户定义类型的完整文档,请参阅 CLR User-Defined 类型。
使用 GetSchema 检索 UDT 架构
SqlConnection 的 GetSchema 方法在 DataTable 中返回数据库架构信息。 有关详细信息,请参阅 SQL Server 架构集合。
UDT 的 GetSchemaTable 列值
SqlDataReader 的 GetSchemaTable 方法返回描述列元数据的 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
。 有关详细信息,请参阅 ConnectionString。
将 Type System Version
设置为 SQL Server 2005 时,以下 SqlDataReader 方法将返回 SqlBinary,而不是 UDT:
- GetProviderSpecificFieldType
- GetProviderSpecificValue
- GetProviderSpecificValues
- GetSqlValue
- GetSqlValues
将 Type System Version
设置为 SQL Server 2005 时,以下方法将返回 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