Condividi tramite


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:

  • ulParamParamSize è ~0.

  • DBPARAMFLAGS_ISLONG è impostato nella struttura DBPARAMBINDINFO.

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:

  • Il flag DBCOLUMNFLAGS_ISLONG è impostato sul membro dwFlags della struttura DBCOLUMNINFO

  • Il membro ulColumnSize di DBCOLUMNINFO è ~ 0.

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.