Share via


Utilizzo dei tipi definiti dall'utente (UDT)

In SQL Server 2005 sono stati introdotti i tipi definiti dall'utente (UDT). I tipi definiti dall'utente estendono il sistema di tipi SQL consentendo di archiviare oggetti e strutture di dati personalizzate in un database di SQL Server. I tipi definiti dall'utente possono contenere più tipi di dati e possono assumere comportamenti, differenziandoli dai tipi di dati alias tradizionali costituiti da un singolo tipo di dati di sistema SQL Server. I tipi definiti dall'utente vengono definiti utilizzando uno dei linguaggi supportati da .NET Common Language Runtime (CLR) che generano codice verificabile, ovvero Microsoft Visual C#® e Visual Basic® .NET. I dati vengono esposti come campi e proprietà di una classe o struttura .NET mentre i comportamenti vengono definiti dai metodi della classe o della struttura.

Un tipo definito dall'utente può essere utilizzato come definizione di colonna di una tabella, come variabile in un batch Transact-SQL o come argomento di una funzione Transact-SQL o di una stored procedure. Per ulteriori informazioni sui tipi definiti dall'utente, vedere Utilizzo di tipi CLR definiti dall'utente.

Provider OLE DB di SQL Server Native Client

Il provider OLE DB di SQL Server Native Client supporta i tipi definiti dall'utente come tipi binari con le informazioni sui metadati che consentono di gestire i tipi definiti dall'utente come oggetti. Le colonne con tipo definito dall'utente vengono esposte come DBTYPE_UDT e i relativi metadati vengono esposti tramite l'interfaccia OLE DB principale IColumnRowset e la nuova interfaccia ISSCommandWithParameters.

Nota

Il metodo IRowsetFind::FindNextRow non funziona con il tipo di dati UDT. Se il tipo definito dall'utente viene utilizzato come tipo di colonna di ricerca, viene restituito DB_E_BADCOMPAREOP.

Associazione dati e coercizioni

Nella tabella seguente vengono descritte l'associazione e la coercizione che si verificano quando si utilizzano i tipi di dati elencati con un tipo definito dall'utente SQL Server. Le colonne con tipo definito dall'utente vengono esposte tramite il provider OLE DB di SQL Server Native Client come DBTYPE_UDT. È possibile ottenere i metadati tramite i set di righe dello schema appropriati in modo da potere gestire i tipi definiti personalizzati come oggetti.

Tipo di dati

Al server

UDT

Al server

non UDT

Dal server

UDT

Dal server

non UDT

DBTYPE_UDT

Supportato6

Errore1

Supportato6

Errore5

DBTYPE_BYTES

Supportato6

N/D2

Supportato6

N/D2

DBTYPE_WSTR

Supportato3, 6

N/D2

Supportato4, 6

N/D2

DBTYPE_BSTR

Supportato3, 6

N/D2

Supportato4

N/D2

DBTYPE_STR

Supportato3, 6

N/D2

Supportato4, 6

N/D2

DBTYPE_IUNKNOWN

Non supportato

N/D2

Non supportato

N/D2

DBTYPE_VARIANT (VT_UI1 | VT_ARRAY)

Supportato6

N/D2

Supportato4

N/D2

DBTYPE_VARIANT (VT_BSTR)

Supportato3, 6

N/D2

N/D

N/D2

1 Se viene specificato un tipo di server diverso da DBTYPE_UDT con ICommandWithParameters::SetParameterInfo e il tipo di funzione di accesso è DBTYPE_UDT, si verifica un errore quando viene eseguita l'istruzione (DB_E_ERRORSOCCURRED; lo stato del parametro è DBSTATUS_E_BADACCESSOR). In caso contrario, i dati vengono inviati al server, ma il server restituisce un errore indicando che non è possibile eseguire una conversione implicita dal tipo definito dall'utente al tipo di dati del parametro.

2 Esula dall'ambito di questo argomento.

3 Si verifica la conversione dei dati da stringa esadecimale a dati binari.

4 Si verifica la conversione dei dati da dati binari a stringa esadecimale.

5 La convalida può verificarsi durante la creazione della funzione di accesso o durante il recupero, l'errore è DB_E_ERRORSOCCURRED, lo stato dell'associazione impostato su DBBINDSTATUS_UNSUPPORTEDCONVERSION.

