Поделиться через


Большие UDT

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

Примечание.

Чтобы воспользоваться расширенной поддержкой SqlClient определяемых пользователем типов данных большого размера, необходимо установить .NET Framework 3.5 с пакетом обновления 1 (SP1) или более поздней версии.

Ранее размер определяемых пользователем типов был ограничен 8 килобайтами. Это ограничение было снято в SQL Server 2008 для определяемых пользователем типов, имеющих формат UserDefined.

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

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

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

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

Метод GetSchemaTable SqlDataReader возвращает DataTable, описывающее метаданные столбца. В следующей таблице описаны различия в метаданных столбцов для больших пользовательских типов данных между 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 был расширен для поддержки загрузки значений определяемых пользователем типов данных большого размера. Как большие значения пользовательского типа обрабатываются SqlDataReader, зависит от используемой версии SQL Server, а также от Type System Version, указанного в строке подключения. Дополнительные сведения см. в разделе ConnectionString.

Следующие методы SqlDataReader будут возвращать SqlBinary вместо пользовательского типа, если для Type System Version установлено значение SQL Server 2005:

Следующие методы будут возвращать массив Byte[] вместо пользовательского типа, если для Type System Version установлено значение SQL Server 2005:

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

Указание SqlParameters

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

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

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

В следующем фрагменте кода показано, как получить большие данные пользовательского типа. Переменная 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

См. также