Tipi CLR definiti dall'utente di grandi dimensioni (OLE DB)
In questo argomento vengono illustrate le modifiche apportate a OLE DB in SQL Server Native Client per supportare i tipi CLR definiti dall'utente (Common Language Runtime) di grandi dimensioni.
Per ulteriori informazioni sul supporto dei tipi CLR definiti dall'utente di grandi dimensioni in SQL Server Native Client, vedere Tipi CLR definiti dall'utente di grandi dimensioni.
Formato dei dati
In SQL Server Native Client viene utilizzato ~0 per rappresentare la lunghezza dei valori che presentano dimensioni illimitate nel caso di tipi di oggetti LOB. ~ 0 rappresenta anche le dimensioni dei tipi CLR definiti dall'utente che superano 8.000 byte.
Nella tabella seguente viene illustrato il mapping dei tipi di dati nei parametri e nei set di righe:
Tipo di dati di SQL Server |
Tipo di dati OLE DB |
Layout in memoria |
Valore |
---|---|---|---|
Tipo CLR definito dall'utente |
DBTYPE_UDT |
BYTE[](matrice di byte) |
132 (oledb.h) |
I valori dei tipi definiti dall'utente vengono rappresentati come matrici di byte. Sono supportate le conversioni da e verso le stringhe esadecimali. I valori letterali vengono rappresentati come stringhe esadecimali con il prefisso "0x". Una stringa esadecimale è la rappresentazione testuale di dati binari in base 16. Un esempio al riguardo è dato da una conversione dal tipo di dati del server varbinary(10) in DBTYPE_STR che determina la rappresentazione esadecimale di 20 caratteri in cui ogni coppia di caratteri rappresenta un solo byte.
Proprietà dei parametri
Il set di proprietà DBPROPSET_SQLSERVERPARAMETER supporta i tipi definiti dall'utente tramite OLE DB. Per ulteriori informazioni, vedere Utilizzo dei tipi definiti dall'utente (UDT).
Proprietà delle colonne
Il set di proprietà DBPROPSET_SQLSERVERCOLUMN supporta la creazione di tabelle tramite OLE DB. Per ulteriori informazioni, vedere Utilizzo dei tipi definiti dall'utente (UDT).
Mapping dei tipi di dati in ITableDefinition::CreateTable
Le informazioni seguenti vengono utilizzate nelle strutture DBCOLUMNDESC impiegate da ITableDefinition::CreateTable quando sono necessarie colonne con tipo definito dall'utente:
Tipo di dati OLE DB (wType) |
pwszTypeName |
Tipo di dati di SQL Server |
rgPropertySets |
---|---|---|---|
DBTYPE_UDT |
Ignorato |
Tipo definito dall'utente |
Deve includere un set di proprietà DBPROPSET_SQLSERVERCOLUMN. |
ICommandWithParameters::GetParameterInfo
Di seguito sono riportate le informazioni restituite nella struttura DBPARAMINFO tramite prgParamInfo.
Tipo di parametro |
wType |
ulParamSize |
bPrecision |
bScale |
dwFlags DBPARAMFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (lunghezza minore o uguale a 8.000 byte) |
"DBTYPE_UDT" |
n |
Non definito |
Non definito |
Cancellato |
DBTYPE_UDT (lunghezza maggiore di 8.000 byte) |
"DBTYPE_UDT" |
~0 |
Non definito |
Non definito |
Impostato |
ICommandWithParameters::SetParameterInfo
Le informazioni specificate nella struttura DBPARAMBINDINFO devono essere conformi agli elementi seguenti:
Tipo di parametro |
pwszDataSourceType |
ulParamSize |
bPrecision |
bScale |
dwFlags DBPARAMFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (lunghezza minore o uguale a 8.000 byte) |
DBTYPE_UDT |
n |
Ignorato |
Ignorato |
Deve essere impostato se è necessario passare il parametro utilizzando DBTYPE_IUNKNOWN. |
DBTYPE_UDT (lunghezza maggiore di 8.000 byte) |
DBTYPE_UDT |
~0 |
Ignorato |
Ignorato |
Ignorato |
ISSCommandWithParameters
Le applicazioni utilizzano ISSCommandWithParameters per ottenere e impostare le proprietà dei parametri definite nella sezione Proprietà dei parametri.
IColumnsRowset::GetColumnsRowset
Le colonne restituite sono le seguenti:
Tipo di colonna |
DBCOLUMN_TYPE |
DBCOLUMN_COLUMNSIZE |
DBCOLUMN_PRECISION |
DBCOLUMN_SCALE |
DBCOLUMN_FLAGS_ISLONG |
DBCOLUMNS_ISSEARCHABLE |
DBCOLUMN_OCTETLENGTH |
---|---|---|---|---|---|---|---|
DBTYPE_UDT (lunghezza minore o uguale a 8.000 byte) |
DBTYPE_UDT |
n |
NULL |
NULL |
Clear |
DB_ALL_EXCEPT_LIKE |
n |
DBTYPE_UDT (lunghezza maggiore di 8.000 byte) |
DBTYPE_UDT |
~0 |
NULL |
NULL |
Set |
DB_ALL_EXCEPT_LIKE |
0 |
Per i tipi definiti dall'utente vengono definite anche le colonne seguenti:
Identificatore di colonna |
Tipo |
Descrizione |
---|---|---|
DBCOLUMN_UDT_CATALOGNAME |
DBTYPE_WSTR |
Per le colonne con tipo definito dall'utente, il nome del catalogo in cui è indicato il tipo definito dall'utente. |
DBCOLUMN_UDT_SCHEMANAME |
DBTYPE_WSTR |
Per le colonne con tipo definito dall'utente, il nome dello schema in cui è indicato il tipo definito dall'utente. |
DBCOLUMN_UDT_NAME |
DBTYPE_WSTR |
Per le colonne con tipo definito dall'utente, il nome composto da una parte del tipo definito dall'utente. |
DBCOLUMN_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Per le colonne con tipo definito dall'utente, il nome completo del tipo definito dall'utente. Il nome completo del tipo di assembly consente di creare un'istanza di un oggetto del tipo in questione utilizzando il metodo Type.GetType. |
IColumnsInfo::GetColumnInfo
Di seguito sono riportate le informazioni restituite nella struttura DBCOLUMNINFO.
Tipo di parametro |
wType |
ulColumnSize |
bPrecision |
bScale |
dwFlags DBCOLUMNFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (lunghezza minore o uguale a 8.000 byte) |
DBTYPE_UDT |
n |
~0 |
~0 |
Clear |
DBTYPE_UDT (lunghezza maggiore di 8.000 byte) |
DBTYPE_UDT |
~0 |
~0 |
~0 |
Set |
Set di righe COLUMNS (set di righe dello schema)
Per i tipi definiti dall'utente vengono restituiti i valori di colonna seguenti:
Tipo di colonna |
DATA_TYPE |
COLUMN_FLAGS, DBCOLUMFLAGS_ISLONG |
CHARACTER_OCTET_LENGTH |
---|---|---|---|
DBTYPE_UDT (lunghezza minore o uguale a 8.000 byte) |
DBTYPE_UDT |
Clear |
n |
DBTYPE_UDT (lunghezza maggiore di 8.000 byte) |
DBTYPE_UDT |
Set |
0 |
Per i tipi definiti dall'utente vengono definite le colonne aggiuntive seguenti:
Identificatore di colonna |
Tipo |
Descrizione |
---|---|---|
SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
Per le colonne con tipo definito dall'utente, il nome del catalogo in cui è indicato il tipo definito dall'utente. |
SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
Per le colonne con tipo definito dall'utente, il nome dello schema in cui è indicato il tipo definito dall'utente. |
SS_UDT_NAME |
DBTYPE_WSTR |
Per le colonne con tipo definito dall'utente, il nome composto da una parte del tipo definito dall'utente. |
SS_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Per le colonne con tipo definito dall'utente, il nome completo del tipo definito dall'utente. Il nome completo del tipo di assembly consente di creare un'istanza di un oggetto del tipo in questione utilizzando il metodo Type.GetType. |
Se riferito al set di righe PROCEDURE_PARAMETERS, DATA_TYPE contiene gli stessi valori del set di righe dello schema COLUMNS e TYPE_NAME contiene il tipo definito dall'utente. Vengono definite anche le stesse colonne aggiuntive.
I tipi definiti dall'utente non sono presenti nel set di righe dello schema PROVIDER_TYPES.
Associazioni e conversioni
Tipo di associazione dati |
Tipo definito dall'utente al server |
Tipo non definito dall'utente al server |
Tipo definito dall'utente dal server |
Tipo non definito dall'utente dal server |
---|---|---|---|---|
DBTYPE_UDT |
Supportato (5) |
Errore (1) |
Supportato (5) |
Errore (4) |
DBTYPE_BYTES |
Supportato (5) |
N/D |
Supportato (5) |
N/A |
DBTYPE_WSTR |
Supportato (2), (5) |
N/A |
Supportato (3), (5), (6) |
N/A |
DBTYPE_BSTR |
Supportato (2), (5) |
N/A |
Supportato (3), (5) |
N/A |
DBTYPE_STR |
Supportato (2), (5) |
N/A |
Supportato (3), (5) |
N/A |
DBTYPE_IUNKNOWN |
Supportato (6) |
N/A |
Supportato (6) |
N/A |
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) |
Supportato (5) |
N/A |
Supportato (3), (5) |
N/A |
DBTYPE_VARIANT (VT_BSTR) |
Supportati (2), (5) |
N/A |
N/A |
N/A |
Descrizione dei simboli
Simbolo |
Significato |
---|---|
1 |
Se viene specificato un tipo di dati del 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. L'errore e lo stato del parametro saranno rispettivamente DB_E_ERRORSOCCURRED e DBSTATUS_E_BADACCESSOR. È un errore specificare un parametro con tipo definito dall'utente per un parametro del server che non presenta un tipo definito dall'utente. |
2 |
I dati vengono convertiti dal formato di stringa esadecimale nel formato binario. |
3 |
I dati vengono convertiti dal formato binario nel formato di stringa esadecimale. |
4 |
È possibile che venga eseguita la convalida quando si utilizza CreateAccessor o GetNextRows. L'errore corrispondente è DB_E_ERRORSOCCURRED. Lo stato di associazione viene impostato su DBBINDSTATUS_UNSUPPORTEDCONVERSION. |
5 |
È possibile utilizzare BY_REF. |
6 |
I parametri con tipo definito dall'utente possono essere associati come DBTYPE_IUNKNOWN in DBBINDING. L'associazione a DBTYPE_IUNKNOWN indica che l'applicazione richiede l'elaborazione dei dati come flusso utilizzando l'interfaccia ISequentialStream. Quando un consumer specifica wType in un'associazione come tipo DBTYPE_IUNKNOWN, e la colonna o il parametro di output corrispondente della stored procedure è un tipo definito dall'utente, SQL Server Native Client restituisce ISequentialStream. Per un parametro di input, SQL Server Native Client esegue una query per l'interfaccia ISequentialStream. È possibile scegliere di non associare la lunghezza del tipo definito dall'utente quando si utilizza l'associazione DBTYPE_IUNKNOWN nel caso di tipi definiti dall'utente di grandi dimensioni. La lunghezza deve essere invece associata nel caso di tipi definiti dall'utente di piccole dimensioni. Un parametro DBTYPE_UDT può essere specificato come tipo definito dall'utente di grandi dimensioni se si verificano una o più delle condizioni seguenti:
Per i dati di riga, l'associazione DBTYPE_IUNKNOWN è consentita solo per i tipi definiti dall'utente di grandi dimensioni. Per stabilire se una colonna presenta un tipo definito dall'utente di grandi dimensioni è possibile utilizzare il metodo IColumnsInfo::GetColumnInfo sull'interfaccia IColumnsInfo di un oggetto Rowset o Command. Una colonna DBTYPE_UDT è una colonna con tipo definito dall'utente di grandi dimensioni se si verificano una o più delle condizioni seguenti:
|
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 per DBTYPE_NULL o su DBSTATUS_S_DEFAULT per DBTYPE_EMPTY. Non è possibile utilizzare DBTYPE_BYREF con DBTYPE_NULL o DBTYPE_EMPTY.
DBTYPE_UDT può anche essere convertito in DBTYPE_EMPTY e DBTYPE_NULL. DBTYPE_NULL e DBTYPE_EMPTY non possono invece essere convertiti in DBTYPE_UDT. Questo comportamento è coerente con DBTYPE_BYTES. ISSCommandWithParameters viene utilizzato per elaborare i tipi definiti dall'utente come parametri.
Le conversioni dei dati fornite dai servizi principali OLE DB (IDataConvert) non sono applicabili a DBTYPE_UDT.
Non sono supportate altre associazioni.
Possibilità di confronto per IRowsetFind
Per i tipi definiti dall'utente sono supportati solo i confronti seguenti:
EQ
NE
IGNORE
Se viene tentato qualsiasi altro confronto, viene restituito DB_E_BADCOMPAREOP.
Supporto di BCP per i tipi definiti dall'utente
I valori dei tipi definiti dall'utente possono essere importati ed esportati solo come caratteri o valori binari.
Comportamento dei client legacy per i tipi definiti dall'utente
I tipi definiti dall'utente sono soggetti al mapping dei tipi con i client legacy nel modo seguente:
Versione client |
DBTYPE_UDT (lunghezza minore o uguale a 8.000 byte) |
DBTYPE_UDT (lunghezza maggiore di 8.000 byte) |
---|---|---|
SQL Server 2000 e versione precedente |
varbinary |
image |
SQL Server 2005 |
Tipo definito dall'utente |
varbinary(max) |
SQL Server 2008 e versioni successive |
Tipo definito dall'utente |
Tipo definito dall'utente |
Quando DataTypeCompatibility (SSPROP_INIT_DATATYPECOMPATIBILITY) è impostato su "80", i tipi definiti dall'utente di grandi dimensioni vengono visualizzati ai client nello stesso modo in cui vengono visualizzati ai client legacy.