6 Può essere utilizzato BY_REF.

DBTYPE_NULL e DBTYPE_EMPTY possono essere associati per i parametri di input ma non per i parametri di output o per i risultati. Se vengono associati per i parametri di input, lo stato deve essere impostato su DBSTATUS_S_ISNULL o DBSTATUS_S_DEFAULT.

DBTYPE_UDT può essere convertito anche in DBTYPE_EMPTY e DBTYPE_NULL, ma DBTYPE_NULL e DBTYPE_EMPTY non possono essere convertiti in DBTYPE_UDT. È coerente con DBTYPE_BYTES.

Nota

Viene utilizzata una nuova interfaccia per la gestione dei tipi definiti dall'utente come parametri, ISSCommandWithParameters, che eredita da ICommandWithParameters. Le applicazioni devono utilizzare questa interfaccia per impostare almeno SSPROP_PARAM_UDT_NAME del set di proprietà DBPROPSET_SQLSERVERPARAMETER per i parametri UDT. In caso contrario, ICommand::Execute restituirà DB_E_ERRORSOCCURRED. Questo set di proprietà e questa interfaccia vengono descritti più avanti in questo argomento.

Se un tipo definito dall'utente viene inserito in una colonna che non consente di contenere tutti i relativi dati, ICommand::Execute restituirà S_OK con lo stato DB_E_ERRORSOCCURRED.

Le conversioni dei dati fornite dai servizi principali OLE DB (IDataConvert) non sono applicabili a DBTYPE_UDT. Non sono supportate altre associazioni.

Aggiunte e modifiche ai set di righe OLE DB

In SQL Server Native Client sono stati aggiunti nuovi valori o modifiche a molti dei set di righe dello schema OLE DB principali.

Set di righe dello schema PROCEDURE_PARAMETERS

Al set di righe dello schema PROCEDURE_PARAMETERS sono state effettuate le seguenti aggiunte.

Nome colonna

Tipo

Descrizione

SS_UDT_CATALOGNAME

DBTYPE_WSTR

Identificatore del nome in tre parti.

SS_UDT_SCHEMANAME

DBTYPE_WSTR

Identificatore del nome in tre parti.

SS_UDT_NAME

DBTYPE_WSTR

Identificatore del nome in tre parti.

SS_UDT_ASSEMBLY_TYPENAME

DBTYPE_WSTR

Nome completo dell'assembly che include il nome del tipo e l'identificazione dell'assembly necessaria a cui deve fare riferimento CLR.

Set di righe dello schema SQL_ASSEMBLIES

Il provider OLE DB di SQL Server Native Client espone un nuovo set di righe dello schema specifico del provider che descrive i tipi definiti dall'utente registrati. Il server ASSEMBLY può essere specificato come DBTYPE_WSTR, ma non è presente nel set di righe. Se non viene specificato, il set di righe imposterà come valore predefinito il server corrente. Il set di righe dello schema SQL_ASSEMBLIES viene definito nella tabella seguente.

Nome colonna

Tipo

Descrizione

ASSEMBLY_CATALOG

DBTYPE_WSTR

Nome del catalogo dell'assembly contenente il tipo.

ASSEMBLY_SCHEMA

DBTYPE_WSTR

Nome dello schema o nome del proprietario dell'assembly contenente il tipo. Sebbene l'ambito degli assembly sia il database e non lo schema, gli assembly dispongono di un proprietario qui rappresentato.

ASSEMBLY_NAME

DBTYPE_WSTR

Nome dell'assembly contenente il tipo.

ASSEMBLY_ID

DBTYPE_UI4

ID oggetto dell'assembly contenente il tipo.

PERMISSION_SET

DBTYPE_WSTR

Valore che indica l'ambito di accesso per l'assembly. I valori includono "SAFE", "EXTERNAL_ACCESS" e "UNSAFE".

ASSEMBLY_BINARY

DBTYPE_BYTES

Rappresentazione binaria dell'assembly.

Set di righe dello schema SQL_ASSEMBLIES_ DEPENDENCIES

