Condividi tramite


Nuove caratteristiche di data e ora con le versioni precedenti di SQL Server (OLE DB)

In questo argomento viene descritto il comportamento previsto quando un'applicazione client che utilizza caratteristiche avanzate di data e ora comunica con una versione di SQL Server precedente a SQL Server 2008 e quando un client compilato con una versione di SQL Server Native Client precedente a SQL Server 2008 invia comandi a un server che supporta caratteristiche avanzate di data e ora.

Comportamento dei client legacy

Nelle applicazioni client che utilizzano una versione di SQL Server Native Client precedente a SQL Server 2008 i nuovi tipi di data/ora vengono visualizzati come colonne nvarchar. Il contenuto delle colonne è costituito da rappresentazioni letterali. Per ulteriori informazioni, vedere la sezione "Formati di dati: stringhe e valori letterali" in Supporto dei tipi di dati per i miglioramenti dei tipi di data/ora OLE DB. Le dimensioni di colonna corrispondono alla lunghezza massima in valori letterali per la precisione specificata per la colonna.

Le API di catalogo restituiranno metadati consistenti con il codice del tipo di dati legacy restituito al client, ad esempio nvarchar, e la rappresentazione legacy associata, ad esempio il formato letterale appropriato. Il nome del tipo di dati restituito, tuttavia, coinciderà con il nome effettivo del tipo di dati di SQL Server 2008.

Quando un'applicazione client legacy viene eseguita in un server SQL Server 2008 (o versioni successive) in cui sono state apportate modifiche dello schema ai tipi di data/ora, il comportamento previsto è il seguente:

Tipo di client OLE DB

Tipo di SQL Server 2005

Tipo di SQL Server 2008 (o versioni successive)

Conversione risultati (da server a client)

Conversione parametri (da client a server)

DBTYPE_DBDATE

Datetime

Date

OK

OK

DBTYPE_DBTIMESTAMP

Campi dell'ora impostati su zero.

IRowsetChange ha esito negativo a causa di un troncamento della stringa se il campo dell'ora è diverso da zero.

DBTYPE_DBTIME

Time(0)

OK

OK

DBTYPE_DBTIMESTAMP

Campi della data impostati sulla data corrente.

IRowsetChange ha esito negativo a causa di un troncamento della stringa se i secondi frazionari sono diversi da zero.

La data viene ignorata.

DBTYPE_DBTIME

Time(7)

Esito negativo: valore letterale di ora non valido.

OK

DBTYPE_DBTIMESTAMP

Esito negativo: valore letterale di ora non valido.

OK

DBTYPE_DBTIMESTAMP

Datetime2(3)

OK

OK

DBTYPE_DBTIMESTAMP

Datetime2(7)

OK

OK

DBTYPE_DBDATE

Smalldatetime

Date

OK

OK

DBTYPE_DBTIMESTAMP

Campi dell'ora impostati su zero.

IRowsetChange ha esito negativo a causa di un troncamento della stringa se il campo dell'ora è diverso da zero.

DBTYPE_DBTIME

Time(0)

OK

OK

DBTYPE_DBTIMESTAMP

Campi della data impostati sulla data corrente.

IRowsetChange ha esito negativo a causa di un troncamento della stringa se i secondi frazionari sono diversi da zero.

La data viene ignorata.

DBTYPE_DBTIMESTAMP

Datetime2(0)

OK

OK

OK indica che un funzionamento corretto in SQL Server 2005 corrisponde a un corretto funzionamento anche in SQL Server 2008 (o versioni successive).

Sono state prese in considerazione solo le modifiche dello schema comuni indicate di seguito:

  • Utilizzo di un nuovo tipo nei casi in cui logicamente un'applicazione richiede solo un valore di data o di ora. Nelle versioni precedenti viene imposto l'utilizzo di datetime o di smalldatetime all'applicazione in quanto non sono disponibili tipi di data e ora distinti.

  • Utilizzo di un nuovo tipo per ottenere precisione o accuratezza maggiore nei secondi frazionari.

  • Passaggio a datetime2 in quanto tipo di dati preferito per la data e l'ora.

