Поделиться через


Использование определяемых пользователем типов данных

В SQL Server 2005 представлены определяемые пользователем типы данных (UDT). Определяемые пользователем типы расширяют систему типов SQL путем разрешения хранения объектов и пользовательских структур данных в базе данных SQL Server. Определяемые пользователем типы могут содержать несколько типов данных, и их поведение может отличаться от традиционных псевдонимов типов данных, которые состоят из одного системного типа данных SQL Server. Определяемые пользователем типы определяются с помощью любого языка, поддерживаемого средой .NET CLR, который создает поддающийся проверке код. Сюда входят языки Microsoft Visual C#® и Visual Basic® .NET. Данные представляются в виде полей и свойств класса или структуры .NET, а поведения определяются методами класса или структуры.

Определяемый пользователем тип можно использовать в качестве определения столбца таблицы, переменной в пакете Transact-SQL или аргумента функции либо хранимой процедуры Transact-SQL.

SQL Server Native Client OLE DB Provider

Поставщик OLE DB SQL Server Native Client поддерживает определяемые пользователем типы как двоичные типы с метаданными, что позволяет управлять определяемыми пользователем типами как объектами. Столбцы определяемых пользователем типов представляются как DBTYPE_UDT, и их метаданные доступны через основной интерфейс OLE DB IColumnRowset и новый интерфейс ISSCommandWithParameters.

ПримечаниеПримечание

Метод IRowsetFind::FindNextRow не работает с определяемым пользователем типом данных. Если определяемый пользователем тип используется в качестве типа столбца поиска, возвращается значение DB_E_BADCOMPAREOP.

Привязки данных и приведение типов

В следующей таблице описаны привязка и приведение типа данных, которые возникают при использовании перечисленных определенных пользователем типов данных SQL Server. Столбцы определяемых пользователем типов представляются поставщиком OLE DB собственного клиента SQL Server как тип DBTYPE_UDT. Метаданные можно получать через соответствующие наборы строк схемы, так что можно управлять собственными определенными типами как объектами.

Тип данных

На сервер

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

На сервер

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

С сервера

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

С сервера

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

DBTYPE_UDT

Поддерживаемые6

Ошибка1

Поддерживаемые6

Ошибка5

DBTYPE_BYTES

Поддерживаемые6

Н/д2

Поддерживаемые6

Н/д2

DBTYPE_WSTR

Поддерживаемые3,6

Н/д2

Поддерживаемые4,6

Н/д2

DBTYPE_BSTR

Поддерживаемые3,6

Н/д2

Поддерживаемые4

Н/д2

DBTYPE_STR

Поддерживаемые3,6

Н/д2

Поддерживаемые4,6

Н/д2

DBTYPE_IUNKNOWN

Не поддерживается

Н/д2

Не поддерживается

Н/д2

DBTYPE_VARIANT (VT_UI1 | VT_ARRAY)

Поддерживаемые6

Н/д2

Поддерживаемые4

Н/д2

DBTYPE_VARIANT (VT_BSTR)

Поддерживаемые3,6

Н/д2

н/д

Н/д2

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

2Выходит за рамки этого раздела.

3 Происходит преобразование шестнадцатеричной строки в двоичные данные.

4 Происходит преобразование двоичных данных в шестнадцатеричную строку.

5 Во время создания метода доступа или во время выборки может произойти проверка данных. Ошибка — DB_E_ERRORSOCCURRED, состояние привязки устанавливается в значение DBBINDSTATUS_UNSUPPORTEDCONVERSION.

6Может использоваться BY_REF.

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

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

ПримечаниеПримечание

Новый интерфейс ISSCommandWithParameters, наследуемый от интерфейса ICommandWithParameters, используется для работы с определяемыми пользователем типами как с параметрами. Приложения должны использовать этот интерфейс для установки, по крайней мере, атрибута SSPROP_PARAM_UDT_NAME набора свойств DBPROPSET_SQLSERVERPARAMETER для параметров определяемых пользователем типов. Если это не сделано, метод ICommand::Execute возвратит ошибку DB_E_ERRORSOCCURRED. Этот интерфейс и набор свойств описан далее в этом разделе.

Если определяемый пользователем тип вставлен в столбец, который недостаточно велик для хранения всех его данных, метод ICommand::Execute вернет S_OK с состоянием DB_E_ERRORSOCCURRED.

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

Добавления и изменения для наборов строк OLE DB

