Conversioni eseguite da server a client
In questo argomento vengono illustrate le conversioni di data/ora eseguite tra SQL Server 2008 (o versione successiva) e un'applicazione client scritta con OLE DB di SQL Server Native Client.
Conversioni
Nella tabella seguente vengono descritte le conversioni tra il tipo restituito al client e il tipo presente nell'associazione. Per i parametri di output, se è stato chiamato ICommandWithParameters::SetParameterInfo e il tipo specificato in pwszDataSourceType non corrisponde al tipo di dati effettivo del server, il server esegue una conversione implicita e il tipo restituito al client corrisponderà a quello specificato tramite ICommandWithParameters::SetParameterInfo. Se le regole di conversione del server sono diverse da quelle descritte in questo argomento, la conversione potrebbe dare risultati imprevisti. Quando ad esempio è necessario specificare una data predefinita, SQL Server utilizza 1900-1-1 anziché 1899-12-30.
A -> Da |
DATE |
DBDATE |
DBTIME |
DBTIME2 |
DBTIMESTAMP |
DBTIMESTAMPOFFSET |
FILETIME |
BYTES |
VARIANT |
SSVARIANT |
BSTR |
STR |
WSTR |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Date |
1,7 |
OK |
- |
- |
1 |
1,3 |
1,7 |
- |
OK (VT_BSTR) |
OK |
OK |
4 |
4 |
Time |
5,6,7 |
- |
9 |
OK |
6 |
3,6 |
5,6 |
- |
OK (VT_BSTR) |
OK |
OK |
4 |
4 |
Smalldatetime |
7 |
8 |
9,10 |
10 |
OK |
3 |
7 |
- |
7 (VT_DATE) |
OK |
OK |
4 |
4 |
Datetime |
5,7 |
8 |
9,10 |
10 |
OK |
3 |
7 |
- |
7 (VT_DATE) |
OK |
OK |
4 |
4 |
Datetime2 |
5,7 |
8 |
9,10 |
10 |
7 |
3 |
5,7 |
- |
OK (VT_BSTR) |
OK |
OK |
4 |
4 |
Datetimeoffset |
5,7,11 |
8,11 |
9,10,11 |
10,11 |
7,11 |
OK |
5,7,11 |
- |
OK (VT_BSTR) |
OK |
OK |
4 |
4 |
Char, Varchar, Nchar, Nvarchar |
7, 13 |
12 |
12,9 |
12 |
12 |
12 |
7,13 |
N/D |
N/D |
N/D |
N/D |
N/D |
N/D |
Sql_variant (datetime) |
7 |
8 |
9,10 |
10 |
OK |
3 |
7 |
- |
7(VT_DATE) |
OK |
OK |
4 |
4 |
Sql_variant (smalldatetime) |
7 |
8 |
9,10 |
10 |
OK |
3 |
7 |
- |
7(VT_DATE) |
OK |
OK |
4 |
4 |
Sql_variant (date) |
1,7 |
OK |
2 |
2 |
1 |
1,3 |
1,7 |
- |
OK(VT_BSTR) |
OK |
OK |
4 |
4 |
Sql_variant (time) |
5,6,7 |
2 |
6 |
OK |
6 |
3,6 |
5,6 |
- |
OK(VT_BSTR) |
OK |
OK |
4 |
4 |
Sql_variant (datetime2) |
5,7 |
8 |
9,10 |
10 |
OK |
3 |
5,7 |
- |
OK(VT_BSTR) |
OK |
OK |
4 |
4 |
Sql_variant (datetimeoffset) |
5,7,11 |
8,11 |
9,10,11 |
10,11 |
7,11 |
OK |
5,7,11 |
- |
OK(VT_BSTR) |
OK |
OK |
4 |
4 |
Descrizione dei simboli
Simbolo |
Significato |
---|---|
OK |
Nessuna conversione necessaria. |
- |
Nessuna conversione supportata. Se l'associazione viene convalidata quando viene chiamato IAccessor::CreateAccessor, viene restituito DBBINDSTATUS_UPSUPPORTEDCONVERSION in rgStatus. Quando la convalida della funzione di accesso viene rinviata, viene impostato DBSTATUS_E_BADACCESSOR. |
1 |
I campi relativi all'ora vengono impostati su zero. |
2 |
Viene impostato DBSTATUS_E_CANTCONVERTVALUE. |
3 |
Il fuso orario viene impostato su zero. |
4 |
Se le dimensioni del buffer client non sono sufficienti, viene impostato DBSTATUS_S_TRUNCATED. Quando il tipo di server include secondi frazionari, il numero di cifre nella stringa del risultato corrisponde esattamente alla scala del tipo di server. |
5 |
Il troncamento dei secondi o dei secondi frazionari viene ignorato. |
6 |
La data viene impostata sul valore corrente, a meno che l'origine non sia una stringa con valore letterale ora e la destinazione non sia DBTYPE_DATE. In questo caso viene utilizzato il valore 1899-12-30. |
7 |
Se il valore comporta un overflow, viene impostato DBSTATUS_E_DATAOVERFLOW. |
8 |
I campi relativi all'ora vengono ignorati. |
9 |
I campi relativi ai secondi frazionari vengono ignorati. |
10 |
Il componente di data viene ignorato. |
11 |
Viene effettuata la conversione dell'ora nel fuso orario del client. Se si verifica un errore durante questa conversione, viene impostato DBSTATUS_E_DATAOVERFLOW. |
12 |
La stringa viene analizzata come valore letterale ISO e convertita nel tipo di destinazione. Se l'operazione non riesce, la stringa viene analizzata come valore letterale data OLE (che presenta anche componenti di ora) e convertita da data OLE (DBTYPE_DATE) nel tipo di destinazione. La stringa deve essere conforme alla sintassi per i valori letterali del tipo di destinazione consentiti per la riuscita dell'analisi del formato ISO. Perché l'analisi OLE riesca, è necessario che la stringa sia conforme alla sintassi riconosciuta da OLE. Se non è possibile analizzare la stringa, viene impostato DBSTATUS_E_CANTCONVERTVALUE. Se sono presenti valori di componente esterni all'intervallo, viene impostato DBSTATUS_E_DATAOVERFLOW. |
13 |
La stringa viene analizzata come valore letterale ISO e convertita nel tipo di destinazione. Se l'operazione non riesce, la stringa viene analizzata come valore letterale data OLE (che presenta anche componenti di ora) e convertita da data OLE (DBTYPE_DATE) nel tipo di destinazione. La stringa deve essere conforme alla sintassi per i valori letterali di data e ora, a meno che la destinazione non sia DBTYPE_DATE o DBTYPE_DBTIMESTAMP. In questo caso, per la riuscita dell'analisi del formato ISO è consentito un valore letterale data e ora oppure ora. Perché l'analisi OLE riesca, è necessario che la stringa sia conforme alla sintassi riconosciuta da OLE. Se non è possibile analizzare la stringa, viene impostato DBSTATUS_E_CANTCONVERTVALUE. Se sono presenti valori di componente esterni all'intervallo, viene impostato DBSTATUS_E_DATAOVERFLOW. |