Udostępnij przez


Wykorzystanie User-Defined typów

Dotyczy do:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSystem Platform Analitycznych (PDW)Baza danych SQL w Microsoft Fabric

pobierz sterownik OLE DB

SQL Server 2005 (9.x) wprowadził typy zdefiniowane przez użytkownika (UDT). UDT rozszerzają system typu SQL, pozwalając na przechowywanie obiektów i niestandardowych struktur danych w bazie SQL Server. Typy danych zdefiniowane przez użytkownika mogą zawierać wiele typów danych i mogą posiadać własne zachowania, różniąc się od tradycyjnych typów danych aliasu składających się z jednego typu danych systemowych systemu SQL Server. UDT są definiowane za pomocą dowolnego z języków obsługiwanych przez .NET Common Language Runtime (CLR), które generują weryfikowalny kod. Obejmuje to C# i Visual Basic .NET. Dane są udostępniane jako pola i właściwości klasy lub struktury .NET, a zachowania są definiowane metodami klasy lub struktury.

UDT może być używany jako kolumnowa definicja tabeli, jako zmienna w Transact-SQL partii lub jako argument funkcji Transact-SQL lub procedury przechowywanej.

Sterownik OLE DB dla programu SQL Server

Sterownik OLE DB dla SQL Server obsługuje UDT jako typy binarne z informacjami o metadanych, co pozwala zarządzać UDT jako obiektami. Kolumny UDT są udostępniane jako DBTYPE_UDT, a ich metadane udostępniane przez podstawowy interfejs OLE DB IColumnRowset oraz nowy interfejs ISSCommandWithParameters .

Uwaga / Notatka

Metoda IRowsetFind::FindNextRow nie działa z typem danych UDT. DB_E_BADCOMPAREOP zwracany, jeśli UDT jest używany jako typ kolumny wyszukiwania.

Wiązania danych i przymusy

Poniższa tabela opisuje wiązanie i przymus, które występują przy użyciu wymienionych typów danych z SQL Server UDT. Kolumny UDT są udostępniane przez sterownik OLE DB dla SQL Server jako DBTYPE_UDT. Możesz pobierać metadane przez odpowiednie zestawy wierszy schematu, dzięki czemu możesz zarządzać własnymi zdefiniowanymi typami jako obiektami.

Typ danych Do serwera

UDT
Do serwera

nie-UDT
Z serwera

UDT
Z serwera

nie-UDT
DBTYPE_UDT Wspierało6 Błąd1 Wspierało6 Błąd5
DBTYPE_BYTES Wspierało6 N/D2 Wspierało6 N/D2
DBTYPE_WSTR Wspierano3,6 N/D2 Wspierali4,6 N/D2
DBTYPE_BSTR Wspierano3,6 N/D2 Wspierani4 N/D2
DBTYPE_STR Wspierano3,6 N/D2 Wspierali4,6 N/D2
DBTYPE_IUNKNOWN Niewspierane N/D2 Niewspierane N/D2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Wspierało6 N/D2 Wspierani4 N/D2
DBTYPE_VARIANT (VT_BSTR) Wspierano3,6 N/D2 N/A N/D2

1Jeśli typ serwera inny niż DBTYPE_UDT jest określony za pomocą ICommandWithParameters::SetParameterInfo, a typ accessora to DBTYPE_UDT, pojawia się błąd podczas wykonania instrukcji (DB_E_ERRORSOCCURRED status parametru to DBSTATUS_E_BADACCESSOR). W przeciwnym razie dane są wysyłane do serwera, ale serwer zwraca błąd wskazujący, że nie ma ukrytej konwersji z UDT na typ danych parametru.

cyfra arabskaWykraczające poza zakres tego artykułu.

3 Następuje konwersja danych z łańcucha heksagonalnego na dane binarne.

4 Następuje konwersja danych z danych binarnych na ciąg heksagonalny.

5Walidacja może nastąpić w momencie tworzenia accessora lub podczas pobierania, gdy błąd jest DB_E_ERRORSOCCURRED, status powiązania ustawiony na DBBINDSTATUS_UNSUPPORTEDCONVERSION.

6BY_REF można wykorzystać.

DBTYPE_NULL i DBTYPE_EMPTY mogą być ograniczone dla parametrów wejściowych, ale nie dla parametrów wyjściowych czy wyników. Gdy jest ograniczona dla parametrów wejściowych, status musi być ustawiony na DBSTATUS_S_ISNULL lub DBSTATUS_S_DEFAULT.

DBTYPE_UDT można także przekształcić na DBTYPE_EMPTY i DBTYPE_NULL, ale DBTYPE_NULL i DBTYPE_EMPTY nie mogą być przekształcone na DBTYPE_UDT. To jest zgodne z DBTYPE_BYTES.

