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