Крупные определяемые пользователем типы СРЕДЫ CLR в собственном клиенте SQL Server (OLE DB)

Применимо к:SQL ServerAzure SQL DatabaseAzure Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Внимание

Собственный клиент SQL Server (часто сокращенный SNAC) был удален из SQL Server 2022 (16.x) и SQL Server Management Studio 19 (SSMS). Поставщик OLE DB собственного клиента SQL Server (SQLNCLI или SQLNCLI11) и устаревший поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) не рекомендуется для новой разработки. Перейдите на новый драйвер Microsoft OLE DB (MSOLEDBSQL) для SQL Server .

В этом разделе рассматриваются изменения OLE DB в собственном клиенте SQL Server для поддержки определяемых пользователем типов (определяемых пользователем типов clR).

Дополнительные сведения о поддержке больших определяемых пользователем пользователей среды CLR в sql Server Native Client см. в разделе "Крупные определяемые пользователем типы СРЕДЫ CLR". Пример см. в статье Использование определяемых пользователем типов больших данных CLR (OLE DB).

Формат данных

Sql Server Native Client использует ~0 для представления длины значений, которые имеют неограниченный размер для типов больших объектов (LOB). Значение ~0 также представляет размер определяемых пользователем типов данных CLR, превышающий 8 000 байт.

В следующей таблице показано сопоставление типов данных в параметрах и наборах строк.

Тип данных SQL Server Тип данных OLE DB Организация памяти значение
CLR UDT DBTYPE_UDT BYTE[](массив байтов) 132 (oledb.h)

Значения определяемых пользователем типов представляются в виде массивов байт. Поддерживается преобразование данных в шестнадцатеричные строки и из шестнадцатеричных строк. Литеральные значения представляются в виде шестнадцатеричных строк с префиксом «0x». Шестнадцатеричная строка является текстовым представлением двоичных данных с основанием 16. Например, при преобразовании из серверного типа varbinary(10) в тип DBTYPE_STR получается шестнадцатеричное представление длиной в 20 символов, в котором каждая пара символов представляет один байт.

Свойства параметров

Набор свойств DBPROPSET_SQLSERVERPARAMETER поддерживает определяемый пользователем тип через OLE DB. Дополнительные сведения см. в статье Использование пользовательских типов.

Свойства столбца

Набор свойств DBPROPSET_SQLSERVERCOLUMN поддерживает создание таблиц через OLE DB. Дополнительные сведения см. в статье Использование пользовательских типов.

Сопоставление типов данных в методе ITableDefinition::CreateTable

Следующие сведения используются в структурах DBCOLUMNDESC, применяемых методом ITableDefinition::CreateTable, когда требуются столбцы пользовательских типов:

Тип данных OLE DB (wType) pwszTypeName Тип данных SQL Server rgPropertySets
DBTYPE_UDT Пропущено (UDT) Должен включать набор свойств DBPROPSET_SQLSERVERCOLUMN.

ICommandWithParameters::GetParameterInfo

В структуру DBPARAMINFO через prgParamInfo возвращаются указанные ниже сведения.

Тип параметра wType ulParamSize bPrecision bScale dwFlags DBPARAMFLAGS_ISLONG
DBTYPE_UDT

(длина не более 8 000 байт)
"DBTYPE_UDT" n не определено не определено clear
DBTYPE_UDT

(длина более 8 000 байт)
"DBTYPE_UDT" ~0 не определено не определено set

ICommandWithParameters::SetParameterInfo

Сведения, предоставленные в структуре DBPARAMBINDINFO, должны соответствовать следующим требованиям.

Тип параметра pwszDataSourceType ulParamSize bPrecision bScale dwFlags DBPARAMFLAGS_ISLONG
DBTYPE_UDT

(длина не более 8 000 байт)
DBTYPE_UDT n не учитывается не учитывается Должен быть задан, если параметр передается с помощью DBTYPE_IUNKNOWN.
DBTYPE_UDT

(длина более 8 000 байт)
DBTYPE_UDT ~0 не учитывается не учитывается не учитывается

ISSCommandWithParameters

Чтобы вернуть и задать свойства параметров, определенные в разделе "Свойства параметров", приложения используют интерфейс ISSCommandWithParameters.

IColumnsRowset::GetColumnsRowset

Возвращаются следующие столбцы.

Тип столбца DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE DBCOLUMN_FLAGS_ISLONG DBCOLUMNS_ISSEARCHABLE DBCOLUMN_OCTETLENGTH
DBTYPE_UDT

(длина не более 8 000 байт)
DBTYPE_UDT n NULL NULL Clear DB_ALL_EXCEPT_LIKE n
DBTYPE_UDT