Собственный клиент SQL Server добавляет новые значения или изменяет многие из основных наборов строк схемы OLE DB.

Набор строк схемы PROCEDURE_PARAMETERS

В набор строк схемы PROCEDURE_PARAMETERS были сделаны следующие добавления.

Имя столбца

Тип

Описание

SS_UDT_CATALOGNAME

DBTYPE_WSTR

Идентификатор трехкомпонентного имени.

SS_UDT_SCHEMANAME

DBTYPE_WSTR

Идентификатор трехкомпонентного имени.

SS_UDT_NAME

DBTYPE_WSTR

Идентификатор трехкомпонентного имени.

SS_UDT_ASSEMBLY_TYPENAME

DBTYPE_WSTR

Полное имя сборки, которое включает имя типа и все идентификационные данные сборки, необходимые для ссылки на сборку из среды CLR.

Набор строк схемы SQL_ASSEMBLIES

Поставщик OLE DB собственного клиента SQL Server представляет новый набор строк схемы, определенной поставщиком, который описывает зарегистрированные определяемые пользователем типы. Сервер ASSEMBLY может быть указан как тип DBTYPE_WSTR, но он отсутствует в наборе строк. Если значение не задано, то по умолчанию для набора строк будет использоваться текущий сервер. Набор строк схемы SQL_ASSEMBLIES определен в следующей таблице.

Имя столбца

Тип

Описание

ASSEMBLY_CATALOG

DBTYPE_WSTR

Имя каталога сборки, содержащей тип.

ASSEMBLY_SCHEMA

DBTYPE_WSTR

Имя схемы или имя владельца сборки, содержащей тип. Хотя сборки ограничены базой данных, а не схемой, они все еще имеют владельца, отраженного здесь.

ASSEMBLY_NAME

DBTYPE_WSTR

Имя сборки, содержащей тип.

ASSEMBLY_ID

DBTYPE_UI4

Идентификатор объекта сборки, содержащей тип.

PERMISSION_SET

DBTYPE_WSTR

Значение, определяющее область доступа сборки. Значения включают «SAFE», «EXTERNAL_ACCESS» и «UNSAFE».

ASSEMBLY_BINARY

DBTYPE_BYTES

Двоичное представление сборки.

Набор строк схемы SQL_ASSEMBLIES_ DEPENDENCIES

Поставщик OLE DB собственного клиента SQL Server представляет новый набор строк схемы, определенной поставщиком, который описывает зависимости сборки указанного сервера. ASSEMBLY_SERVER может быть указан участником как тип DBTYPE_WSTR, но отсутствовать в наборе строк. Если значение не задано, то по умолчанию для набора строк будет использоваться текущий сервер. Набор строк схемы SQL_ASSEMBLY_DEPENDENCIES определен в следующей таблице.

Имя столбца

Тип

Описание

ASSEMBLY_CATALOG

DBTYPE_WSTR

Имя каталога сборки, содержащей тип.

ASSEMBLY_SCHEMA

DBTYPE_WSTR

Имя схемы или имя владельца сборки, содержащей тип. Хотя сборки ограничены базой данных, а не схемой, они все еще имеют владельца, отраженного здесь.

ASSEMBLY_ID

DBTYPE_UI4

Идентификатор объекта сборки.

REFERENCED_ASSEMBLY_ID

DBTYPE_UI4

Идентификатор объекта сборки, на которую присутствует ссылка.

Набор строк схемы SQL_USER_TYPES

Поставщик OLE DB собственного клиента SQL Server предоставляет новый набор строк схемы — SQL_USER_TYPES, который описывает момент добавления зарегистрированных определяемых пользователем типов для указанного сервера. UDT_SERVER должен быть указан участником как тип DBTYPE_WSTR, но отсутствовать в наборе строк. Набор строк схемы SQL_USER_TYPES определен в следующей таблице.

Имя столбца

Тип

Описание

UDT_CATALOGNAME

DBTYPE_WSTR

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

UDT_SCHEMANAME

DBTYPE_WSTR

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

UDT_NAME

DBTYPE_WSTR

Имя сборки, содержащей класс определяемого пользователем типа.

UDT_ASSEMBLY_TYPENAME

DBTYPE_WSTR

Полное имя типа (AQN) включает имя типа и префикс пространства имен (если оно задано).

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

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

Имя столбца

Тип

Описание

SS_UDT_CATALOGNAME

DBTYPE_WSTR

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

SS_UDT_SCHEMANAME

DBTYPE_WSTR

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