Uwaga / Notatka

Do obsługi UDT jako parametrów używany jest nowy interfejs, ISSCommandWithParameters, który dziedziczy od ICommandWithParameters. Aplikacje muszą korzystać z tego interfejsu, aby ustawić co najmniej SSPROP_PARAM_UDT_NAME DBPROPSET_SQLSERVERPARAMETER zestawu właściwości dla parametrów UDT. Jeśli tego nie zrobię, ICommand::Execute zwróci DB_E_ERRORSOCCURRED. Ten interfejs i zestaw właściwości są opisane później w tym artykule.

Jeśli użytkownik wstawia typ zdefiniowany przez użytkownika do kolumny, która nie jest wystarczająco duża, aby pomieścić wszystkie dane, ICommand::Execute zwróci S_OK ze statusem DB_E_ERRORSOCCURRED.

Konwersje danych dostarczane przez usługi rdzeniowe OLE DB (IDataConvert) nie mają zastosowania do DBTYPE_UDT. Nie są obsługiwane żadne inne wiązania.

Dodatki i zmiany w zestawie wierszy w OLE DB

Sterownik OLE DB dla SQL Server dodaje nowe wartości lub zmiany do wielu podstawowych zestawów schematów OLE DB.

Zestaw wierszy PROCEDURE_PARAMETERS schematu

Do zestawu wierszy schematu PROCEDURE_PARAMETERS wprowadzono następujące dodatki.

Nazwa kolumny Typ Description
SS_UDT_CATALOGNAME DBTYPE_WSTR Trzyczęściowy identyfikator imienia.
SS_UDT_SCHEMANAME DBTYPE_WSTR Trzyczęściowy identyfikator imienia.
SS_UDT_NAME DBTYPE_WSTR Trzyczęściowy identyfikator imienia.
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Nazwa Assembly Qualified Name, która zawiera nazwę typu oraz wszystkie niezbędne identyfikacje zespołu do odwołania się przez CLR.

Zestaw wierszy SQL_ASSEMBLIES schematu

Sterownik OLE DB dla SQL Server udostępnia nowy, specyficzny dla dostawcy zestaw wierszy schematu, który opisuje zarejestrowane UDT. Serwer ASSEMBLY może być określony jako DBTYPE_WSTR, ale nie jest obecny w zestawie wierszy. Jeśli nie jest to określone, zestaw wierszy domyślnie będzie wyświetlany na bieżącym serwerze. Zestaw wierszy SQL_ASSEMBLIES schematu jest zdefiniowany w następującej tabeli:

Nazwa kolumny Typ Description
ASSEMBLY_CATALOG DBTYPE_WSTR Katalogowa nazwa zespołu, który zawiera ten typ.
ASSEMBLY_SCHEMA DBTYPE_WSTR Nazwa schematu, czyli właściciela, asembla, który zawiera ten typ. Chociaż zestawy są określane według bazy danych, a nie schematu, nadal mają właściciela, co jest tutaj odzwierciedlone.
ASSEMBLY_NAME DBTYPE_WSTR Nazwa zespołu, który zawiera ten typ.
ASSEMBLY_ID DBTYPE_UI4 ID obiektu asemblera, który zawiera ten typ.
PERMISSION_SET DBTYPE_WSTR Wartość wskazująca zakres dostępu dla asembleru. Wartości obejmują "BEZPIECZNE", "EXTERNAL_ACCESS" i "NIEBEZPIECZNE".
ASSEMBLY_BINARY DBTYPE_BYTES Binarna reprezentacja zgromadzenia.

Zestaw wierszy schematu SQL_ASSEMBLIES_ DEPENDENCIES

Sterownik OLE DB dla SQL Server udostępnia nowy, specyficzny dla dostawcy zestaw wierszy schematu, który opisuje zależności asemblera dla określonego serwera. ASSEMBLY_SERVER może być określony przez wywołującego jako DBTYPE_WSTR, ale nie występuje w zestawie wierszy. Jeśli nie jest to określone, zestaw wierszy domyślnie będzie wyświetlany na bieżącym serwerze. Zestaw wierszy SQL_ASSEMBLY_DEPENDENCIES schematu jest zdefiniowany w następującej tabeli:

Nazwa kolumny Typ Description
ASSEMBLY_CATALOG DBTYPE_WSTR Katalogowa nazwa zespołu, który zawiera ten typ.
ASSEMBLY_SCHEMA DBTYPE_WSTR Nazwa schematu, czyli właściciela, asembla, który zawiera ten typ. Chociaż zespoły są określane przez bazę danych, a nie schemat, nadal mają właściciela, co jest tutaj odzwierciedlone.
ASSEMBLY_ID DBTYPE_UI4 ID obiektu asamblera.
REFERENCED_ASSEMBLY_ID DBTYPE_UI4 Identyfikator obiektu odwołanego zespołu.

