Бөлісу құралы:


Большие UDT

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

Примечание.

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

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

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

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

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

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

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

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

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

Обратите внимание, что для текущей версии 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, 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

См. также