Freigeben über


Neue Funktionen für Datum-/Uhrzeit mit früheren SQL Server-Versionen (OLE DB)

Dieses Thema beschreibt das erwartete Verhalten, wenn eine Clientanwendung, die verbesserte Funktionen für Datum und Uhrzeit verwendet, mit einer SQL Server-Version vor SQL Server 2008 kommuniziert und wenn ein Client, der mit einer SQL Server Native Client-Version vor SQL Server 2008 kompiliert wurde, Befehle an einen Server sendet, der verbesserte Datums- und Uhrzeitfunktionen unterstützt.

Clientverhalten früherer Versionen

Clientanwendungen, die eine SQL Server Native Client-Version vor SQL Server 2008 verwenden, betrachten die neuen Datum-/Uhrzeittypen als nvarchar-Spalten. Die Spalten enthalten literale Darstellungen. Weitere Informationen finden Sie im Abschnitt "Datenformate: Zeichenfolgen und Literale" in Datentypunterstützung für OLE DB-Datum-/Uhrzeit-Verbesserungen. Die Spaltengröße ist die maximale Literallänge für die Genauigkeit, die für die Spalte festgelegt wurde.

Katalog-APIs geben Metadaten zurück, die mit dem an den Client zurückgegebenen Datentypcode früherer Versionen (z. B. nvarchar) und der zugeordneten Darstellung früherer Versionen (z. B. das entsprechende Literalformat) übereinstimmt. Der zurückgegebene Datentypname ist jedoch der echte SQL Server 2008-Typname.

Wenn eine Downlevelclientanwendung auf einem SQL Server 2008-Server (oder höher) ausgeführt wird, an dem Schemaänderungen an Datums-/Uhrzeittypen vorgenommen wurden, sieht das zu erwartende Verhalten wie folgt aus:

OLE DB-Clienttyp

SQL Server 2005-Typ

SQL Server 2008 (oder höher) - Typ

Ergebniskonvertierung (Server zu Client)

Parameterkonvertierung (Client zu Server)

DBTYPE_DBDATE

Datetime

Date

OK

OK

DBTYPE_DBTIMESTAMP

Zeitfelder werden auf 0 (Null) festgelegt.

IRowsetChange schlägt fehl, weil die Zeichenfolge abgeschnitten wird, wenn das Zeitfeld ungleich 0 (null) ist.

DBTYPE_DBTIME

Time(0)

OK

OK

DBTYPE_DBTIMESTAMP

Datumsfelder werden auf das aktuelle Datum festgelegt.

IRowsetChange schlägt fehl, weil die Zeichenfolge abgeschnitten wird, wenn Sekundenbruchteile ungleich 0 (null) sind.

Datum wird ignoriert.

DBTYPE_DBTIME

Time(7)

Schlägt fehl - ungültiges Zeitliteral

OK

DBTYPE_DBTIMESTAMP

Schlägt fehl - ungültiges Zeitliteral

OK

DBTYPE_DBTIMESTAMP

Datetime2(3)

OK

OK

DBTYPE_DBTIMESTAMP

Datetime2(7)

OK

OK

DBTYPE_DBDATE

Smalldatetime

Date

OK

OK

DBTYPE_DBTIMESTAMP

Zeitfelder werden auf 0 (Null) festgelegt.

IRowsetChange schlägt fehl, weil die Zeichenfolge abgeschnitten wird, wenn das Zeitfeld ungleich 0 (null) ist.

DBTYPE_DBTIME

Time(0)

OK

OK

DBTYPE_DBTIMESTAMP

Datumsfelder werden auf das aktuelle Datum festgelegt.

IRowsetChange schlägt fehl, weil die Zeichenfolge abgeschnitten wird, wenn Sekundenbruchteile ungleich 0 (null) sind.

Datum wird ignoriert.

DBTYPE_DBTIMESTAMP

Datetime2(0)

OK

OK

'OK' bedeutet, dass sich die Funktionsweise von SQL Server 2008 und SQL Server 2005 (oder höher) nicht unterscheidet.

Nur die folgenden allgemeinen Schemaänderungen wurden berücksichtigt:

  • Verwenden eines neuen Typs, wenn eine Anwendung logisch nur ein Datum oder einen Zeitwert erfordert. Die Anwendung musste jedoch datetime oder smalldatetime verwenden, da separate Datums- und Zeittypen nicht zur Verfügung standen.

  • Verwenden eines neuen Typs, um zusätzliche Genauigkeit in Sekundenbruchteilen zu erzielen.

  • Wechseln zu datetime2, da dies der bevorzugte Datentyp für Datum und Uhrzeit ist.

Anwendungen, die Servermetadaten verwenden, die über ICommandWithParameters::GetParameterInfo abgerufen werden, oder die Schemarowsets zum Festlegen von Informationen zu Parametertypen über ICommandWithParameters::SetParameterInfo verwenden, schlagen bei Clientkonvertierungen fehl, bei denen die Zeichenfolgendarstellung eines Quelltyps größer ist als die Zeichenfolgendarstellung des Zieltyps. Wenn eine Clientbindung beispielsweise DBTYPE_DBTIMESTAMP verwendet und die Serverspalte date lautet, konvertiert SQL Server Native Client den Wert in das Format "yyyy-dd-mm hh:mm:ss.fff", Servermetadaten werden jedoch als nvarchar(10) zurückgegeben. Der resultierende Überlauf löst DBSTATUS_E_CATCONVERTVALUE aus. Ähnliche Probleme treten bei Datenkonvertierungen mit IRowsetChange auf, da die Rowsetmetadaten von den Resultsetmetadaten festgelegt werden.

