Delen via


Nieuwe datum- en tijdfuncties met eerdere VERSIES van SQL Server (OLE DB)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

In dit onderwerp wordt het verwachte gedrag beschreven wanneer een clienttoepassing die gebruikmaakt van verbeterde datum- en tijdfuncties communiceert met een versie van SQL Server ouder dan SQL Server 2008 (10.0.x) en wanneer een client die is gecompileerd met een versie van SQL Server Native Client ouder dan SQL Server 2008 (10.0.x) opdrachten verzendt naar een server die uitgebreide datum- en tijdfuncties ondersteunt.

Down-Level clientgedrag

Clienttoepassingen die gebruikmaken van een versie van SQL Server Native Client ouder dan SQL Server 2008 (10.0.x) zien de nieuwe datum-/tijdtypen als nvarchar kolommen. De kolominhoud zijn letterlijke weergaven. Zie de sectie 'Gegevensindelingen: tekenreeksen en letterlijke waarden' van ondersteuning voor gegevenstypen voor verbeteringen van OLE DB-datum en -tijdvoor meer informatie. De kolomgrootte is de maximale letterlijke lengte voor de precisie die is opgegeven voor de kolom.

Catalogus-API's retourneren metagegevens die consistent zijn met de code van het gegevenstype down-level die wordt geretourneerd aan de client (bijvoorbeeld nvarchar) en de bijbehorende weergave op down-level (bijvoorbeeld de juiste letterlijke indeling). De geretourneerde naam van het gegevenstype is echter de werkelijke sql Server 2008 (10.0.x) typenaam.

Wanneer een clienttoepassing op down-level wordt uitgevoerd op een SQL Server 2008-server (10.0.x) (of hoger) waarop schemawijzigingen zijn aangebracht in datum-/tijdtypen, is het verwachte gedrag als volgt:

OLE DB-clienttype SQL Server 2005-type TYPE SQL Server 2008 (of hoger) Resultaatconversie (server naar client) Parameterconversie (client naar server)
DBTYPE_DBDATE Datum/tijd Datum OK OK
DBTYPE_DBTIMESTAMP Tijdvelden ingesteld op nul. IRowsetChange mislukt vanwege afkapping van tekenreeksen als het tijdveld niet-nul is.
DBTYPE_DBTIME Tijd(0) OK OK
DBTYPE_DBTIMESTAMP Datumvelden ingesteld op huidige datum. IRowsetChange mislukt vanwege afkapping van tekenreeksen als fractionele seconden niet-nul zijn.

Datum wordt genegeerd.
DBTYPE_DBTIME Tijd(7) Mislukt- ongeldige tijds letterlijke tijd. OK
DBTYPE_DBTIMESTAMP Mislukt- ongeldige tijds letterlijke tijd. OK
DBTYPE_DBTIMESTAMP Datetime2(3) OK OK
DBTYPE_DBTIMESTAMP Datetime2(7) OK OK
DBTYPE_DBDATE Smalldatetime Datum OK OK
DBTYPE_DBTIMESTAMP Tijdvelden ingesteld op nul. IRowsetChange mislukt vanwege afkapping van tekenreeksen als het tijdveld niet-nul is.
DBTYPE_DBTIME Tijd(0) OK OK
DBTYPE_DBTIMESTAMP Datumvelden ingesteld op huidige datum. IRowsetChange mislukt vanwege afkapping van tekenreeksen als fractionele seconden niet-nul zijn.

Datum wordt genegeerd.
DBTYPE_DBTIMESTAMP Datetime2(0) OK OK

OK betekent dat als het werkt met SQL Server 2005 (9.x), het moet blijven werken met SQL Server 2008 (10.0.x) (of hoger).

Alleen de volgende algemene schemawijzigingen zijn overwogen:

  • Het gebruik van een nieuw type waarbij logisch een toepassing alleen een datum- of tijdwaarde vereist. De toepassing moest echter datum/tijd of smalldatetime gebruiken omdat er geen afzonderlijke datum- en tijdtypen beschikbaar waren.

  • Een nieuw type gebruiken om extra precisie of nauwkeurigheid van fractionele seconden te verkrijgen.

  • Overschakelen naar datum/tijd2 omdat dit het voorkeursgegevenstype is voor datum en tijd.

Toepassingen die servermetagegevens gebruiken die zijn verkregen via ICommandWithParameters::GetParameterInfo of schemarijsets om informatie over het parametertype in te stellen via ICommandWithParameters::SetParameterInfo, mislukken tijdens clientconversies waarbij de tekenreeksweergave van een brontype groter is dan de tekenreeksweergave van het doeltype. Als een clientbinding bijvoorbeeld gebruikmaakt van DBTYPE_DBTIMESTAMP en de serverkolom datum is, wordt de waarde door SQL Server Native Client geconverteerd naar 'jjjj-dd-mm uu:mm:ss.fff', maar de metagegevens van de server worden geretourneerd als nvarchar(10). De resulterende overloop veroorzaakt DBSTATUS_E_CANTCONVERTVALUE. Vergelijkbare problemen ontstaan met gegevensconversies door IRowsetChange, omdat de metagegevens van de rijenset worden ingesteld op basis van de metagegevens van de resultatenset.

Metagegevens van parameters en rijenset

In deze sectie worden metagegevens beschreven voor parameters, resultaatkolommen en schemarijsets voor clients die zijn gecompileerd met een versie van SQL Server Native Client die ouder is dan SQL Server 2008 (10.0.x).

ICommandWithParameters::GetParameterInfo

De DBPARAMINFO-structuur retourneert de volgende informatie via de parameter prgParamInfo:

