Nouvelles fonctionnalités de date/heure avec les versions SQL Server précédentes (OLE DB)
Cette rubrique décrit le comportement attendu lorsqu'une application cliente qui utilise les fonctionnalités améliorées de date et d'heure communique avec une version de SQL Server antérieure à SQL Server 2008, et lorsqu'un client compilé avec une version de SQL Server Native Client antérieure à SQL Server 2008 envoie des commandes à un serveur qui prend en charge les fonctionnalités améliorées de date et d'heure.
Comportement de client de bas niveau
Les applications clientes qui utilisent une version de SQL Server Native Client antérieure à SQL Server 2008 voient les nouveaux types date/heure comme des colonnes nvarchar. Les contenus des colonnes sont des représentations littérales. Pour plus d'informations, consultez la section « Formats de données : chaînes et littéraux » dans Prise en charge du type de données pour les améliorations de Date/Heure OLE DB. La taille de colonne est la longueur littérale maximale pour la précision spécifiée pour la colonne.
Les API du catalogue retournent des métadonnées conformes au code du type de données de bas niveau retourné au client (nvarchar, par exemple) et à la représentation de bas niveau associée (le format littéral approprié, par exemple). Toutefois, le nom du type de données retourné est le nom de type SQL Server 2008 réel.
Lorsqu'une application cliente de bas niveau s'exécute sur un serveur SQL Server 2008 sur lequel des modifications de schéma ont été apportées aux types date/heure, le comportement attendu est le suivant :
Type du client OLE DB |
Type SQL Server 2005 |
Type SQL Server 2008 |
Conversion de résultat (serveur vers client) |
Conversion de paramètre (client vers serveur) |
---|---|---|---|---|
DBTYPE_DBDATE |
Datetime |
Date |
OK |
OK |
DBTYPE_DBTIMESTAMP |
Champs d'heure définis à zéro. |
IRowsetChange échoue en raison de la troncation de chaîne si le champ d'heure est différent de zéro. |
||
DBTYPE_DBTIME |
Time(0) |
OK |
OK |
|
DBTYPE_DBTIMESTAMP |
Champs de date définis à la date actuelle. |
IRowsetChange échoue en raison de la troncation de chaîne si les fractions de seconde sont différentes de zéro. La date est ignorée. |
||
DBTYPE_DBTIME |
Time(7) |
Échec : littéral d'heure non valide. |
OK |
|
DBTYPE_DBTIMESTAMP |
Échec : littéral d'heure non valide. |
OK |
||
DBTYPE_DBTIMESTAMP |
Datetime2(3) |
OK |
OK |
|
DBTYPE_DBTIMESTAMP |
Datetime2(7) |
OK |
OK |
|
DBTYPE_DBDATE |
Smalldatetime |
Date |
OK |
OK |
DBTYPE_DBTIMESTAMP |
Champs d'heure définis à zéro. |
IRowsetChange échoue en raison de la troncation de chaîne si le champ d'heure est différent de zéro. |
||
DBTYPE_DBTIME |
Time(0) |
OK |
OK |
|
DBTYPE_DBTIMESTAMP |
Champs de date définis à la date actuelle. |
IRowsetChange échoue en raison de la troncation de chaîne si les fractions de seconde sont différentes de zéro. La date est ignorée. |
||
DBTYPE_DBTIMESTAMP |
Datetime2(0) |
OK |
OK |
OK signifie que si cela a fonctionné avec SQL Server 2005, cela doit continuer à fonctionner avec SQL Server 2008.
Seules les modifications de schéma communes suivantes ont été considérées :
Utilisation d'un nouveau type où, en toute logique, une application requiert uniquement une valeur de date ou d'heure. Toutefois, l'application a été forcée d'utiliser datetime ou smalldatetime, car les types de date et d'heure séparés n'étaient pas disponibles.
Utilisation d'un nouveau type pour gagner en précision sur les fractions de seconde.
Passage à datetime2, car il représente le type de données par défaut pour la date et l'heure.
Les applications qui utilisent les métadonnées de serveur obtenues via ICommandWithParameters::GetParameterInfo ou les ensembles de lignes de schéma pour définir des informations sur le type de paramètre via ICommandWithParameters::SetParameterInfo échouent pendant les conversions clientes où la représentation sous forme de chaîne d'un type source est plus grande que la représentation sous forme de chaîne du type de destination. Par exemple, si une liaison de client utilise DBTYPE_DBTIMESTAMP et si la colonne de serveur est date, SQL Server Native Client convertit la valeur en « aaaa-jj-mm hh:mm:ss.fff », mais les métadonnées de serveur sont retournées en tant que nvarchar(10). Le dépassement de capacité résultant provoque DBSTATUS_E_CATCONVERTVALUE. Des problèmes semblables surviennent avec les conversions de données effectuées par IRowsetChange, car les métadonnées d'ensemble de lignes sont définies à partir des métadonnées du jeu de résultats.
Métadonnées de paramètre et d'ensemble de lignes
Cette section décrit les métadonnées des paramètres, des colonnes de résultats et des ensembles de lignes de schéma pour les clients compilés avec une version de SQL Server Native Client antérieure à SQL Server 2008.
ICommandWithParameters::GetParameterInfo
La structure DBPARAMINFO retourne les informations suivantes via le paramètre prgParamInfo :
Type du paramètre |
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 |
Notez que certaines de ces plages de valeurs sont discontinues ; par exemple, 9 est manquant dans 8,10..16. Cela est dû à l'ajout d'une virgule décimale lorsque la précision fractionnaire est supérieure à zéro.
IColumnsRowset::GetColumnsRowset
Les colonnes suivantes sont retournées :
Type de la colonne |
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 structure DBCOLUMNINFO retourne les informations suivantes :
Type du paramètre |
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 |
Ensembles de lignes de schéma
Cette section décrit les métadonnées des paramètres, des colonnes de résultats et des ensembles de lignes de schéma pour les nouveaux types de données. Ces informations sont utiles si vous avez un fournisseur client développé à l'aide d'outils antérieurs à SQL Server 2008SQL Server Native Client.
Ensemble de lignes COLUMNS
Les valeurs de colonnes suivantes sont retournées pour les types date/heure :
Type de la colonne |
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 |
Ensemble de lignes PROCEDURE_PARAMETERS
Les valeurs de colonnes suivantes sont retournées pour les types date/heure :
Type de la colonne |
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 |
Ensemble de lignes PROVIDER_TYPES
Les lignes suivantes sont retournées pour les types date/heure :
Type -> Colonne |
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 |
Comportement de serveur de bas niveau
Lors d'une connexion à un serveur d'une version antérieure à SQL Server 2008, toute tentative d'utilisation des nouveaux noms de types serveur (avec ICommandWithParameters::SetParameterInfo ou ITableDefinition::CreateTable, par exemple) génère DB_E_BADTYPENAME.
Si de nouveaux types sont liés pour des paramètres ou des résultats sans l'utilisation d'un nom de type, et si le nouveau type est utilisé pour spécifier le type serveur implicitement ou s'il n'existe pas de conversion valide du type serveur en type client, DB_E_ERRORSOCCURRED est retourné ; par ailleurs, DBBINDSTATUS_UNSUPPORTED_CONVERSION est défini en tant qu'état de liaison pour l'accesseur utilisé au moment de l'exécution.
S'il existe une conversion cliente prise en charge du type de mémoire tampon en type serveur pour la version du serveur de la connexion, tous les types de mémoires tampons clients peuvent être utilisés. Dans ce contexte, le type serveur représente le type spécifié par ICommandWithParameters::SetParameterInfo ou impliqué par le type de mémoire tampon si ICommandWithParameters::SetParameterInfo n'a pas été appelé. En d'autres termes, DBTYPE_DBTIME2 et DBTYPE_DBTIMESTAMPOFFSET peuvent être utilisés avec des serveurs de bas niveau, ou lorsque DataTypeCompatibility=80, si la conversion cliente vers un type serveur pris en charge réussit. Bien entendu, si le type serveur est incorrect, une erreur peut toujours être signalée par le serveur lorsque ce dernier ne peut pas effectuer de conversion implicite vers le type serveur effectif.
Comportement de SSPROP_INIT_DATATYPECOMPATIBILITY
Lorsque SSPROP_INIT_DATATYPECOMPATIBILITY a la valeur SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, les nouveaux types date/heure et les métadonnées associées apparaissent de la même façon aux clients et aux clients de bas niveau, comme indiqué dans Modifications de copie en bloc pour les types date/heure améliorés (OLE DB et ODBC).
Comparabilité pour IRowsetFind
Tous les opérateurs de comparaison sont autorisés pour les nouveaux types date/heure, car ils apparaissent sous forme de types chaîne et non sous forme de types date/heure.