Metadaten für Parameter und Rowsets

In diesem Abschnitt werden Metadaten für Parameter, Ergebnisspalten und Schemarowsets für Clients beschrieben, die mit einer Version von SQL Server Native Client vor SQL Server 2008 kompiliert sind.

ICommandWithParameters::GetParameterInfo

Die DBPARAMINFO-Struktur gibt die folgenden Informationen durch den prgParamInfo-Parameter zurück:

Parametertyp

wType

ulParamSize

bPrecision

bscale

date

DBTYPE_WSTR

10

~0

~0

Uhrzeit

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

Beachten Sie, dass einige dieser Wertbereiche nicht fortlaufend sind; z. B. fehlt 9 in 8,10..16. Der Grund dafür ist das Hinzufügen eines Dezimaltrennzeichens, wenn die Genauigkeit von Bruchteilen größer als 0 (NULL) ist.

IColumnsRowset::GetColumnsRowset

Folgende Spalten werden zurückgegeben:

Spaltentyp

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

Die DBCOLUMNINFO-Struktur gibt die folgenden Informationen zurück:

Parametertyp

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

Schemarowsets

In diesem Abschnitt werden Metadaten für Parameter, Ergebnisspalten und Schemarowsets für neue Datentypen beschrieben. Diese Informationen sind hilfreich, wenn Sie einen Clientanbieter besitzen, der mit Tools vor SQL Server 2008 SQL Server Native Client entwickelt wurde.

COLUMNS-Rowset

Die folgenden Spaltenwerte werden für date/time-Typen zurückgegeben:

Spaltentyp

DATA_TYPE

CHARACTER_MAXIMUM_LENGTH

CHARACTER_OCTET_LENGTH

DATETIME_PRECISION

date

DBTYPE_WSTR

10

20

NULL

Uhrzeit

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

PROCEDURE_PARAMETERS-Rowset

Die folgenden Spaltenwerte werden für date/time-Typen zurückgegeben:

Spaltentyp

DATA_TYPE

CHARACTER_MAXIMUM_LENGTH

CHARACTER_OCTET_LENGTH

TYPE_NAME

LOCAL_TYPE_NAME

date

DBTYPE_WSTR

10

20

date

Uhrzeit

DBTYPE_WSTR

8, 10..16

16,20..32

Uhrzeit

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

PROVIDER_TYPES-Rowset

Die folgenden Zeilen werden für date/time-Typen zurückgegeben:

Typ ->

Spalte

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

Serververhalten früherer Versionen

Wenn eine Verbindung zu einer Serverversion vor SQL Server 2008 hergestellt wird, führt jeder Versuch, die neuen Servertypnamen zu verwenden (z. B. mit ICommandWithParameters::SetParameterInfo oder ITableDefinition::CreateTable) zu DB_E_BADTYPENAME.

Wenn neue Typen für Parameter oder Ergebnisse ohne Verwendung eines Typnamens gebunden werden, und entweder der neue Typ verwendet wird, um den Servertyp implizit festzulegen, oder keine gültige Konvertierung vom Servertyp zum Clienttyp vorhanden ist, wird DB_E_ERRORSOCCURRED zurückgegeben, und DBBINDSTATUS_UNSUPPORTED_CONVERSION wird als Bindungsstatus für den bei der Ausführung verwendeten Accessor festgelegt.

Alle Clientpuffertypen können verwendet werden, wenn eine Clientkonvertierung vom Puffertyp zum Servertyp für die Serverversion dieser Verbindung unterstützt wird. In diesem Zusammenhang bezeichnet Servertyp den durch ICommandWithParameters::SetParameterInfo festgelegten Typ oder den durch den Puffertyp implizierten Typ, wenn ICommandWithParameters::SetParameterInfo nicht aufgerufen wurde. Das bedeutet, dass DBTYPE_DBTIME2 und DBTYPE_DBTIMESTAMPOFFSET mit Servern früherer Versionen verwendet werden können, wenn DataTypeCompatibility auf 80 festgelegt und die Clientkonvertierung zu einem unterstützten Servertyp erfolgreich ist. Wenn der Servertyp inkorrekt ist, gibt der Server einen Fehler zurück, wenn er eine implizite Konvertierung in den tatsächlichen Servertyp nicht durchführen kann.

SSPROP_INIT_DATATYPECOMPATIBILITY-Verhalten

Wenn SSPROP_INIT_DATATYPECOMPATIBILITY auf SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000 festgelegt ist, werden die neuen Datums-/Uhrzeittypen und die zugehörigen Metadaten-Clients so angezeigt wie in früheren Clients. Weitere Informationen finden Sie unter Massenkopieränderungen für verbesserte Datum-/Uhrzeittypen (OLE DB und ODBC).

Vergleichbarkeit für IRowsetFind

Alle Vergleichsoperatoren sind für die neuen Datums-/Uhrzeittypen zulässig, da Sie als Zeichenfolgetypen anstatt als Datums-/Uhrzeittypen angezeigt werden.