Zestaw wierszy SQL_USER_TYPES schematu

Sterownik OLE DB dla SQL Server udostępnia nowy zestaw wierszy schematu, SQL_USER_TYPES, który opisuje, kiedy dodane są zarejestrowane UDT dla określonego serwera. UDT_SERVER musi być określony jako DBTYPE_WSTR przez wywołującego, ale nie jest obecny w zestawie wierszy. Zestaw wierszy SQL_USER_TYPES schematu jest zdefiniowany w poniższej tabeli.

Nazwa kolumny Typ Description
UDT_CATALOGNAME DBTYPE_WSTR Dla kolumn UDT ta właściwość jest ciągiem określającym nazwę katalogu, w którym UDT jest zdefiniowany.
UDT_SCHEMANAME DBTYPE_WSTR Dla kolumn UDT ta właściwość jest ciągiem określającym nazwę schematu, w którym UDT jest zdefiniowany.
UDT_NAME DBTYPE_WSTR Nazwa zespołu zawierającego klasę UDT.
UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Pełna nazwa typu (AQN) zawiera nazwę typu poprzedzoną przestrzenią nazw, jeśli dotyczy.

Zestaw wierszy COLUMNS Schema

Dodatki do zestawu wierszy schematu COLUMNS obejmują następujące kolumny:

Nazwa kolumny Typ Description
SS_UDT_CATALOGNAME DBTYPE_WSTR Dla kolumn UDT ta właściwość jest ciągiem określającym nazwę katalogu, w którym UDT jest zdefiniowany.
SS_UDT_SCHEMANAME DBTYPE_WSTR Dla kolumn UDT ta właściwość jest ciągiem określającym nazwę schematu, w którym UDT jest zdefiniowany.
SS_UDT_NAME DBTYPE_WSTR Nazwa UDT
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Pełna nazwa typu (AQN) zawiera nazwę typu poprzedzoną przestrzenią nazw, jeśli dotyczy.

Dodatki i zmiany w zbiorach właściwości OLE DB

Sterownik OLE DB dla SQL Server dodaje nowe wartości lub zmiany do wielu podstawowych zestawów właściwości OLE DB.

Zbiór własności DBPROPSET_SQLSERVERPARAMETER

Aby wspierać UDT przez OLE DB, OLE DB Driver for SQL Server implementuje nowy zestaw właściwości DBPROPSET_SQLSERVERPARAMETER, który zawiera następujące wartości:

Name Typ Description
SSPROP_PARAM_UDT_CATALOGNAME DBTYPE_WSTR Trzyczęściowy identyfikator imienia.

Dla parametrów UDT ta właściwość jest ciągiem tekstów określającym nazwę katalogu, w którym zdefiniowany jest typ zdefiniowany przez użytkownika.
SSPROP_PARAM_UDT_SCHEMANAME DBTYPE_WSTR Trzyczęściowy identyfikator imienia.

Dla parametrów UDT ta właściwość jest ciągiem tekstów określającym nazwę schematu, w którym zdefiniowany jest typ zdefiniowany przez użytkownika.
SSPROP_PARAM_UDT_NAME DBTYPE_WSTR Trzyczęściowy identyfikator imienia.

Dla kolumn UDT ta właściwość to ciąg znaków określający pojedynczą nazwę części typu zdefiniowanego przez użytkownika.

SSPROP_PARAM_UDT_NAME jest obowiązkowe. SSPROP_PARAM_UDT_CATALOGNAME i SSPROP_PARAM_UDT_SCHEMANAME są opcjonalne. Jeśli któraś z właściwości zostanie błędnie określona, DB_E_ERRORSINCOMMAND zostanie zwrócona. Jeśli ani SSPROP_PARAM_UDT_CATALOGNAME, ani SSPROP_PARAM_UDT_SCHEMANAME nie są określone, UDT musi być zdefiniowany w tej samej bazie danych i schemacie co tabela. Jeśli definicja UDT nie jest w tym samym schemacie co tabela (ale jest w tej samej bazie danych), to SSPROP_PARAM_UDT_SCHEMANAME musi być określona. Jeśli definicja UDT znajduje się w innej bazie danych, należy określić zarówno SSPROP_PARAM_UDT_CATALOGNAME, jak i SSPROP_PARAM_UDT_SCHEMANAME.

Zbiór własności DBPROPSET_SQLSERVERCOLUMN

