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

В этом разделе описываются изменения OLE DB для собственного клиента SQL Server, связанные с поддержкой больших определяемых пользователем типов данных CLR.

Дополнительные сведения о поддержке больших определяемых пользователем типов данных CLR в собственном клиенте SQL Server см. раздел Большие определяемые пользователем типы данных CLR.

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

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

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

Тип данных SQL Server

Тип данных OLE DB

Организация памяти

Значение

Определяемый пользователем тип среды CLR

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

Не учитывается

Определяемый пользователем тип

Должен включать набор свойств DBPROPSET_SQLSERVERCOLUMN.

ICommandWithParameters::GetParameterInfo

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

Тип параметра

wType

ulParamSize

bPrecision

bScale

dwFlags DBPARAMFLAGS_ISLONG

DBTYPE_UDT

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

"DBTYPE_UDT"

n

неопределенный

неопределенный

сброшен

DBTYPE_UDT

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

"DBTYPE_UDT"

~0

неопределенный

неопределенный

установлен

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

Очистка

DB_ALL_EXCEPT_LIKE

n

DBTYPE_UDT

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

DBTYPE_UDT

~0

NULL

NULL

Установлен

DB_ALL_EXCEPT_LIKE

0

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

Идентификатор столбца

Тип

Описание

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

Очистка

DBTYPE_UDT

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

DBTYPE_UDT

~0

~0

~0

Установлен

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

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

Тип столбца

DATA_TYPE

COLUMN_FLAGS, DBCOLUMFLAGS_ISLONG

CHARACTER_OCTET_LENGTH

DBTYPE_UDT

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

DBTYPE_UDT

Сброшен

n

DBTYPE_UDT

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

DBTYPE_UDT

Установлен

0

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

Идентификатор столбца

Тип

Описание

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 возвратит интерфейс ISequentialStream. Для входного параметра собственный клиент SQL Server запросит интерфейс ISequentialStream.

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

  • Элемент ulParamParamSize имеет значение ~0.

  • В структуре DBPARAMBINDINFO установлен флаг DBPARAMFLAGS_ISLONG.

Для строковых данных привязка DBTYPE_IUNKNOWN разрешена только для больших определяемых пользователем типов. Имеет ли столбец большой определяемый пользователем тип, можно узнать с помощью метода IColumnsInfo::GetColumnInfo для объекта Rowset или с помощью интерфейса IColumnsInfo объекта Command. Столбец DBTYPE_UDT имеет большой определяемый пользователь тип, если выполняется по крайней мере одно из следующих условий.

  • Установлен флаг DBCOLUMNFLAGS_ISLONG для элемента dwFlags структуры DBCOLUMNINFO.

  • Элемент ulColumnSize структуры DBCOLUMNINFO равен ~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 2000 и более ранние версии

varbinary

image

SQL Server 2005

определяемый пользователем тип

varbinary(max)

SQL Server 2008 и более поздние версии

определяемый пользователем тип

определяемый пользователем тип

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