Il provider OLE DB di SQL Server Native Client espone un nuovo set di righe dello schema specifico del provider che descrive le dipendenze dell'assembly per un server specificato. ASSEMBLY_SERVER può essere specificato dal chiamante come DBTYPE_WSTR, ma non è presente nel set di righe. Se non viene specificato, il set di righe imposterà come valore predefinito il server corrente. Il set di righe dello schema SQL_ASSEMBLY_DEPENDENCIES viene definito nella tabella seguente.

Nome colonna

Tipo

Descrizione

ASSEMBLY_CATALOG

DBTYPE_WSTR

Nome del catalogo dell'assembly contenente il tipo.

ASSEMBLY_SCHEMA

DBTYPE_WSTR

Nome dello schema o nome del proprietario dell'assembly contenente il tipo. Sebbene l'ambito degli assembly sia il database e non lo schema, gli assembly dispongono di un proprietario qui rappresentato.

ASSEMBLY_ID

DBTYPE_UI4

ID oggetto dell'assembly.

REFERENCED_ASSEMBLY_ID

DBTYPE_UI4

ID oggetto dell'assembly a cui viene fatto riferimento.

Set di righe dello schema SQL_USER_TYPES

Il provider OLE DB di SQL Server Native Client espone il nuovo set di righe dello schema, SQL_USER_TYPES, che descrive quando vengono aggiunti i tipi definiti dall'utente registrati per un server specificato. UDT_SERVER deve essere specificato dal chiamante come DBTYPE_WSTR, ma non è presente nel set di righe. Il set di righe dello schema SQL_USER_TYPES viene definito nella tabella seguente.

Nome colonna

Tipo

Descrizione

UDT_CATALOGNAME

DBTYPE_WSTR

Per le colonne con tipo definito dall'utente questa proprietà è una stringa che specifica il nome del catalogo in cui viene definito il tipo definito dall'utente.

UDT_SCHEMANAME

DBTYPE_WSTR

Per le colonne con tipo definito dall'utente questa proprietà è una stringa che specifica il nome dello schema in cui viene definito il tipo definito dall'utente.

UDT_NAME

DBTYPE_WSTR

Nome dell'assembly contenente la classe UDT.

UDT_ASSEMBLY_TYPENAME

DBTYPE_WSTR

Il nome completo del tipo (AQN) include il nome del tipo preceduto dallo spazio dei nomi se applicabile.

Set di righe dello schema COLUMNS

Le aggiunte al set di righe dello schema COLUMNS includono le colonne seguenti.

Nome colonna

Tipo

Descrizione

SS_UDT_CATALOGNAME

DBTYPE_WSTR

Per le colonne con tipo definito dall'utente questa proprietà è una stringa che specifica il nome del catalogo in cui viene definito il tipo definito dall'utente.

SS_UDT_SCHEMANAME

DBTYPE_WSTR

Per le colonne con tipo definito dall'utente questa proprietà è una stringa che specifica il nome dello schema in cui viene definito il tipo definito dall'utente.

SS_UDT_NAME

DBTYPE_WSTR

Nome del tipo definito dall'utente.

SS_UDT_ASSEMBLY_TYPENAME

DBTYPE_WSTR

Il nome completo del tipo (AQN) include il nome del tipo preceduto dallo spazio dei nomi se applicabile.

Aggiunte e modifiche ai set di proprietà OLE DB

In SQL Server Native Client sono stati aggiunti nuovi valori o modifiche a molti dei set di proprietà OLE DB principali.

Set di proprietà DBPROPSET_SQLSERVERPARAMETER

Per supportare i tipi definiti dall'utente tramite OLE DB, in SQL Server Native Client è stato implementato il nuovo set di proprietà DBPROPSET_SQLSERVERPARAMETER contenente i valori seguenti.

Nome

Tipo

Descrizione

SSPROP_PARAM_UDT_CATALOGNAME

DBTYPE_WSTR

Identificatore del nome in tre parti.

Per i parametri UDT questa proprietà è una stringa che specifica il nome del catalogo in cui viene definito il tipo definito dall'utente.

SSPROP_PARAM_UDT_SCHEMANAME

DBTYPE_WSTR

Identificatore del nome in tre parti.

Per i parametri UDT questa proprietà è una stringa che specifica il nome dello schema in cui viene definito il tipo definito dall'utente.

SSPROP_PARAM_UDT_NAME

DBTYPE_WSTR

Identificatore del nome in tre parti.

