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.