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 |
---|---|
使用 GetSchema 检索 UDT 架构
SqlConnection 的 GetSchema 方法可返回 DataTable 中的数据库架构信息。 有关更多信息,请参见 SQL Server 架构集合 (ADO.NET)。
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。 有关更多信息,请参见 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 属性 |
说明 |
---|---|
获取或设置表示参数值的对象。 默认值为 null。 此属性可以是 SqlBinary、Byte[] 或一个托管对象。 |
|
获取或设置表示参数值的对象。 默认值为 null。 此属性可以是 SqlBinary、Byte[] 或一个托管对象。 |
|
获取或设置要解析的参数值的大小。 默认值为 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