Per le colonne con tipo definito dall'utente questa proprietà è una stringa che specifica il nome costituito da una sola parte del tipo definito dall'utente.

SSPROP_PARAM_UDT_NAME è obbligatorio. SSPROP_PARAM_UDT_CATALOGNAME e SSPROP_PARAM_UDT_SCHEMANAME sono facoltativi. Se una delle proprietà viene specificata in modo non corretto, verrà restituito DB_E_ERRORSINCOMMAND. Se non vengono specificati SSPROP_PARAM_UDT_CATALOGNAME e SSPROP_PARAM_UDT_SCHEMANAME, il tipo definito dall'utente dovrà essere definito nello stesso database e nello stesso schema della tabella. Se la definizione UDT non è presente nello stesso schema della tabella, ma nello stesso database, sarà necessario specificare SSPROP_PARAM_UDT_SCHEMANAME. Se la definizione UDT è presente in un database diverso, sarà necessario specificare SSPROP_PARAM_UDT_CATALOGNAME e SSPROP_PARAM_UDT_SCHEMANAME.

Set di proprietà DBPROPSET_SQLSERVERCOLUMN

Per supportare la creazione di tabelle nell'interfaccia ITableDefinition, in SQL Server Native Client sono state aggiunte le seguenti tre nuove colonne al set di proprietà DBPROPSET_SQLSERVERCOLUMN.

Nome

Descrizione

Tipo

Descrizione

SSPROP_COL_UDT_CATALOGNAME

UDT_CATALOGNAME

VT_BSTR

Per le colonne di tipo DBTYPE_UDT questa proprietà è una stringa che specifica il nome del catalogo in cui viene definito il tipo definito dall'utente.

SSPROP_COL_UDT_SCHEMANAME

UDT_SCHEMANAME

VT_BSTR

Per le colonne di tipo DBTYPE_UDT questa proprietà è una stringa che specifica il nome dello schema in cui viene definito il tipo definito dall'utente.

SSPROP_COL_UDT_NAME

UDT_NAME

VT_BSTR

Per le colonne di tipo DBTYPE_UDT questa proprietà è una stringa che specifica il nome costituito da una singola parte del tipo definito dall'utente. Per gli altri tipi di colonna questa proprietà restituisce una stringa vuota.

Nota

I tipi definiti dall'utente non sono presenti nel set di righe dello schema PROVIDER_TYPES. Tutte le colonne dispongono dell'accesso in lettura e scrittura.

ADO farà riferimento a queste proprietà tramite la voce corrispondente nella colonna Descrizione.

SSPROP_COL_UDTNAME è obbligatorio. SSPROP_COL_UDT_CATALOGNAME e SSPROP_COL_UDT_SCHEMANAME sono facoltativi. Se una delle proprietà viene specificata in modo non corretto, verrà restituito DB_E_ERRORSINCOMMAND.

Se non vengono specificati SSPROP_COL_UDT_CATALOGNAME e SSPROP_COL_UDT_SCHEMANAME, il tipo definito dall'utente dovrà essere definito nello stesso database e nello stesso schema della tabella.

Se la definizione UDT non è presente nello stesso schema della tabella, ma nello stesso database, sarà necessario specificare SSPROP_COL_UDT_SCHEMANAME.

Se la definizione UDT è presente in un database diverso, sarà necessario specificare SSPROP_COL_UDT_CATALOGNAME e SSPROP_COL_UDT_SCHEMANAME.

Aggiunte e modifiche alle interfacce OLE DB

In SQL Server Native Client sono stati aggiunti nuovi valori o modifiche a molte delle interfacce OLE DB principali.

Interfaccia ISSCommandWithParameters

Per supportare i tipi definiti dall'utente tramite OLE DB, in SQL Server Native Client è stata implementata una serie di modifiche, tra cui l'aggiunta dell'interfaccia ISSCommandWithParameters. Questa nuova interfaccia eredita dall'interfaccia OLE DB principale ICommandWithParameters. Oltre ai tre metodi ereditati da ICommandWithParameters, GetParameterInfo, MapParameterNames e SetParameterInfo, ISSCommandWithParameters fornisce i metodi GetParameterProperties e SetParameterProperties utilizzati per gestire i tipi di dati specifici del server.

Nota

