Partager via


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.