SS_UDT_NAME

DBTYPE_WSTR

Имя определяемого пользователем типа.

SS_UDT_ASSEMBLY_TYPENAME

DBTYPE_WSTR

Полное имя типа (AQN) включает имя типа и префикс пространства имен (если оно задано).

Добавления и изменения для наборов свойств OLE DB

Собственный клиент SQL Server добавляет новые значения или изменяет многие из основных наборов свойств OLE DB.

Набор свойств DBPROPSET_SQLSERVERPARAMETER

Для поддержки определяемых пользователем типов через OLE DB в собственном клиенте SQL Server реализован новый набор свойств DBPROPSET_SQLSERVERPARAMETER, который содержит следующие значения.

Название

Тип

Описание

SSPROP_PARAM_UDT_CATALOGNAME

DBTYPE_WSTR

Идентификатор трехкомпонентного имени.

Для параметров определяемого пользователем типа это свойство содержит строку, представляющую имя каталога, в котором определен этот тип.

SSPROP_PARAM_UDT_SCHEMANAME

DBTYPE_WSTR

Идентификатор трехкомпонентного имени.

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

SSPROP_PARAM_UDT_NAME

DBTYPE_WSTR

Идентификатор трехкомпонентного имени.

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

Свойство SSPROP_PARAM_UDT_NAME является обязательным. Свойства SSPROP_PARAM_UDT_CATALOGNAME и SSPROP_PARAM_UDT_SCHEMANAME не обязательны. Если какое-либо свойство указывается неправильно, возвращается ошибка DB_E_ERRORSINCOMMAND. Если свойства SSPROP_PARAM_UDT_CATALOGNAME и SSPROP_PARAM_UDT_SCHEMANAME не указаны, то определяемый пользователем тип должен быть определен в той же базе данных и схеме, что и таблица. Если определение определяемого пользователем типа и таблица находятся в разных схемах (но в одной базе данных), то должно быть указано свойство SSPROP_PARAM_UDT_SCHEMANAME. Если определение определяемого пользователем типа находится в другой базе данных, то должны быть указаны свойства SSPROP_PARAM_UDT_CATALOGNAME и SSPROP_PARAM_UDT_SCHEMANAME.

Набор свойств DBPROPSET_SQLSERVERCOLUMN

Для поддержки создания таблиц в интерфейсе ITableDefinition в собственном клиенте SQL Server добавлены следующие три новых столбца в набор свойств DBPROPSET_SQLSERVERCOLUMN.

Название

Описание

Тип

Описание

SSPROP_COL_UDT_CATALOGNAME

UDT_CATALOGNAME

VT_BSTR

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

SSPROP_COL_UDT_SCHEMANAME

UDT_SCHEMANAME

VT_BSTR

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

SSPROP_COL_UDT_NAME

UDT_NAME

VT_BSTR

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

ПримечаниеПримечание

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

ADO будет ссылаться на эти свойства с помощью соответствующей записи в столбце «Описание».

Свойство SSPROP_COL_UDTNAME является обязательным. Свойства SSPROP_COL_UDT_CATALOGNAME и SSPROP_COL_UDT_SCHEMANAME не обязательны. Если какое-либо свойство указывается неправильно, возвращается ошибка DB_E_ERRORSINCOMMAND.

Если ни свойство SSPROP_PARAM_UDT_CATALOGNAME, ни свойство SSPROP_PARAM_UDT_SCHEMANAME не указаны, то определяемый пользователем тип должен быть определен в той же базе данных и схеме, что и таблица.

Если определение определяемого пользователем типа и таблица находятся в разных схемах (но в одной базе данных), то должно быть указано свойство SSPROP_COL_UDT_SCHEMANAME.

Если определение определяемого пользователем типа находится в другой базе данных, то должны быть указаны свойства SSPROP_COL_UDT_CATALOGNAME и SSPROP_COL_UDT_CATALOGNAME.

Добавления и изменения для интерфейсов OLE DB

Собственный клиент SQL Server добавляет новые значения или изменяет многие из основных интерфейсов OLE DB.

Интерфейс ISSCommandWithParameters

Чтобы поддерживать определяемые пользователем типы через OLE DB, собственный клиент SQL Server реализует несколько изменений, включая добавление интерфейса ISSCommandWithParameters. Этот новый интерфейс наследует основной интерфейс OLE DB — ICommandWithParameters. Помимо трех методов, наследуемых из интерфейса ICommandWithParametersGetParameterInfo, MapParameterNames и SetParameterInfo — интерфейс ISSCommandWithParameters содержит методы GetParameterProperties и SetParameterProperties, которые используются для обработки серверных типов данных.

