Delen via


Gebruik van User-Defined types in SQL Server Native Client

Van toepassing op:SQL ServerAzure SQL DatabaseAnalytics Platform Systeem (PDW)

Belangrijk

SQL Server Native Client (SNAC) wordt niet geleverd met:

  • SQL Server 2022 (16.x) en latere versies
  • SQL Server Management Studio 19 en latere versies

De SQL Server Native Client (SQLNCLI of SQLNCLI11) en de verouderde Microsoft OLE DB-provider voor SQL Server (SQLOLEDB) worden niet aanbevolen voor de ontwikkeling van nieuwe toepassingen.

Gebruik een van de volgende stuurprogramma's voor nieuwe projecten:

Voor SQLNCLI die als onderdeel van SQL Server Database Engine (versies 2012 tot en met 2019) wordt geleverd, raadpleegt u deze uitzondering voor de levenscyclus van ondersteuning.

SQL Server 2005 (9.x) introduceerde door de gebruiker gedefinieerde types (UDT's). UDT's breiden het SQL-typesysteem uit door je toe te staan objecten en aangepaste datastructuren op te slaan in een SQL Server-database. UDT's kunnen meerdere gegevenstypen bevatten en kunnen gedrag hebben, waarbij ze worden onderscheiden van de traditionele aliasgegevenstypen die bestaan uit één gegevenstype van het SQL Server-systeem. UDT's worden gedefinieerd met behulp van een van de talen die worden ondersteund door de .NET common language runtime (CLR) en verifieerbare code produceren. Dit omvat C# en Visual Basic .NET. De data wordt blootgesteld als velden en eigenschappen van een .NET-klasse of -structuur, en gedragingen worden gedefinieerd door methoden van de klasse of structuur.

Een UDT kan worden gebruikt als kolomdefinitie van een tabel, als variabele in een Transact-SQL batch, of als argument van een Transact-SQL functie of opgeslagen procedure.

OLE DB-provider van SQL Server Native Client

De SQL Server Native Client OLE DB-provider ondersteunt UDT's als binaire types met metadata-informatie, waardoor je UDT's als objecten kunt beheren. UDT-kolommen worden als DBTYPE_UDT blootgesteld, en hun metadata wordt blootgesteld via de kerninterface van OLE DB IColumnRowset en de nieuwe ISSCommandWithParameters-interface .

Opmerking

De IRowsetFind::FindNextRow-methode werkt niet met het UDT-datatype. DB_E_BADCOMPAREOP wordt teruggegeven als de UDT wordt gebruikt als zoekkolomtype.

Databindingen en Dwangen

De volgende tabel beschrijft de binding en coercion die optreedt bij het gebruik van de vermelde datatypes met een SQL Server UDT. UDT-kolommen worden blootgesteld via de SQL Server Native Client OLE DB-provider als DBTYPE_UDT. Je kunt metadata via de juiste schema-rijsets halen, zodat je je eigen gedefinieerde types als objecten kunt beheren.

Gegevenstype Naar de server

UDT
Naar de server

niet-UDT
Vanaf Server

UDT
Vanaf Server

niet-UDT
DBTYPE_UDT Ondersteund6 Fout1 Ondersteund6 Fout5
DBTYPE_BYTES Ondersteund6 N/B2 Ondersteund6 N/B2
DBTYPE_WSTR Ondersteund3,6 N/B2 Ondersteund4,6 N/B2
DBTYPE_BSTR Ondersteund3,6 N/B2 Ondersteund4 N/B2
DBTYPE_STR Ondersteund3,6 N/B2 Ondersteund4,6 N/B2
DBTYPE_IUNKNOWN Niet ondersteund N/B2 Niet ondersteund N/B2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Ondersteund6 N/B2 Ondersteund4 N/B2
DBTYPE_VARIANT (VT_BSTR) Ondersteund3,6 N/B2 N/A N/B2

1Als een servertype anders dan DBTYPE_UDT is gespecificeerd met ICommandWithParameters::SetParameterInfo en het accessortype is DBTYPE_UDT, treedt er een fout op wanneer de instructie wordt uitgevoerd (DB_E_ERRORSOCCURRED; de parameterstatus is DBSTATUS_E_BADACCESSOR). Anders worden de gegevens naar de server gestuurd, maar de server geeft een foutmelding die aangeeft dat er geen impliciete conversie is van UDT naar het datatype van de parameter.

Arabisch cijferBuiten het bereik van dit onderwerp.

3 Gegevensconversie van hex-string naar binaire data vindt plaats.

4 Gegevensconversie van binaire data naar hex-string vindt plaats.

5Validatie kan plaatsvinden bij het aanmaken van de accessor, of bij het ophalen, waarbij de fout DB_E_ERRORSOCCURRED is, met bindingsstatus ingesteld op DBBINDSTATUS_UNSUPPORTEDCONVERSION.

6BY_REF mag worden gebruikt.

DBTYPE_NULL en DBTYPE_EMPTY kunnen worden gebonden aan invoerparameters, maar niet aan uitvoerparameters of resultaten. Wanneer de status wordt gebonden voor invoerparameters, moet de status worden ingesteld op DBSTATUS_S_ISNULL of DBSTATUS_S_DEFAULT.

DBTYPE_UDT kunnen ook worden omgezet naar DBTYPE_EMPTY en DBTYPE_NULL, maar DBTYPE_NULL en DBTYPE_EMPTY kunnen niet worden omgezet naar DBTYPE_UDT. Dit komt overeen met DBTYPE_BYTES.

Opmerking

Er wordt een nieuwe interface gebruikt voor het omgaan met UDT's als parameters, ISSCommandWithParameters, die overneemt van ICommandWithParameters. Applicaties moeten deze interface gebruiken om ten minste de SSPROP_PARAM_UDT_NAME van de DBPROPSET_SQLSERVERPARAMETER eigenschapsset voor UDT-parameters in te stellen. Als dit niet gebeurt, zal ICommand::Execute DB_E_ERRORSOCCURRED teruggeven. Deze interface en eigenschapsset worden later in dit onderwerp beschreven.

Als een door de gebruiker gedefinieerd type wordt ingevoegd in een kolom die niet groot genoeg is om alle gegevens te bevatten, zal ICommand::Execute S_OK teruggeven met een status van DB_E_ERRORSOCCURRED.

Dataconversies geleverd door OLE DB core services (IDataConvert) zijn niet van toepassing op DBTYPE_UDT. Er worden geen andere bindingen ondersteund.

OLE DB Rowset Toevoegingen en Wijzigingen

SQL Server Native Client voegt nieuwe waarden of wijzigingen toe aan veel van de kern van de OLE DB-schema-rijsets.

De PROCEDURE_PARAMETERS Schema Rowset

De volgende toevoegingen zijn gedaan aan de PROCEDURE_PARAMETERS schema-rijset.

Kolomnaam Typologie Description
SS_UDT_CATALOGNAME DBTYPE_WSTR De driedelige naamidentificatie.
SS_UDT_SCHEMANAME DBTYPE_WSTR De driedelige naamidentificatie.
SS_UDT_NAME DBTYPE_WSTR De driedelige naamidentificatie.
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR De Assembly Qualified Name, die de typenaam en alle assembly-identificatie omvat die door de CLR moeten worden genoemd.

De SQL_ASSEMBLIES Schema Rowset

De SQL Server Native Client OLE DB-provider stelt een nieuwe provider-specifieke schema-rijset bloot die de geregistreerde UDT's beschrijft. De ASSEMBLY-server kan als een DBTYPE_WSTR worden gespecificeerd, maar is niet aanwezig in de rowset. Als dat niet wordt gespecificeerd, zal de rowset standaard naar de huidige server gaan. De SQL_ASSEMBLIES schema-rijset wordt gedefinieerd in de volgende tabel.

Kolomnaam Typologie Description
ASSEMBLY_CATALOG DBTYPE_WSTR De catalogusnaam van de assemblage die het type bevat.
ASSEMBLY_SCHEMA DBTYPE_WSTR De schemanaam, of eigenaarnaam, van de assembly die het type bevat. Hoewel assemblies worden beperkt door database en niet per schema, hebben ze nog steeds een eigenaar die hier wordt weergegeven.
ASSEMBLY_NAME DBTYPE_WSTR De naam van de assemblage die het type bevat.
ASSEMBLY_ID DBTYPE_UI4 De object-id van de assembly die het type bevat.
PERMISSION_SET DBTYPE_WSTR Een waarde die de reikwijdte van de toegang voor de assembly aangeeft. Waarden zijn onder andere "VEILIG", "EXTERNAL_ACCESS" en "ONVEILIG".
ASSEMBLY_BINARY DBTYPE_BYTES De binaire representatie van de assemblage.

De SQL_ASSEMBLIES_ DEPENDENCIES Schema Rowset

SQL Server Native Client OLE DB-provider stelt een nieuwe provider-specifieke schema-rijset bloot die de assembly-afhankelijkheden voor een gespecificeerde server beschrijft. ASSEMBLY_SERVER kan door de aanroeper als een DBTYPE_WSTR worden gespecificeerd, maar is niet aanwezig in de rijset. Als dat niet wordt gespecificeerd, zal de rowset standaard naar de huidige server gaan. De SQL_ASSEMBLY_DEPENDENCIES schema-rijset wordt gedefinieerd in de volgende tabel.

Kolomnaam Typologie Description
ASSEMBLY_CATALOG DBTYPE_WSTR De catalogusnaam van de assemblage die het type bevat.
ASSEMBLY_SCHEMA DBTYPE_WSTR De schemanaam, of eigenaarnaam, van de assembly die het type bevat. Hoewel assemblies worden begrensd door database en niet per schema, hebben ze nog steeds een eigenaar, wat hier wordt weerspiegeld.
ASSEMBLY_ID DBTYPE_UI4 De object-id van de assembly.
REFERENCED_ASSEMBLY_ID DBTYPE_UI4 De object-id van de verwezen assembly.

De SQL_USER_TYPES Schema Rowset

SQL Server Native Client OLE DB-provider stelt een nieuwe schema-rijset beschikbaar, SQL_USER_TYPES, die beschrijft wanneer de geregistreerde UDT's voor een gespecificeerde server worden toegevoegd. UDT_SERVER moet door de aanroeper als een DBTYPE_WSTR worden gespecificeerd, maar is niet aanwezig in de rijset. De SQL_USER_TYPES schema-rijset wordt gedefinieerd in de volgende tabel.

Kolomnaam Typologie Description
UDT_CATALOGNAME DBTYPE_WSTR Voor UDT-kolommen is deze eigenschap een string die de naam specificeert van de catalogus waarin de UDT is gedefinieerd.
UDT_SCHEMANAME DBTYPE_WSTR Voor UDT-kolommen is deze eigenschap een string die de naam specificeert van het schema waarin de UDT is gedefinieerd.
UDT_NAME DBTYPE_WSTR De naam van de vergadering die de UDT-klasse bevat.
UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Volledige typenaam (AQN) bevat typenaam als voorvoegsel namespace indien van toepassing.

De COLUMNS schema-rijset

Toevoegingen aan de COLUMNS-schema-rijset omvatten de volgende kolommen.

Kolomnaam Typologie Description
SS_UDT_CATALOGNAME DBTYPE_WSTR Voor UDT-kolommen is deze eigenschap een string die de naam specificeert van de catalogus waarin de UDT is gedefinieerd.
SS_UDT_SCHEMANAME DBTYPE_WSTR Voor UDT-kolommen is deze eigenschap een string die de naam specificeert van het schema waarin de UDT is gedefinieerd.
SS_UDT_NAME DBTYPE_WSTR De naam van de UDT
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Volledige typenaam (AQN) bevat typenaam als voorvoegsel namespace indien van toepassing.

OLE DB Property Set toevoegingen en wijzigingen

SQL Server Native Client voegt nieuwe waarden of wijzigingen toe aan veel van de kern van de OLE DB-eigenschappen.

De DBPROPSET_SQLSERVERPARAMETER eigenschapsset

Om UDT's via OLE DB te ondersteunen, implementeert SQL Server Native Client de nieuwe DBPROPSET_SQLSERVERPARAMETER property set die de volgende waarden bevat.

Naam Typologie Description
SSPROP_PARAM_UDT_CATALOGNAME DBTYPE_WSTR De driedelige naamidentificatie.

Voor UDT-parameters is deze eigenschap een string die de naam specificeert van de catalogus waarin het door de gebruiker gedefinieerde type wordt gedefinieerd.
SSPROP_PARAM_UDT_SCHEMANAME DBTYPE_WSTR De driedelige naamidentificatie.

Voor UDT-parameters is deze eigenschap een string die de naam specificeert van het schema waarin het door de gebruiker gedefinieerde type wordt gedefinieerd.
SSPROP_PARAM_UDT_NAME DBTYPE_WSTR De driedelige naamidentificatie.

Voor UDT-kolommen is deze eigenschap een string die de naam van het enkele onderdeel van het door de gebruiker gedefinieerde type specificeert.

SSPROP_PARAM_UDT_NAME is verplicht. SSPROP_PARAM_UDT_CATALOGNAME en SSPROP_PARAM_UDT_SCHEMANAME zijn optioneel. Als een van de eigenschappen verkeerd wordt gespecificeerd, wordt DB_E_ERRORSINCOMMAND teruggegeven. Als zowel SSPROP_PARAM_UDT_CATALOGNAME als SSPROP_PARAM_UDT_SCHEMANAME niet zijn gespecificeerd, moet de UDT worden gedefinieerd in dezelfde database en schema als de tabel. Als de UDT-definitie niet in hetzelfde schema zit als de tabel (maar wel in dezelfde database), dan moet SSPROP_PARAM_UDT_SCHEMANAME worden gespecificeerd. Als de UDT-definitie in een andere database staat, moeten zowel SSPROP_PARAM_UDT_CATALOGNAME als SSPROP_PARAM_UDT_SCHEMANAME worden gespecificeerd.

De DBPROPSET_SQLSERVERCOLUMN eigenschapsset

Om het maken van tabellen in de ITableDefinition-interface te ondersteunen, voegt SQL Server Native Client de volgende drie nieuwe kolommen toe aan de set DBPROPSET_SQLSERVERCOLUMN eigenschappen.

Naam Description Typologie Description
SSPROP_COL_UDT_CATALOGNAME UDT_CATALOGNAME VT_BSTR Voor kolommen van type DBTYPE_UDT is deze eigenschap een string die de naam specificeert van de catalogus waarin de UDT is gedefinieerd.
SSPROP_COL_UDT_SCHEMANAME UDT_SCHEMANAME VT_BSTR Voor kolommen van type DBTYPE_UDT is deze eigenschap een string die de naam specificeert van het schema waarin de UDT is gedefinieerd.
SSPROP_COL_UDT_NAME UDT_NAME VT_BSTR Voor kolommen van type DBTYPE_UDT is deze eigenschap een string die de naam van één deel van de UDT specificeert. Voor andere kolomtypen geeft deze eigenschap een lege string terug.

Opmerking

UDT's komen niet voor in de PROVIDER_TYPES schema-rijset. Alle kolommen hebben lees- en schrijftoegang.

ADO verwijst naar deze eigenschappen door gebruik te maken van de bijbehorende vermelding in de kolom Beschrijving.

SSPROP_COL_UDTNAME is verplicht. SSPROP_COL_UDT_CATALOGNAME en SSPROP_COL_UDT_SCHEMANAME zijn optioneel. Als een van de eigendommen verkeerd is gespecificeerd, wordt DB_E_ERRORSINCOMMAND teruggegeven.

Als noch SSPROP_COL_UDT_CATALOGNAME noch SSPROP_COL_UDT_SCHEMANAME is gespecificeerd, moet de UDT worden gedefinieerd in dezelfde database en schema als de tabel.

Als de UDT-definitie niet in hetzelfde schema zit als de tabel (maar wel in dezelfde database), moet SSPROP_COL_UDT_SCHEMANAME worden gespecificeerd.

Als de UDT-definitie in een andere database staat, moeten zowel SSPROP_COL_UDT_CATALOGNAME als SSPROP_COL_UDT_SCHEMANAME worden gespecificeerd.

OLE DB Interface Toevoegingen en Wijzigingen

SQL Server Native Client voegt nieuwe waarden of wijzigingen toe aan veel van de kerninterfaces van OLE DB.

De ISSCommandWithParameters Interface

Om UDT's via OLE DB te ondersteunen, voert SQL Server Native Client een aantal wijzigingen door, waaronder de toevoeging van de ISSCommandWithParameters-interface . Deze nieuwe interface erft van de kern OLE DB-interface ICommandWithParameters. Naast de drie methoden die zijn overgenomen van ICommandWithParameters; GetParameterInfo, MapParameterNames en SetParameterInfo; ISSCommandWithParameters biedt de methoden GetParameterProperties en SetParameterProperties die worden gebruikt om serverspecifieke datatypes te verwerken.

Opmerking

De ISSCommandWithParameters-interface maakt ook gebruik van de nieuwe SSPARAMPROPS-structuur.

De IColumnsRowset-interface

Naast de ISSCommandWithParameters-interface voegt SQL Server Native Client ook nieuwe waarden toe aan de rowset die wordt teruggegeven door het aanroepen van de IColumnsRowset::GetColumnRowset-methode , inclusief het volgende.

Kolomnaam Typologie Description
DBCOLUMN_SS_UDT_CATALOGNAME DBTYPE_WSTR Een UDT-catalogusnaam-identificatie.
DBCOLUMN_SS_UDT_SCHEMANAME DBTYPE_WSTR Een UDT-schemanaam-identificatie.
DBCOLUMN_SS_UDT_NAME DBTYPE_WSTR Een UDT-naamidentificatie.
DBCOLUMN_SS_ASSEMBLY_TYPENAME DBTYPE_WSTR De naam van de assemblee is gekwalificeerd, die de typenaam en alle assembly-identificatie bevat die door de CLR moeten worden genoemd.

Je kunt een server UDT-kolom onderscheiden van andere binaire types wanneer de DBCOLUMN_TYPE op DBTYPE_UDT is ingesteld door te kijken naar de hierboven genoemde toegevoegde UDT-metadata. Als die data gedeeltelijk compleet is, is het servertype een UDT. Voor niet-UDT-servertypes worden deze kolommen altijd als NULL teruggegeven.

SQL Server Native Client ODBC Driver

Er zijn een aantal wijzigingen aangebracht in de SQL Server Native Client ODBC-driver om UDT's te ondersteunen. De SQL Server Native Client ODBC-driver koppelt de SQL Server UDT aan SQL_SS_UDT driver-specifieke SQL-datatype-identificatie. UDT-kolommen worden als SQL_SS_UDT gepresenteerd. Als je een UDT-kolom expliciet aan een ander type in een SQL-instructie koppelt door gebruik te maken van de ToString - of ToXMLString-methoden van de UDT of via de CAST/CONVERTE-functie , weerspiegelt het type kolom in de resultaatset het daadwerkelijke type waarin de kolom is omgezet

SQLColAttribute, SQLDescribeParam, SQLGetDescField

Er zijn vier nieuwe driver-specifieke descriptorvelden toegevoegd om extra informatie te bieden voor ofwel een UDT-kolom van een resultaatset, of een UDT-parameter van opgeslagen procedure/geparametriseerde query, die kan worden opgehaald via de SQLColAttribute, SQLDescribeParam en SQLGetDescField-functies .

De vier nieuwe descriptorvelden die zijn toegevoegd zijn SQL_CA_SS_UDT_CATALOG_NAME, SQL_CA_SS_UDT_SCHEMA_NAME, SQL_CA_SS_UDT_TYPE_NAME en SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME.

SQLColumns, SQLProcedureColumns

Daarnaast worden drie nieuwe driverspecifieke kolommen toegevoegd aan de resultaatset die wordt teruggegeven vanuit de SQLColumns - en SQLProcedureColumns-functies om extra informatie te bieden over een UDT-resultaatsetkolom of een UDT-parameter. Deze drie nieuwe kolommen zijn SS_UDT_CATALOG_NAME, SS_UDT_SCHEMA_NAME en SS_UDT_ASSEMBLY_TYPE_NAME.

Ondersteunde conversies

Bij het omzetten van SQL naar C datatypes kunnen SQL_C_WCHAR, SQL_C_BINARY en SQL_C_CHAR allemaal worden omgezet naar SQL_SS_UDT. Let echter op dat binaire gegevens worden omgezet naar een hex-string wanneer men converteert van de SQL_C_WCHAR en SQL_C_CHAR SQL-datatypes.

Bij het omzetten van C- naar SQL-datatypes kunnen SQL_C_WCHAR, SQL_C_BINARY en SQL_C_CHAR allemaal worden omgezet naar SQL_SS_UDT. Let echter op dat binaire gegevens worden omgezet naar een hex-string wanneer men converteert van de SQL_C_WCHAR en SQL_C_CHAR SQL-datatypes.

Zie ook

SQL Server Native Clientfuncties
ISSCommandWithParameters (OLE DB)