Obsługa typu danych OLE DB Data/Godzina ulepszenia
Ten temat zawiera informacje OLE DB (SQL Server Native Client) obsługujące typy SQL Server Data /czas typów danych.
Mapowanie typu danych zestawów wierszy oraz parametry
OLE DB zawiera dwa nowe typy danych do obsługi nowych typów serwera: DBTYPE_DBTIME2 i DBTYPE_DBTIMESTAMPOFFSET.W poniższej tabela przedstawiono mapowanie typu całego serwera:
SQL Servertyp danych |
Typ danych OLE DB |
Wartość |
---|---|---|
data_i_godzina |
DBTYPE_DBTIMESTAMP |
135 (oledb.h) |
smalldatetime |
DBTYPE_DBTIMESTAMP |
135 (oledb.h) |
data |
DBTYPE_DBDATE |
133 (oledb.h) |
godzina |
DBTYPE_DBTIME2 |
145 (sqlncli.h) |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
146 (sqlncli.h) |
datetime2 |
DBTYPE_DBTIMESTAMP |
135 (oledb.h) |
Formaty danych: Ciągi i literałów
SQL Servertyp danych |
Typ danych OLE DB |
Format ciągu dla konwersji klient |
---|---|---|
data_i_godzina |
DBTYPE_DBTIMESTAMP |
"rrrr mm-dd ss [.999]" SQL Serverobsługuje maksymalnie trzy cyfry drugiego ułamkowe Datetime. |
smalldatetime |
DBTYPE_DBTIMESTAMP |
"rrrr mm-dd ss" Ten typ danych ma dokładność jedną minutę.Składnik sekund będzie zero w danych wyjściowych i zaokrąglone na wejście przez serwer. |
data |
DBTYPE_DBDATE |
"rrrr mm-dd" |
godzina |
DBTYPE_DBTIME2 |
"ss [.9999999]" Opcjonalnie można określić ułamków sekund do siedmiu cyfry. |
datetime2 |
DBTYPE_DBTIMESTAMP |
"rrrr mm-dd ss [.fffffff]" Opcjonalnie można określić ułamków sekund do siedmiu cyfry. |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
"rrrr mm-dd ss [.fffffff] +/-hh: mm" Opcjonalnie można określić ułamków sekund do siedmiu cyfry. |
data nie ma żadnych zmian w sekwencji unikowych /czas literałów.
Ułamków sekund w wyniki używać kropki (.) zamiast dwukropka (:)).
Ciąg wartości zwracanych do aplikacji będą zawsze tej samej długości, dla danej kolumna.Roku, miesiąc, dzień, godzinę, minutę i drugiej części zostanie uzupełniony z zer ich maksymalną szerokość.Będzie dokładnie jedną spację między datą i czas i dokładnie jedną spację między czas i czasprzesunięcie strefy.Przesunięcie timezone będzie zawsze poprzedzona znakiem.Jest to znak plus (+) przesunięcie wynosi zero.Być nie odstępu między znak i wartością przesunięcia.Ułamków sekund zostanie dopełnione końcowe zera, jeśli to konieczne, do określonych precyzji kolumna, ale nie dalsze.Datetime kolumn będą trzy cyfry ułamków sekund.Smalldatetime kolumn będzie Brak miejsc ułamków sekund i sekund będzie zawsze równa zero.
Konwersje z wartości ciąg aplikacji będzie bardziej elastyczne i pozwoli na składnik wartości mniejszej niż maksymalna szerokość.Lata mogą być cyfr 1-4.Miesięcy, dni, godzin, minut i sekund można cyfry 1 lub 2.Może istnieć dowolnego odstępu między datą /czas i czas/czasprzesunięcia strefy.Znak o godzinach zero i zero minut przesunięcie może być plus lub minus.Końcowe zera są dozwolone dla ułamków sekund maksymalnie 9 cyfr.A czas składnika można zakończyć z punktem dziesiętnym i nie cyfr ułamków sekund.
Pusty ciąg nie jest prawidłową data/czas literał i nie reprezentuje wartość NULL.Próba przekonwertować pusty ciąg na datę /czas wartość spowoduje błędów z SQLState 22018 i komunikat "nieprawidłowy znak wartość dla specyfikacji".
Formaty danych: Struktury danych
Opisane poniżej struktury specyficzne dla OLE DB OLE DB spełnia te same ograniczenia jak ODBC.Są one pobierane z kalendarza gregoriańskiego:
Miesiąc zakres wynosi od 1 do 12.
Dzień zakres wynosi od 1 do liczby dni w miesiącu i muszą być zgodne z pole rok i miesiąc, biorąc pod uwagę przestępnego.
Godzinę zakres wynosi od 0 do 23.
MINUTE zakres wynosi od 0 do 59.
Sekund z zakres od 0 do 59.Dzięki temu do dwóch sekund przestępnych zachować synchronizację z czas sideral.
Implementacje dla następujących istniejących OLE DB zmodyfikowane do obsługi nowych struktur SQL Server data i czas danych typów.Definicje, jednak nie uległy zmianie.
DBTYPE_DATE (jest to typ daty automatyzacji.Wewnętrznie jest reprezentowana jako double.Cała część jest liczbą dni od 30 grudnia 1899 roku, a część ułamkowa część doby.Ten typ ma dokładność 1 sekundę ma tak skuteczne skali 0.)
DBTYPE_DBDATE
DBTYPE_DBTIME
DBTYPE_DBTIMESTAMP (pole frakcji jest zdefiniowane przez OLE DB jako liczba billionths druga (nanosekundach) i zakresy z 0 999,999,999)
DBTYPE_FILETIME
DBTYPE_DBTIME2
Ta struktura jest uzupełniony 12 bajtów w 32-bitowych i 64-bitowych systemach operacyjnych.
typedef struct tagDBTIME2 {
USHORT hour;
USHORT minute;
USHORT second;
ULONG fraction;
} DBTIME2;
DBTYPE_ DBTIMESTAMPOFFSET
typedef struct tagDBTIMESTAMPOFFSET {
SHORT year;
USHORT month;
USHORT day;
USHORT hour;
USHORT minute;
USHORT second;
ULONG fraction;
SHORT timezone_hour;
SHORT timezone_minute;
} DBTIMESTAMPOFFSET;
Jeśli timezone_hour jest ujemna, timezone_minute musi być ujemna lub zero.Jeśli timezone_hour jest dodatnia, timezone minute musi być dodatnią lub zero.Jeśli timezone_hour wynosi zero, timezone minute może zawierać wartość z zakresu -59 do + 59.
SSVARIANT
Ta struktura teraz zawiera nowych struktur DBTYPE_DBTIME2 i DBTYPE_ DBTIMESTAMPOFFSET oraz skali ułamków sekund dla odpowiednich typów.
struct SSVARIANT {
SSVARTYPE vt;
DWORD dwReserved1;
DWORD dwReserved2;
union {
// ...
DBTIMESTAMP tsDateTimeVal;
DBDATE dDateVal;
struct _Time2Val {
DBTIME2 tTime2Val;
BYTE bScale;
} Time2Val;
struct _DateTimeVal {
DBTIMESTAMP tsDateTimeVal;
BYTE bScale;
} DateTimeVal;
struct _DateTimeOffsetVal {
DBTIMESTAMPOFFSET tsoDateTimeOffsetVal;
BYTE bScale;
} DateTimeOffsetVal;
// ...
};
};
Ponadto enum skojarzonych z SSVARIANT typ kodowania, określający typ wyliczenia zostaną rozszerzone w następujący sposób:
enum SQLVARENUM {
// ...
// Datetime
VT_SS_DATETIME = DBTYPE_DBTIMESTAMP,
VT_SS_SMALLDATETIME = 206,
VT_SS_DATE = DBTYPE_DBDATE,
VT_SS_TIME2 = DBTYPE_DBTIME2,
VT_SS_DATETIME2 = 212
VT_SS_DATETIMEOFFSET = DBTYPE_DBTIMESTAMPOFFSET
};
Aplikacje migracji do SQL Server Native Client, który korzysta z sql_variant i polegać na dokładność ograniczone datetime będą musiały aktualizowane, jeśli podstawowy schemat jest aktualizowany do używania datetime2 zamiast datetime.
Makra programu access dla SSVARIANT również zostały rozszerzone o dodanie następujących czynności:
#define V_SS_DATETIME2(X) V_SS_UNION(X, DateTimeVal)
#define V_SS_TIME2(X) V_SS_UNION(X, Time2Val)
#define V_SS_DATE(X) V_SS_UNION(X, dDateVal)
#define V_SS_DATETIMEOFFSET(X) V_SS_UNION(X, DateTimeOffsetVal)
Mapowanie typu danych w ITableDefinition::CreateTable
Następujące mapowania typu jest używana z struktur DBCOLUMNDESC używany przez ITableDefinition::CreateTable:
Typ danych OLE DB (wType) |
SQL Servertyp danych |
Uwagi |
---|---|---|
DBTYPE_DBDATE |
data |
|
DBTYPE_DBTIMESTAMP |
datetime2(p) |
SQL Server Macierzystego klienta dostawca OLE DB sprawdzi DBCOLUMDESC bScaleelement członkowski do określenia dokładności ułamków sekund. |
DBTYPE_DBTIME2 |
time(p) |
SQL Server Macierzystego klienta dostawca OLE DB sprawdzi DBCOLUMDESC bScaleelement członkowski do określenia dokładności ułamków sekund. |
DBTYPE_DBTIMESTAMPOFFSET |
datetimeoffset(p) |
SQL Server Macierzystego klienta dostawca OLE DB sprawdzi DBCOLUMDESC bScaleelement członkowski do określenia dokładności ułamków sekund. |
Gdy aplikacja określa DBTYPE_DBTIMESTAMP w wType, można zastąpić, mapowanie na datetime2 , podając nazwę typu w pwszTypeName.Jeśli datetime jest określony, bScale musi być 3.Jeśli smalldatetime jest określony, bScale musi być 0.Jeśli bScale nie jest zgodny z wType i pwszTypeName,DB_E_BADSCALE jest zwracany.