Le applicazioni che utilizzano metadati del server ottenuti tramite ICommandWithParameters::GetParameterInfo o set di righe dello schema per impostare informazioni sul tipo di parametro tramite ICommandWithParameters::SetParameterInfo non verranno eseguite durante le conversioni client in cui la rappresentazione stringa del tipo di origine è di dimensioni maggiori rispetto alla rappresentazione stringa del tipo di destinazione. Se, ad esempio, un'associazione client utilizza DBTYPE_DBTIMESTAMP e la colonna server è relativa alla data, in SQL Server Native Client il valore verrà convertito in "aaaa-gg-mm hh:mm:ss.fff", ma i metadati del server verranno restituiti come nvarchar(10). L'overflow risultante restituisce DBSTATUS_E_CATCONVERTVALUE. Problemi simili si verificano con le conversioni di dati tramite IRowsetChange, in quanto i metadati del set di righe vengono impostati dai metadati del set di risultati.

Metadati per parametri e set di righe

In questa sezione vengono descritti i metadati per parametri, colonne dei risultati e set di righe dello schema per i client compilati con una versione di SQL Server Native Client precedente a SQL Server 2008.

ICommandWithParameters::GetParameterInfo

La struttura DBPARAMINFO restituisce le informazioni seguenti tramite il parametro prgParamInfo:

Tipo di parametro

wType

ulParamSize

bPrecision

bScale

date

DBTYPE_WSTR

10

~0

~0

time

DBTYPE_WSTR

8, 10..16

~0

~0

smalldatetime

DBTYPE_DBTIMESTAMP

16

16

0

datetime

DBTYPE_DBTIMESTAMP

16

23

3

datetime2

DBTYPE_WSTR

19,21..27

~0

~0

datetimeoffset

DBTYPE_WSTR

26,28..34

~0

~0

Si noti che alcuni di questi intervalli di valori non sono continui. Nell'intervallo 8,10..16, ad esempio, non è presente il valore 9. Ciò è dovuto all'aggiunta di un separatore decimale quando la precisione frazionaria è maggiore di zero.

IColumnsRowset::GetColumnsRowset

Vengono restituite le colonne seguenti:

Tipo di colonna

DBCOLUMN_TYPE

DBCOLUMN_COLUMNSIZE

DBCOLUMN_PRECISION

DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION

date

DBTYPE_WSTR

10

NULL

NULL

time

DBTYPE_WSTR

8, 10..16

NULL

NULL

smalldatetime

DBTYPE_DBTIMESTAMP

16

16

0

datetime

DBTYPE_DBTIMESTAMP

16

23

3

datetime2

DBTYPE_WSTR

19,21..27

NULL

NULL

datetimeoffset

DBTYPE_WSTR

26,28..34

NULL

NULL

ColumnsInfo::GetColumnInfo

La struttura DBCOLUMNINFO restituisce le informazioni seguenti:

Tipo di parametro

wType

ulColumnSize

bPrecision

bScale

date

DBTYPE_WSTR

10

~0

~0

time(1..7)

DBTYPE_WSTR

8, 10..16

~0

~0

smalldatetime

DBTYPE_DBTIMESTAMP

16

16

0

datetime

DBTYPE_DBTIMESTAMP

16

23

3

datetime2

DBTYPE_WSTR

19,21..27

~0

~0

datetimeoffset

DBTYPE_WSTR

26,28..34

~0

~0

Set di righe dello schema

In questa sezione vengono descritti i metadati per parametri, colonne dei risultati e set di righe dello schema per i nuovi tipi di dati. Si tratta di informazioni utili se si dispone di un provider client sviluppato utilizzando strumenti di una versione precedente rispetto a SQL Server 2008 SQL Server Native Client.

Set di righe COLUMNS

Per i tipi di data/ora vengono restituiti i valori di colonna seguenti:

Tipo di colonna

DATA_TYPE

CHARACTER_MAXIMUM_LENGTH

CHARACTER_OCTET_LENGTH

DATETIME_PRECISION

date

DBTYPE_WSTR

10

20

NULL

time

DBTYPE_WSTR

8, 10..16

16,20..32

NULL

smalldatetime

DBTYPE_DBTIMESTAMP

NULL

NULL

0

datetime

DBTYPE_DBTIMESTAMP

NULL

NULL

3

datetime2

DBTYPE_WSTR

19,21..27

38,42..54

NULL

datetimeoffset

DBTYPE_WSTR

26,28..34

52, 56..68

NULL

Set di righe PROCEDURE_PARAMETERS

Per i tipi di data/ora vengono restituiti i valori di colonna seguenti:

Tipo di colonna

DATA_TYPE

CHARACTER_MAXIMUM_LENGTH

CHARACTER_OCTET_LENGTH

TYPE_NAME

LOCAL_TYPE_NAME

date

DBTYPE_WSTR

10

20

date

time

DBTYPE_WSTR

8, 10..16

16,20..32

time

smalldatetime

DBTYPE_DBTIMESTAMP