(длина более 8 000 байт)
DBTYPE_UDT ~0 NULL NULL Set DB_ALL_EXCEPT_LIKE 0

Для определяемых пользователем типов определяются также следующие столбцы.

Идентификатор столбца Type Description
DBCOLUMN_UDT_CATALOGNAME DBTYPE_WSTR Для столбцов определяемого пользователем типа — имя каталога, в котором определен тип, определяемый пользователем.
DBCOLUMN_UDT_SCHEMANAME DBTYPE_WSTR Для столбцов определяемого пользователем типа — имя схемы, в которой определен тип, определяемый пользователем.
DBCOLUMN_UDT_NAME DBTYPE_WSTR Для столбцов определяемого пользователем типа — однокомпонентное имя типа.
DBCOLUMN_ASSEMBLY_TYPENAME DBTYPE_WSTR Для столбцов определяемого пользователем типа — полное имя типа. Полное имя типа сборки позволяет создать экземпляр объекта этого типа с помощью метода Type.GetType.

IColumnsInfo::GetColumnInfo

В структуру DBCOLUMNINFO возвращаются следующие сведения.

Тип параметра wType ulColumnSize bPrecision bScale dwFlags

DBCOLUMNFLAGS_ISLONG
DBTYPE_UDT

(длина не более 8 000 байт)
DBTYPE_UDT n ~0 ~0 Clear
DBTYPE_UDT

(длина более 8 000 байт)
DBTYPE_UDT ~0 ~0 ~0 Set

Набор строк COLUMNS (наборы строк схемы)

Для определяемых пользователем типов возвращаются значения следующих столбцов.

Тип столбца DATA_TYPE COLUMN_FLAGS, DBCOLUMFLAGS_ISLONG CHARACTER_OCTET_LENGTH
DBTYPE_UDT

(длина не более 8 000 байт)
DBTYPE_UDT Clear n
DBTYPE_UDT

(длина более 8 000 байт)
DBTYPE_UDT Set 0

Для определяемых пользователем типов определяются также следующие дополнительные столбцы.

Идентификатор столбца Type Description
SS_UDT_CATALOGNAME DBTYPE_WSTR Для столбцов определяемого пользователем типа — имя каталога, в котором определен тип, определяемый пользователем.
SS_UDT_SCHEMANAME DBTYPE_WSTR Для столбцов определяемого пользователем типа — имя схемы, в которой определен тип, определяемый пользователем.
SS_UDT_NAME DBTYPE_WSTR Для столбцов определяемого пользователем типа — однокомпонентное имя типа.
SS_ASSEMBLY_TYPENAME DBTYPE_WSTR Для столбцов определяемого пользователем типа — полное имя типа. Полное имя типа сборки позволяет создать экземпляр объекта этого типа с помощью метода Type.GetType.

Что касается набора строк PROCEDURE_PARAMETERS, DATA_TYPE содержит те же значения, что и набор строк схемы COLUMNS, а TYPE_NAME содержит определяемые пользователем типы. Такие же дополнительные столбцы также определены.

Определяемые пользователем типы не появятся в наборе строк схемы PROVIDER_TYPES.

Привязки и преобразования

Привязка типов данных Определяемый пользователем тип к серверному типу Тип, не определяемый пользователем, к серверному типу Серверный тип к определяемому пользователем типу Серверный тип к типу, не определяемому пользователем
DBTYPE_UDT Поддерживается (5) Ошибка (1) Поддерживается (5) Ошибка (4)
DBTYPE_BYTES Поддерживается (5) Неприменимо Поддерживается (5) Неприменимо
DBTYPE_WSTR Поддерживается (2), (5) Неприменимо Поддерживается (3), (5), (6) Неприменимо
DBTYPE_BSTR Поддерживается (2), (5) Неприменимо Поддерживается (3), (5) Неприменимо
DBTYPE_STR Поддерживается (2), (5) Неприменимо Поддерживается (3), (5) Неприменимо
DBTYPE_IUNKNOWN Поддерживается (6) Неприменимо Поддерживается (6) Неприменимо
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Поддерживается (5) Неприменимо Поддерживается (3), (5) Неприменимо
DBTYPE_VARIANT (VT_BSTR) Поддерживается (2), (5) Неприменимо Н/Д Неприменимо

Расшифровка символов

Символ Значение
1 Если серверный тип, отличный от DBTYPE_UDT, указан с помощью метода ICommandWithParameters::SetParameterInfo, а тип метода доступа — DBTYPE_UDT, то при выполнении инструкции возникает ошибка. Будет возвращена ошибка DB_E_ERRORSOCCURRED, и состояние параметра будет DBSTATUS_E_BADACCESSOR.