Parametertype wType ulParamSize bPrecision bScale
datum DBTYPE_WSTR 10 ~0 ~0
Tijd DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datum/tijd DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

U ziet dat sommige van deze waardebereiken niet doorlopend zijn; 9 ontbreekt bijvoorbeeld in 8.10..16. Dit komt door de toevoeging van een decimaalteken wanneer breuknauwkeurigheid groter is dan nul.

IColumnsRowset::GetColumnsRowset

De volgende kolommen worden geretourneerd:

Kolomtype DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION
datum DBTYPE_WSTR 10 NUL NUL
Tijd DBTYPE_WSTR 8, 10..16 NUL NUL
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datum/tijd DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 NUL NUL
datetimeoffset DBTYPE_WSTR 26,28..34 NUL NUL

ColumnsInfo::GetColumnInfo

De structuur DBCOLUMNINFO retourneert de volgende informatie:

Parametertype wType ulColumnSize bPrecision bScale
datum DBTYPE_WSTR 10 ~0 ~0
time(1..7) DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datum/tijd DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

Schemarijen

In deze sectie worden metagegevens voor parameters, resultaatkolommen en schemarijsets voor nieuwe gegevenstypen besproken. Deze informatie is handig als u een clientprovider hebt ontwikkeld met behulp van hulpprogramma's die ouder zijn dan SQL Server 2008 (10.0.x) SQL Server Native Client.

Rijenset KOLOMMEN

De volgende kolomwaarden worden geretourneerd voor datum-/tijdtypen:

Kolomtype DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
datum DBTYPE_WSTR 10 20 NUL
Tijd DBTYPE_WSTR 8, 10..16 16,20..32 NUL
smalldatetime DBTYPE_DBTIMESTAMP NUL NUL 0
datum/tijd DBTYPE_DBTIMESTAMP NUL NUL 3
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 NUL
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 NUL

PROCEDURE_PARAMETERS rijenset

De volgende kolomwaarden worden geretourneerd voor datum-/tijdtypen:

Kolomtype DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
datum DBTYPE_WSTR 10 20 datum
Tijd DBTYPE_WSTR 8, 10..16 16,20..32 Tijd
smalldatetime DBTYPE_DBTIMESTAMP NUL NUL smalldatetime
datum/tijd DBTYPE_DBTIMESTAMP NUL NUL datum/tijd
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 datetime2
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 datetimeoffset

PROVIDER_TYPES rijenset

De volgende rijen worden geretourneerd voor datum-/tijdtypen:

Type ->

Kolom
datum Tijd smalldatetime datum/tijd datetime2 datetimeoffset
TYPE_NAME datum Tijd smalldatetime datum/tijd 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 NUL NUL NUL NUL NUL NUL
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
DOORZOEKBAAR DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE
UNSIGNED_ATTRIBUTE NUL NUL NUL NUL NUL NUL
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 datum Tijd smalldatetime datum/tijd datetime2 datetimeoffset
MINIMUM_SCALE NUL NUL NUL NUL NUL NUL
MAXIMUM_SCALE NUL NUL NUL NUL NUL NUL
GUID NUL NUL NUL NUL NUL NUL
TYPELIB NUL NUL NUL NUL NUL NUL
VERSIE NUL NUL NUL NUL NUL NUL
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

Down-Level servergedrag

Wanneer verbinding wordt gemaakt met een server met een eerdere versie dan SQL Server 2008 (10.0.x), resulteert elke poging om de nieuwe servertypenamen te gebruiken (bijvoorbeeld met ICommandWithParameters::SetParameterInfo of ITableDefinition::CreateTable) DB_E_BADTYPENAME.

Als nieuwe typen afhankelijk zijn van parameters of resultaten zonder het gebruik van een typenaam en het nieuwe type wordt gebruikt om het servertype impliciet op te geven of er geen geldige conversie van het servertype naar het clienttype is, wordt DB_E_ERRORSOCCURRED geretourneerd en wordt DBBINDSTATUS_UNSUPPORTED_CONVERSION ingesteld als de bindingsstatus voor de accessor die tijdens Execute wordt gebruikt.

Als er een ondersteunde clientconversie van het buffertype naar het servertype voor de serverversie van de verbinding bestaat, kunnen alle clientbuffertypen worden gebruikt. In deze context betekent servertype het type dat is opgegeven door ICommandWithParameters::SetParameterInfo of impliciet door het buffertype als ICommandWithParameters::SetParameterInfo niet is aangeroepen. Dit betekent dat DBTYPE_DBTIME2 en DBTYPE_DBTIMESTAMPOFFSET kunnen worden gebruikt met servers op een lager niveau, of wanneer DataTypeCompatibility=80, als de clientconversie naar een ondersteund servertype slaagt. Als het servertype onjuist is, kan er natuurlijk nog steeds een fout worden gerapporteerd door de server als er geen impliciete conversie naar het werkelijke servertype kan worden uitgevoerd.

SSPROP_INIT_DATATYPECOMPATIBILITY gedrag

Wanneer SSPROP_INIT_DATATYPECOMPATIBILITY is ingesteld op SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, worden de nieuwe datum-/tijdtypen en bijbehorende metagegevens weergegeven aan clients zoals ze worden weergegeven voor downlevel clients, zoals beschreven in Wijzigingen bulksgewijs kopiƫren voor verbeterde datum- en tijdtypen (OLE DB en ODBC).

Vergelijkbaarheid voor IRowsetFind

Alle vergelijkingsoperatoren zijn toegestaan voor de nieuwe typen datum/tijd, omdat ze worden weergegeven als tekenreekstypen in plaats van datum-/tijdtypen.

Zie ook

Verbeteringen aan datum en tijd (OLE DB)