NULL

NULL

smalldatetime

datetime

DBTYPE_DBTIMESTAMP

NULL

NULL

datetime

datetime2

DBTYPE_WSTR

19,21..27

38,42..54

datetime2

datetimeoffset

DBTYPE_WSTR

26,28..34

52, 56..68

datetimeoffset

Set di righe PROVIDER_TYPES

Per i tipi di data/ora vengono restituite le righe seguenti:

Tipo - >

Colonna

date

time

smalldatetime

datetime

datetime2

datetimeoffset

TYPE_NAME

date

time

smalldatetime

datetime

datetime2

datetimeoffset

DATA_TYPE

DBTYPE_WSTR

DBTYPE_WSTR

DBTYPE_DBTIMESTAMP

DBTYPE_DBTIMESTAMP

DBTYPE_WSTR

DBTYPE_WSTR

COLUMN_SIZE

10

16

16

23

27

34

LITERAL_PREFIX

LITERAL_SUFFIX

CREATE_PARAMS

NULL

NULL

NULL

NULL

NULL

NULL

IS_NULLABLE

VARIANT_TRUE

VARIANT_TRUE

VARIANT_TRUE

VARIANT_TRUE

VARIANT_TRUE

VARIANT_TRUE

CASE_SENSITIVE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

SEARCHABLE

DB_SEARCHABLE

DB_SEARCHABLE

DB_SEARCHABLE

DB_SEARCHABLE

DB_SEARCHABLE

DB_SEARCHABLE

UNSIGNED_ATTRIBUTE

NULL

NULL

NULL

NULL

NULL

NULL

FIXED_PREC_SCALE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

AUTO_UNIQUE_VALUE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

LOCAL_TYPE_NAME

date

time

smalldatetime

datetime

datetime2

datetimeoffset

MINIMUM_SCALE

NULL

NULL

NULL

NULL

NULL

NULL

MAXIMUM_SCALE

NULL

NULL

NULL

NULL

NULL

NULL

GUID

NULL

NULL

NULL

NULL

NULL

NULL

TYPELIB

NULL

NULL

NULL

NULL

NULL

NULL

VERSION

NULL

NULL

NULL

NULL

NULL

NULL

IS_LONG

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

BEST_MATCH

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_TRUE

VARIANT_FALSE

VARIANT_FALSE

IS_FIXEDLENGTH

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

Comportamento dei server legacy

In caso di connessione a un server di una versione precedente rispetto a SQL Server 2008, qualsiasi tentativo di utilizzare i nomi dei nuovi tipi del server, ad esempio con ICommandWithParameters::SetParameterInfo o ITableDefinition::CreateTable, restituirà DB_E_BADTYPENAME.

Se vengono associati nuovi tipi per parametri o risultati senza l'utilizzo di un nome del tipo e il nuovo tipo viene utilizzato per specificare in modo implicito il tipo di server o non è disponibile una conversione valida dal tipo di server al tipo di client, viene restituito DB_E_ERRORSOCCURRED e DBBINDSTATUS_UNSUPPORTED_CONVERSION viene impostato come stato dell'associazione per la funzione di accesso utilizzata in fase di esecuzione.

Se è disponibile una conversione client supportata dal tipo di buffer al tipo di server per la versione del server nella connessione, è possibile utilizzare tutti i tipi di buffer client. In questo contesto il tipo di server indica il tipo specificato da ICommandWithParameters::SetParameterInfoo utilizzato implicitamente dal tipo di buffer se ICommandWithParameters::SetParameterInfo non è stato chiamato. Di conseguenza, è possibile utilizzare DBTYPE_DBTIME2 e DBTYPE_DBTIMESTAMPOFFSET con i server legacy o quando DataTypeCompatibility=80, se la conversione client a un tipo di server supportato ha esito positivo. Se il tipo di server non è corretto, potrebbe essere segnalato un errore dal server se questo non è in grado di eseguire una conversione implicita al tipo di server effettivo.

Comportamento di SSPROP_INIT_DATATYPECOMPATIBILITY

Quando SSPROP_INIT_DATATYPECOMPATIBILITY è impostato su SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, i nuovi tipi di data/ora e i metadati associati vengono visualizzati ai client allo stesso modo che ai client legacy, come descritto in Modifiche apportate alla copia bulk per i tipi di data/ora migliorati (OLE DB e ODBC).

Confrontabilità per IRowsetFind

Per i nuovi tipi di data/ora sono consentiti tutti gli operatori di confronto, in quanto vengono visualizzati come tipi stringa anziché come tipi di data/ora.