Большие определяемые пользователем типы данных CLR (OLE DB)
В этом разделе описываются изменения OLE DB для собственного клиента SQL Server, связанные с поддержкой больших определяемых пользователем типов данных среды CLR.
Дополнительные сведения о поддержке больших определяемых пользователем типов данных CLR в собственном клиенте SQL Server см. раздел Большие определяемые пользователем типы данных CLR. Образец см. в разделе Использование определяемых пользователем типов больших данных CLR (OLE DB).
Формат данных
Собственный клиент 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 можно указать большой определяемый пользователем тип, если выполняется одно или более из следующих условий.
Для строковых данных привязка DBTYPE_IUNKNOWN разрешена только для больших определяемых пользователем типов. Имеет ли столбец большой определяемый пользователем тип, можно узнать с помощью метода IColumnsInfo::GetColumnInfo для объекта Rowset или с помощью интерфейса IColumnsInfo объекта Command. Столбец DBTYPE_UDT имеет большой определяемый пользователь тип, если выполняется по крайней мере одно из следующих условий.
|
Типы 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 |
определяемый пользователем тип |
varbinary(max) |
SQL Server 2008 и более поздние версии |
определяемый пользователем тип |
определяемый пользователем тип |
Если DataTypeCompatibility (SSPROP_INIT_DATATYPECOMPATIBILITY) имеет значение «80», то большие определяемые пользователем типы представляются всем клиентам так же, как клиентам низкого уровня.