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.