Язык

Большие UDT

Определяемые пользователем типы призваны дать разработчику возможность расширить серверную систему скалярных типов путем хранения объектов среды CLR в базе данных SQL Server. Определяемые пользователем типы данных могут содержать несколько элементов и иметь уникальное поведение в отличие от псевдонимных типов данных, которые состоят из одного системного типа данных SQL Server.

Примечание.

Для доступа клиента к большим пользовательским типам данных (UDT) установите пакет NuGet Microsoft.Data.SqlClient и импортируйте Microsoft.Data.SqlClient. Типы SQL CLR, определяющие UDT на стороне сервера, остаются в Microsoft.SqlServer.Server; не заменяйте эти типы типами клиентского поставщика.

Ранее размеры UDT были ограничены 8 килобайтами. В SQL Server 2008 это ограничение было снято для UDT, которые имеют формат UserDefined.

Полная документация по определяемым пользователем типам см. в разделе CLR Определяемые пользователем типы.

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

Метод GetSchema возвращает сведения о схеме базы данных в объекте DataTable . Дополнительные сведения см. в разделе "Коллекции схем SQL Server".

Значения столбцов GetSchemaTable для UDTs

Метод GetSchemaTable возвращает метаданные столбца в объекте DataTable . В следующей таблице описаны различия в метаданных столбцов для больших пользовательских типов данных (UDT) между SQL Server 2005 и SQL Server 2008.

Колонка 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 и более поздних версиях. Как объект чтения обрабатывает эти значения, зависит от версии SQL Server и Type System Version в строке подключения. Дополнительные сведения см. в разделе ConnectionString.

Если Type System Version — SQL Server 2005, следующие SqlDataReader методы используют двоичное представление больших определяемых пользователем типов:

При том же параметре системы типов большое значение UDT возвращается как Byte[]. GetValues заполняет предоставленный массив значениями столбцов и возвращает количество заполненных элементов. Большие значения определяемого пользователем типа в этом массиве используют Byte[].

Обратите внимание, что для текущей версии ADO.NET никакие преобразования не выполняются.

Указание SqlParameters

Следующие SqlParameter свойства поддерживают большие определяемые пользователем типы данных.

Свойство SqlParameter Описание
Value Возвращает или задает объект, представляющий значение параметра. Значение по умолчанию — NULL. Свойством может быть SqlBinary, Byte[] или управляемый объект.
SqlValue Возвращает или задает объект, представляющий значение параметра. Значение по умолчанию — NULL. Свойством может быть SqlBinary, Byte[] или управляемый объект.
Size Возвращает или задает размер значения параметра для обработки. Значение по умолчанию равно 0. Свойство может быть целым числом, представляющим размер значения параметра. Для больших определяемых пользователем типов оно может равняться действительному размеру определяемого пользователем типа или иметь значение –1 — для неизвестных.

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

В следующем фрагменте кода показано, как получить большие данные UDT (пользовательского типа данных). Предполагается, что переменная connectionString содержит корректное подключение к базе данных SQL Server, а переменная commandString представляет собой корректную инструкцию SELECT, в которой столбец первичного ключа указан первым.

using (SqlConnection connection = new SqlConnection(
    connectionString))
{
  connection.Open();
  SqlCommand command = new SqlCommand(commandString, connection);
  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)
    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

См. также