Freigeben über


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

In diesem Thema wird das erwartete Verhalten beschrieben, wenn eine Clientanwendung, die erweiterte Datums- und Uhrzeitfunktionen verwendet, mit einer Version von SQL Server vor SQL Server 2008 kommuniziert und wenn ein Client mit einer Version von SQL Server Native Client vor SQL Server 2008 sendet Befehle an einen Server, der erweiterte Datums- und Uhrzeitfeatures unterstützt.

Downlevelclient-Verhalten

Clientanwendungen, die eine frühere Version von SQL Server Native Client als SQL Server 2008 verwenden, sehen die neuen Datums-/Uhrzeittypen als nvarchar Spalten. Die Spalten enthalten literale Darstellungen. Weitere Informationen finden Sie im Abschnitt "Datenformate: Zeichenfolgen und Literale" der Datentypunterstützung für VERBESSERUNGEN von OLE DB-Datums- und Uhrzeitangaben. 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 Typname SQL Server 2008.

Wenn eine Clientanwendung auf down-Level-Ebene auf einem server mit SQL Server 2008 (oder höher) ausgeführt wird, auf dem Schemaänderungen an Datums-/Uhrzeittypen vorgenommen wurden, sieht das erwartete Verhalten wie folgt aus:

OLE DB-Clienttyp SQL Server 2005-Typ Typ SQL Server 2008 (oder höher) 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 aufgrund einer Zeichenfolgenkürzung fehl, 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 aufgrund einer Zeichenfolgenkürzung fehl, wenn Sekundenbruchteile ungleich 0 (null) sind.

Das Datum wird ignoriert.
DBTYPE_DBTIME Time(7) Fehler: ungültiges Zeitliteral. OK
DBTYPE_DBTIMESTAMP Fehler: 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 aufgrund einer Zeichenfolgenkürzung fehl, 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 aufgrund einer Zeichenfolgenkürzung fehl, wenn Sekundenbruchteile ungleich 0 (null) sind.

Das Datum wird ignoriert.
DBTYPE_DBTIMESTAMP Datetime2(0) OK OK

OK bedeutet, dass, wenn es mit SQL Server 2005 funktioniert hat, es mit SQL Server 2008 (oder höher) weiterhin funktionieren sollte.

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

  • Verwenden eines neuen Typs, wenn eine Anwendung logisch nur einen Datums- oder 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 über ICommandWithParameters::GetParameterInfo abgerufene Servermetadaten verwenden, um Parametertypinformationen über ICommandWithParameters::SetParameterInfo festzulegen, schlagen bei Clientkonvertierungen fehl, bei denen die Zeichenfolgendarstellung eines Quelltyps größer ist als die Zeichenfolgendarstellung des Zieltyps. Wenn eine Clientbindung z. B. DBTYPE_DBTIMESTAMP verwendet und die Serverspalte datum ist, konvertiert SQL Server Native Client den Wert in "yyyyy-dd-mm hh:mm:ss.fff", aber Servermetadaten werden als nvarchar(10)zurückgegeben. Der resultierende Überlauf löst DBSTATUS_E_CATCONVERTVALUE aus. Ähnliche Probleme treten bei Datenkonvertierungen von IRowsetChange auf, da die Rowsetmetadaten aus 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 werden.

ICommandWithParameters::GetParameterInfo

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

Parametertyp 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

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 nützlich, wenn Sie über einen Clientanbieter verfügen, 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
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

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
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

PROVIDER_TYPES-Rowset

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

Typ >

Column
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

Downlevelserver-Verhalten

Wenn eine Verbindung mit einem Server einer früheren Version als 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 Kontext bedeutet Servertyp den typ, der durch ICommandWithParameters::SetParameterInfo angegeben wird, oder impliziert durch den Puffertyp, 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 den Clients die neuen Datums-/Uhrzeittypen und die zugehörigen Metadaten angezeigt, wie unter Massenkopieränderungen für erweiterte Datums- und Uhrzeittypen (OLE DB und ODBC) beschrieben.

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.

Weitere Informationen

Verbesserungen bei Datum und Uhrzeit (OLE DB)