Nouvelles fonctionnalités de date et d’heure avec les versions précédentes de SQL Server (OLE DB)
Cette rubrique décrit le comportement attendu lorsqu’une application cliente qui utilise des fonctionnalités de date et d’heure améliorées 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 de date et d’heure améliorées.
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 de date/heure en tant que nvarchar
colonnes. 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 » de la rubrique Prise en charge des types de données pour les améliorations de date et d’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é sera le nom de type réel SQL Server 2008.
Lorsqu’une application cliente de bas niveau s’exécute sur un serveur SQL Server 2008 (ou version ultérieure) sur lequel des modifications de schéma ont été apportées aux types de date/heure, le comportement attendu est le suivant :
Type du client OLE DB | Type SQL Server 2005 | SQL Server 2008 (ou versions ultérieures) | 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 de temps 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 secondes sont non nulles. 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 de temps 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 secondes sont non nulles. La date est ignorée. |
||
DBTYPE_DBTIMESTAMP | Datetime2(0) | OK | OK |
OK signifie que s’il fonctionnait avec SQL Server 2005, il devrait continuer à fonctionner avec SQL Server 2008 (ou version ultérieure).
Seules les modifications de schéma communes suivantes ont été considérées :
Utilisation d'un nouveau type alors qu'en toute logique une application requiert uniquement une valeur de date ou d'heure. Toutefois, l'application a été forcée d'utiliser
datetime
ousmalldatetime
, 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 des métadonnées de serveur obtenues via ICommandWithParameters::GetParameterInfo ou des ensembles de lignes de schéma pour définir des informations de type de paramètre via ICommandWithParameters::SetParameterInfo échouent lors des conversions de client lorsque la représentation sous forme de chaîne d’un type source est supérieure à la représentation sous forme de chaîne du type de destination. Par exemple, si une liaison cliente utilise DBTYPE_DBTIMESTAMP et que la colonne serveur est date, SQL Server Native Client convertit la valeur en « aaaa-jj-mm hh:mm:ss.fff », mais les métadonnées du serveur sont retournées sous la forme nvarchar(10)
. Le dépassement de capacité résultant provoque DBSTATUS_E_CATCONVERTVALUE. Des problèmes similaires surviennent avec les conversions de données par IRowsetChange, car les métadonnées de l’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 de 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 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 de 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 disposez d’un fournisseur client développé à l’aide d’outils antérieurs à SQL Server SQL Server Native Client 2008.
Ensemble de lignes COLUMNS
Les valeurs de colonnes suivantes sont retournées pour les types date/heure :
Type de 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 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
Quand vous êtes connecté à un serveur d’une version antérieure à SQL Server 2008, toute tentative d’utilisation des nouveaux noms de type de serveur (par exemple, avec ICommandWithParameters::SetParameterInfo ou ITableDefinition::CreateTable) entraîne 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, type de serveur désigne le type spécifié par ICommandWithParameters::SetParameterInfo, ou implicite 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 est défini sur SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, les nouveaux types date/heure et les métadonnées associées apparaissent pour les clients tels qu’ils apparaissent pour les clients de bas niveau, comme décrit dans Modifications de copie en bloc pour les types de date et d’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.
Voir aussi
Améliorations des types de données de date et d’heure (OLE DB)