Ошибкой является указание параметра определяемого пользователем типа для серверного параметра, тип которого отличен от определяемого пользователем типа.
2 Данные преобразуются из шестнадцатеричной строки в двоичные данные.
3 Данные преобразуются из двоичных данных в шестнадцатеричную строку.
4 При использовании метода CreateAccessor или GetNextRows может быть выполнена проверка. Ошибка DB_E_ERRORSOCCURRED. Состояние привязки установлено в значение DBBINDSTATUS_UNSUPPORTEDCONVERSION.
5 Может использоваться BY_REF.
6 Параметры определяемого пользователем типа могут быть привязаны в структуре DBBINDING как DBTYPE_IUNKNOWN. Привязка к DBTYPE_IUNKNOWN показывает, что приложению необходимо обработать данные в виде потока с помощью интерфейса ISequentialStream. Если потребитель задает wType в привязке как тип DBTYPE_IUNKNOWN, а соответствующий столбец или выходной параметр хранимой процедуры — это определяемый пользователем тип, sql Server Native Client возвращает ISequentialStream. Для входного параметра SQL Server Native Client будет запрашивать интерфейс ISequentialStream.

В случае больших определяемых пользователем типов можно не привязывать длину данных определяемого пользователем типа при использовании привязки DBTYPE_IUNKNOWN. Однако для маленьких определяемых пользователем типов необходимо выполнять привязку длины. Для параметра DBTYPE_UDT можно указать большой определяемый пользователем тип, если выполняется одно или более из следующих условий.
ulParamParamSize is ~0.
В структуре DBPARAMBINDINFO установлен флаг DBPARAMFLAGS_ISLONG.

Для строковых данных привязка DBTYPE_IUNKNOWN разрешена только для больших определяемых пользователем типов. Чтобы проверить, содержит ли столбец данные большого определяемого пользователем типа, примените метод IColumnsInfo::GetColumnInfo к интерфейсу IColumnsInfo объекта Rowset или Command. Столбец DBTYPE_UDT имеет большой определяемый пользователь тип, если выполняется по крайней мере одно из следующих условий.
Установлен флаг DBCOLUMNFLAGS_ISLONG для элемента dwFlags структуры DBCOLUMNINFO.
Элемент структуры DBCOLUMNINFO с номером ulColumnSize имеет значение ~0.

Типы DBTYPE_NULL и DBTYPE_EMPTY могут быть привязаны только для входных параметров. Они не могут быть привязаны для выходных параметров или результатов. Если они привязаны для входных параметров, состояние должно быть установлено в значение DBSTATUS_S_ISNULL для типа DBTYPE_NULL или DBSTATUS_S_DEFAULT для типа DBTYPE_EMPTY. DBTYPE_BYREF невозможно использовать с типом DBTYPE_NULL или DBTYPE_EMPTY.

Тип DBTYPE_UDT может также быть преобразован в тип DBTYPE_EMPTY или DBTYPE_NULL. Однако типы DBTYPE_NULL и DBTYPE_EMPTY невозможно преобразовать в тип DBTYPE_UDT. Это правило обеспечивает согласование с DBTYPE_BYTES. Чтобы обрабатывать пользовательские типы как параметры, используется интерфейс ISSCommandWithParameters.

Преобразования данных, выполняемые основными службами OLE DB (IDataConvert), неприменимы к типу DBTYPE_UDT.

Другие привязки не поддерживаются.

Сравнимость для IRowsetFind

Для определяемых пользователем типов поддерживаются только следующие сравнения:

  • EQ

  • NE

  • IGNORE

При попытке любого другого сравнения возвращается ошибка DB_E_BADCOMPAREOP.

Поддержка программы bcp для определяемых пользователем типов

Значения определяемых пользователем типов можно импортировать и экспортировать только в виде символьных и двоичных значений.

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

Определяемые пользователем типы проходят сопоставление типов с клиентами низкого уровня, как показано далее.

Версия клиента DBTYPE_UDT

(длина не более 8 000 байт)
DBTYPE_UDT

(длина более 8 000 байт)
SQL Server 2005 (UDT) varbinary(max)
SQL Server 2008 и более поздние версии (UDT) (UDT)

Если DataTypeCompatibility (SSPROP_INIT_DATATYPECOMPATIBILITY) имеет значение 80, то большие пользовательские типы представляются всем клиентам так же, как клиентам низкого уровня.

См. также

Большие определяемые пользователем типы данных CLR