Большие определяемые пользователем типы данных CLR (OLE DB)
В этом разделе описываются изменения OLE DB для собственного клиента SQL Server, связанные с поддержкой больших определяемых пользователем типов данных среды CLR.
Дополнительные сведения о поддержке больших определяемых пользователем типов данных CLR в собственном клиенте SQL Server см. раздел Большие определяемые пользователем типы данных CLR.
Формат данных
Собственный клиент SQL Server использует ~0 для представления значений с неограниченным размером типа LOB. Начиная с SQL Server 2008, ~0 также представляет размер больших определяемых пользователем типов данных CLR, который превышает 8000 байт.
В следующей таблице показано сопоставление типов данных в параметрах и наборах строк.
Тип данных SQL Server |
Тип данных OLE DB |
Макет памяти |
Значение |
|---|---|---|---|
Определяемый пользователем тип среды CLR |
DBTYPE_UDT |
BYTE[](массив байт) |
132 (oledb.h) |
Значения определяемых пользователем типов представляются в виде массивов байт. Поддерживается преобразование данных в шестнадцатеричные строки и из шестнадцатеричных строк. Литеральные значения представляются в виде шестнадцатеричных строк с префиксом «0x». Шестнадцатеричная строка — это текстовое представление двоичных данных в формате base 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.
Привязки и преобразования
Тип данных Binding |
Определяемый пользователем тип к серверу |
Неопределяемый пользователем тип к серверу |
Определяемый пользователем тип от сервера |
Неопределяемый пользователем тип от сервера |
|---|---|---|---|---|
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 |
Параметры определяемого пользователем типа могут быть привязаны как DBTYPE_IUNKNOWN в DBBINDING. Привязка к 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 2000 и более ранние версии |
varbinary |
image |
SQL Server 2005 |
Определяемый пользователем тип |
varbinary(max) |
SQL Server 2008 |
Определяемый пользователем тип |
Определяемый пользователем тип |
Если параметр DataTypeCompatibility (SSPROP_INIT_DATATYPECOMPATIBILITY) установлен в значение «80», то большие определяемые пользователем типы представляются всем клиентам так же, как клиентам низкого уровня.