Использование определяемых пользователем типов
В SQL Server 2005 представлены определяемые пользователем типы (UDT). Определяемые пользователем типы расширяют систему типов SQL, путем разрешения хранения объектов и пользовательских структур данных в базе данных SQL Server. Определяемые пользователем типы могут содержать несколько типов данных и иметь несколько поведений, отличающихся от традиционных псевдонимов типов данных, которые состоят из одного системного типа данных SQL Server. Определяемые пользователем типы определяются с помощью любого языка, поддерживаемого средой CLR .NET, который создает поддающийся проверке код. Сюда входят языки Microsoft Visual C#® и Visual Basic® .NET. Данные представляются в виде полей и свойств класса или структуры .NET, а поведения определяются методами класса или структуры.
Определяемый пользователем тип можно использовать в качестве определения столбца таблицы, переменной в пакете Transact-SQL, или аргумента функции, или хранимой процедуры Transact-SQL. Дополнительные сведения об определяемых пользователем типах см. в разделе Работа с определяемыми пользователем типами данных CLR.
Поставщик OLE DB для собственного клиента SQL Server
Поставщик OLE DB собственного клиента SQL Server поддерживает определяемые пользователем типы как двоичные типы с метаданными, которые позволяют управлять определяемыми пользователем типами как объектами. Столбцы определяемых пользователем типов представляются как DBTYPE_UDT, и их метаданные доступны через основной интерфейс OLE DB IColumnRowset, и новый интерфейс ISSCommandWithParameters.
Примечание |
---|
Метод IRowsetFind::FindNextRow не работает с типом данных UDT. Если определяемые пользователем типы используются в качестве типа столбца поиска, то возвращается DB_E_BADCOMPAREOP. |
Привязки данных и приведение типов
В следующей таблице описаны привязка и приведение, которые возникают при использовании перечисленных типов данных UDT 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. Этот интерфейс и набор свойств описан далее в этом разделе. |
Если определяемый пользователем тип вставлен в столбец, который недостаточно большой для хранения всех его данных, вернет 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.
Имя |
Описание |
Тип |
Description |
---|---|---|---|
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 and 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. Помимо трех методов, наследуемых из интерфейса ICommandWithParameters — GetParameterInfo, 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, двоичные данные преобразуются в шестнадцатеричную строку.
См. также