Большие, определяемые пользователем типыLarge UDTs

Определяемые пользователем типы данных (UDT) позволяют разработчику расширить систему скалярных типов путем сохранения в базе данных SQL Server объектов среды CLR.User-defined types (UDTs) allow a developer to extend the server's scalar type system by storing common language runtime (CLR) objects in a SQL Server database. Определяемые пользователем типы могут содержать несколько элементов в отличие от традиционных псевдонимов типов данных, состоящих из одного системного типа данных SQL Server.UDTs can contain multiple elements and can have behaviors, unlike the traditional alias data types, which consist of a single SQL Server system data type.

Примечание

Чтобы воспользоваться расширенной поддержкой SqlClient определяемых пользователем типов данных большого размера, необходимо установить .NET Framework 3.5 с пакетом обновления 1 (SP1) или более поздней версии.You must install the .NET Framework 3.5 SP1 (or later) to take advantage of the enhanced SqlClient support for large UDTs.

Ранее максимальный размер определяемых пользователем типов данных был ограничен 8 килобайтами.Previously, UDTs were restricted to a maximum size of 8 kilobytes. В SQL Server 2008 это ограничение было снято для определяемых пользователем типов данных в формате UserDefined.In SQL Server 2008, this restriction has been removed for UDTs that have a format of UserDefined.

Полную документацию по определяемым пользователем типам данных см. в электронной документации по SQL Server для используемой версии SQL Server.For the complete documentation for user-defined types, see the version of SQL Server Books Online for the version of SQL Server you are using.

Электронная документация по SQL ServerSQL Server Books Online

  1. Определяемые пользователем типы CLRCLR User-Defined Types

Загрузка схем определяемых пользователем типов данных с помощью метода GetSchemaRetrieving UDT Schemas Using GetSchema

Метод GetSchema класса SqlConnection возвращает сведения о схеме базы данных в DataTable.The GetSchema method of SqlConnection returns database schema information in a DataTable. Дополнительные сведения см. в разделе SQL Server коллекции схем.For more information, see SQL Server Schema Collections.

Значения столбца GetSchemaTable для определяемых пользователем типов данныхGetSchemaTable Column Values for UDTs

Метод GetSchemaTable класса SqlDataReader возвращает объект DataTable с описанием метаданных столбцов.The GetSchemaTable method of a SqlDataReader returns a DataTable that describes column metadata. В приведенной ниже таблице описаны различия метаданных столбцов для определяемых пользователем типов данных в SQL Server 2005 и SQL Server 2008.The following table describes the differences in the column metadata for large UDTs between SQL Server 2005 and SQL Server 2008.

Столбец SqlDataReaderSqlDataReader column SQL Server 2005SQL Server 2005 SQL Server 2008 и более поздние версииSQL Server 2008 and later
ColumnSize Возможны разные вариантыVaries Возможны разные вариантыVaries
NumericPrecision 255255 255255
NumericScale 255255 255255
DataType Byte[] Экземпляр определяемого пользователем типа данныхUDT instance
ProviderSpecificDataType SqlTypes.SqlBinary Экземпляр определяемого пользователем типа данныхUDT instance
ProviderType 21 (SqlDbType.VarBinary)21 (SqlDbType.VarBinary) 29 (SqlDbType.Udt)29 (SqlDbType.Udt)
NonVersionedProviderType 29 (SqlDbType.Udt)29 (SqlDbType.Udt) 29 (SqlDbType.Udt)29 (SqlDbType.Udt)
DataTypeName SqlDbType.VarBinary Имя из трех частей, указанное как Database. SchemaName. TypeName.The three part name specified as Database.SchemaName.TypeName.
IsLong Возможны разные вариантыVaries Возможны разные вариантыVaries

Вопросы, связанные с SqlDataReaderSqlDataReader Considerations

Объект SqlDataReader, начиная с SQL Server 2008, был расширен для поддержки загрузки значений определяемых пользователем типов данных большого размера.The SqlDataReader has been extended beginning in SQL Server 2008 to support retrieving large UDT values. Способ обработки значений определяемых пользователем типов данных большого размера объектом SqlDataReader зависит от используемой версии SQL Server, а также от значения параметра Type System Version в строке подключения.How large UDT values are processed by a SqlDataReader depends on the version of SQL Server you are using, as well as on the Type System Version specified in the connection string. Дополнительные сведения см. в разделе ConnectionString.For more information, see ConnectionString.

Следующие методы SqlDataReader возвращают SqlBinary вместо определяемого пользователем типа, если в SQL Server 2005 установлен аргумент Type System Version:The following methods of SqlDataReader will return a SqlBinary instead of a UDT when the Type System Version is set to SQL Server 2005:

Следующие методы возвращают массив Byte[] вместо определяемого пользователем типа, если в SQL Server 2005 установлен аргумент Type System Version:The following methods will return an array of Byte[] instead of a UDT when the Type System Version is set to SQL Server 2005:

Обратите внимание, что для текущей версии ADO.NET преобразования не выполняются.Note that no conversions are made for the current version of ADO.NET.

Указание параметров SqlParametersSpecifying SqlParameters

Следующие свойства SqlParameter были расширены для работы с большими определяемыми пользователем типами.The following SqlParameter properties have been extended to work with large UDTs.

Свойство SqlParameterSqlParameter Property ОписаниеDescription
Value Возвращает или задает объект, представляющий собой значение параметра.Gets or sets an object that represents the value of the parameter. Значение по умолчанию — null.The default is null. Свойство может принимать значения SqlBinary, Byte[] или управляемого объекта.The property can be SqlBinary, Byte[], or a managed object.
SqlValue Возвращает или задает объект, представляющий собой значение параметра.Gets or sets an object that represents the value of the parameter. Значение по умолчанию — null.The default is null. Свойство может принимать значения SqlBinary, Byte[] или управляемого объекта.The property can be SqlBinary, Byte[], or a managed object.
Size Возвращает или задает размер значения параметра для разрешения.Gets or sets the size of the parameter value to resolve. Значение по умолчанию — 0.The default value is 0. Свойство может быть целым числом, представляющим размер значения параметра.The property can be an integer that represents the size of the parameter value. Для определяемых пользователем типов данных большого размера оно может равняться действительному размеру определяемого пользователем типа или принимать значение -1 - для неизвестных.For large UDTs, it can be the actual size of the UDT, or -1 for unknown.

Пример извлечения данныхRetrieving Data Example

В приведенном ниже фрагменте кода демонстрируется извлечение данных определяемого пользователем типа большого размера.The following code fragment demonstrates how to retrieve large UDT data. Предполагается, что в переменной connectionString хранится допустимая строка подключения к базе данных SQL Server, а в переменной commandString - допустимая инструкция SELECT, в которой столбец первичного ключа указан первым.The connectionString variable assumes a valid connection to a SQL Server database and the commandString variable assumes a valid SELECT statement with the primary key column listed first.

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  

См. такжеSee also