L'interfaccia ISSCommandWithParameters utilizza inoltre la nuova struttura SSPARAMPROPS.

Interfaccia IColumnsRowset

Oltre all'interfaccia ISSCommandWithParameters, in SQL Server Native Client sono stati aggiunti nuovi valori al set di righe restituito dalla chiamata al metodo IColumnsRowset::GetColumnRowset, inclusi gli elementi seguenti.

Nome colonna

Tipo

Descrizione

DBCOLUMN_SS_UDT_CATALOGNAME

DBTYPE_WSTR

Identificatore del nome di catalogo del tipo definito dall'utente.

DBCOLUMN_SS_UDT_SCHEMANAME

DBTYPE_WSTR

Identificatore del nome dello schema del tipo definito dall'utente.

DBCOLUMN_SS_UDT_NAME

DBTYPE_WSTR

Identificatore del nome del tipo definito dall'utente.

DBCOLUMN_SS_ASSEMBLY_TYPENAME

DBTYPE_WSTR

Nome completo dell'assembly che include il nome del tipo e l'identificazione dell'assembly necessaria a cui deve fare riferimento CLR.

È possibile differenziare una colonna con tipo definito dall'utente del server dagli altri tipi binari quando DBCOLUMN_TYPE è impostato su DBTYPE_UDT analizzando i metadati UDT aggiunti sopra specificati. Se tali dati sono parzialmente completi, il tipo di server sarà un tipo definito dall'utente. Per i tipi di server non UDT queste colonne vengono sempre restituite come NULL.

Driver ODBC di SQL Server Native Client

Nel driver ODBC di SQL Server Native Client sono state apportate una serie di modifiche per supportare i tipi definiti dall'utente. Il driver ODBC di SQL Server Native Client mappa il tipo definito dall'utente SQL Server all'identificatore del tipo di dati SQL specifico del driver SQL_SS_UDT. Le colonne con tipo definito dall'utente vengono rilevate come SQL_SS_UDT. Se una colonna con tipo definito dall'utente viene mappata in modo esplicito a un altro tipo in un'istruzione SQL mediante i metodi ToString o ToXMLString del tipo definito dall'utente oppure mediante la funzione CAST/CONVERT, il tipo della colonna nel set di risultati rifletterà il tipo effettivo nel quale è stata convertita la colonna.

SQLColAttribute, SQLDescribeParam, SQLGetDescField

Sono stati aggiunti quattro nuovi campi di descrizione specifici del driver per fornire ulteriori informazioni per una colonna con tipo definito dall'utente di un set di risultati o per un parametro UDT di una stored procedure/query con parametri da recuperare tramite le funzioni SQLColAttribute, SQLDescribeParam e SQLGetDescField.

I quattro nuovi campi di descrizione aggiunti sono SQL_CA_SS_UDT_CATALOG_NAME, SQL_CA_SS_UDT_SCHEMA_NAME, SQL_CA_SS_UDT_TYPE_NAME e SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME.

SQLColumns, SQLProcedureColumns

Inoltre, sono state aggiunte tre nuove colonne specifiche del driver al set di risultati restituito dalle funzioni SQLColumns e SQLProcedureColumns in modo da fornire ulteriori informazioni su una colonna con tipo definito dall'utente di un set di risultati o su un parametro UDT. Queste tre nuove colonne sono SS_UDT_CATALOG_NAME, SS_UDT_SCHEMA_NAME e SS_UDT_ASSEMBLY_TYPE_NAME.

Conversioni supportate

Quando si esegue la conversione dai tipi di dati SQL ai tipi di dati C, SQL_C_WCHAR, SQL_C_BINARY e SQL_C_CHAR possono essere convertiti tutti in SQL_SS_UDT. Tenere tuttavia presente che i dati binari vengono convertiti in una stringa esadecimale durante la conversione dai tipi di dati SQL SQL_C_WCHAR e SQL_C_CHAR.

Quando si esegue la conversione dai tipi di dati C ai tipi di dati SQL, SQL_C_WCHAR, SQL_C_BINARY e SQL_C_CHAR possono essere convertiti tutti in SQL_SS_UDT. Tenere tuttavia presente che i dati binari vengono convertiti in una stringa esadecimale durante la conversione dai tipi di dati SQL SQL_C_WCHAR e SQL_C_CHAR.