ПримечаниеПримечание

Интерфейс ISSCommandWithParameters также задействует возможности новой структуры SSPARAMPROPS.

Интерфейс IColumnsRowset

Помимо интерфейса ISSCommandWithParameters, собственный клиент SQL Server добавляет новые значения в набор строк, возвращаемый вызовом метода IColumnsRowset::GetColumnRowset, включая следующие элементы.

Имя столбца

Тип

Описание

DBCOLUMN_SS_UDT_CATALOGNAME

DBTYPE_WSTR

Идентификатор имени каталога определяемого пользователем типа.

DBCOLUMN_SS_UDT_SCHEMANAME

DBTYPE_WSTR

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

DBCOLUMN_SS_UDT_NAME

DBTYPE_WSTR

Идентификатор имени определяемого пользователем типа.

DBCOLUMN_SS_ASSEMBLY_TYPENAME

DBTYPE_WSTR

Полное имя сборки, которое включает имя типа и все идентификационные данные сборки, необходимые для ссылки на сборку из среды CLR.

Если столбец DBCOLUMN_TYPE имеет значение DBTYPE_UDT, то столбец определяемого пользователем типа сервера можно отличить от других двоичных типов, изучив добавленные метаданные определяемого пользователем типа, указанные выше. Если данные частично завершены, то тип сервера является определяемым пользователем типом. Для типов сервера, отличных от определяемых пользователем типов, эти столбцы всегда возвращают значение NULL.

Драйвер ODBC для собственного клиента SQL Server

Чтобы поддерживать определяемые пользователем типы, в драйвер ODBC собственного клиента SQL Server были внесены некоторые изменения. Драйвер ODBC собственного клиента SQL Server сопоставляет определяемый пользователем тип SQL Server с идентификатором типа данных SQL, зависящем от драйвера SQL_SS_UDT. Столбцы определяемого пользователем типа отображаются как тип SQL_SS_UDT. Если столбец определяемого пользователем типа явно сопоставляется другому типу в инструкции SQL с помощью метода ToString или ToXMLString или с помощью функции CAST/CONVERT, то тип столбца в результирующем наборе отражает действительный тип, в который был преобразован столбец.

SQLColAttribute, SQLDescribeParam, SQLGetDescField

Чтобы предоставить дополнительные сведения столбцу определяемого пользователем типа результирующего набора или параметру определяемого пользователем типа хранимой процедуры или параметризированного запроса, который получен с помощью функций SQLColAttribute, SQLDescribeParam и SQLGetDescField, было добавлено четыре новых поля дескриптора, зависящих от драйвера.

Это следующие поля дескриптора: SQL_CA_SS_UDT_CATALOG_NAME, SQL_CA_SS_UDT_SCHEMA_NAME, SQL_CA_SS_UDT_TYPE_NAME и SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME.

SQLColumns, SQLProcedureColumns

Помимо этого, чтобы предоставить дополнительные сведения о столбце определяемого пользователем типа результирующего набора или о параметре определяемого пользователем типа, в результирующий набор, возвращаемый функциями SQLColumns и SQLProcedureColumns, добавляются три новых столбца, зависящих от драйвера. Это следующие столбцы: SS_UDT_CATALOG_NAME, SS_UDT_SCHEMA_NAME и SS_UDT_ASSEMBLY_TYPE_NAME.

Поддерживаемые преобразования

При преобразовании из типов данных SQL в типы данных C типы SQL_C_WCHAR, SQL_C_BINARY и SQL_C_CHAR могут быть преобразованы в SQL_SS_UDT. Однако обратите внимание, что при преобразовании из типов данных SQL_C_WCHAR и SQL_C_CHAR SQL двоичные данные преобразуются в шестнадцатеричную строку.

При преобразовании из типов данных C в типы данных SQL типы SQL_C_WCHAR, SQL_C_BINARY и SQL_C_CHAR могут быть преобразованы в SQL_SS_UDT. Однако обратите внимание, что при преобразовании из типов данных SQL_C_WCHAR и SQL_C_CHAR SQL двоичные данные преобразуются в шестнадцатеричную строку.

См. также

Справочник

Интерфейс ISSCommandWithParameters (OLE DB)

Другие ресурсы

Компоненты собственного клиента SQL Server