Aby wspierać tworzenie tabel w interfejsie ITableDefinition , sterownik OLE DB dla SQL Server dodaje następujące trzy nowe kolumny do zestawu właściwości DBPROPSET_SQLSERVERCOLUMN.

Name Description Typ Description
SSPROP_COL_UDT_CATALOGNAME UDT_CATALOGNAME VT_BSTR Dla kolumn typu DBTYPE_UDT ta właściwość jest ciągiem określającym nazwę katalogu, w którym zdefiniowany jest UDT.
SSPROP_COL_UDT_SCHEMANAME UDT_SCHEMANAME VT_BSTR Dla kolumn typu DBTYPE_UDT ta własność jest ciągiem określającym nazwę schematu, w którym zdefiniowany jest UDT.
SSPROP_COL_UDT_NAME UDT_NAME VT_BSTR Dla kolumn typu DBTYPE_UDT ta właściwość jest ciągiem określającym pojedynczą nazwę części UDT. Dla innych typów kolumn ta własność zwraca pusty ciąg znaków.

Uwaga / Notatka

UDT nie pojawiają się w PROVIDER_TYPES zbiorze wierszy schematu. Wszystkie kolumny mają dostęp do odczytu i zapisu.

ADO będzie odwoływać się do tych właściwości, używając odpowiedniego wpisu w kolumnie Opis.

SSPROP_COL_UDTNAME jest obowiązkowe. SSPROP_COL_UDT_CATALOGNAME i SSPROP_COL_UDT_SCHEMANAME są opcjonalne. Jeśli któraś z właściwości zostanie błędnie określona, DB_E_ERRORSINCOMMAND zostanie zwrócona.

Jeśli ani SSPROP_COL_UDT_CATALOGNAME, ani SSPROP_COL_UDT_SCHEMANAME nie są określone, UDT musi być zdefiniowany w tej samej bazie danych i schemacie co tabela.

Jeśli definicja UDT nie jest w tym samym schemacie co tabela (ale jest w tej samej bazie danych), SSPROP_COL_UDT_SCHEMANAME musi być określona.

Jeśli definicja UDT znajduje się w innej bazie danych, należy określić zarówno SSPROP_COL_UDT_CATALOGNAME, jak i SSPROP_COL_UDT_SCHEMANAME.

Dodatki i zmiany interfejsu OLE DB

Sterownik OLE DB dla SQL Server dodaje nowe wartości lub zmiany do wielu podstawowych interfejsów OLE DB.

Interfejs ISSCommandWithParameters

Aby wspierać UDT przez OLE DB, OLE DB Driver for SQL Server wprowadza szereg zmian, w tym dodanie interfejsu ISSCommandWithParameters . Ten nowy interfejs dziedziczy z rdzenia interfejsu OLE DB ICommandWithParameters. Oprócz trzech metod odziedziczonych z ICommandWithParameters; GetParameterInfo, MapParameterNames oraz SetParameterInfo; ISSCommandWithParameters udostępnia metody GetParameterProperties i SetParameterProperties , które są używane do obsługi specyficznych dla serwerów typów danych.

Uwaga / Notatka

Interfejs ISSCommandWithParameters również wykorzystuje nową strukturę SSPARAMPROPS.

Interfejs IColumnsRowset

Oprócz interfejsu ISSCommandWithParameters , sterownik OLE DB dla SQL Server dodaje także nowe wartości do zestawu wierszy zwracanych po wywołaniu metody IColumnsRowset::GetColumnRowset , w tym następujące.

Nazwa kolumny Typ Description
DBCOLUMN_SS_UDT_CATALOGNAME DBTYPE_WSTR Identyfikator nazwy katalogowej UDT.
DBCOLUMN_SS_UDT_SCHEMANAME DBTYPE_WSTR Identyfikator nazwy schematu UDT.
DBCOLUMN_SS_UDT_NAME DBTYPE_WSTR Identyfikator nazwy UDT.
DBCOLUMN_SS_ASSEMBLY_TYPENAME DBTYPE_WSTR Nazwa kwalifikowana dla zespołu, która zawiera nazwę typu oraz wszystkie niezbędne identyfikacje zespołu do odniesienia przez CLR.

Możesz odróżnić kolumnę UDT serwera od innych typów binarnych, gdy DBCOLUMN_TYPE jest ustawiony na DBTYPE_UDT, patrząc na dodane metadane UDT opisane w poprzedniej tabeli. Jeśli dane są częściowo kompletne, typ serwera to UDT. Dla typów serwerów innych niż UDT kolumny te zawsze zwracane są jako NULL.

Zobacz też

OLE DB Driver for SQL Server Features
ISSCommandWithParameters (OLE DB)