Obsługa typu danych OLE DB Data/Godzina ulepszenia
W tym temacie przedstawiono informacje o OLE DB)SQL Server Obsługujące typy macierzystym klient) SQL Server Data / czas typów danych.
Mapowanie typu danych w zestawów wierszy i parametry
OLE DB udostępnia dwie nowe typy danych do obsługi nowych typów serwerów: DBTYPE_DBTIME2 i DBTYPE_DBTIMESTAMPOFFSET. W poniższej tabela przedstawiono pełną serwera mapowania typu:
SQL Server Typ 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ły
SQL Server Typ danych |
Typ danych OLE DB |
Format ciąg dla konwersji klient |
---|---|---|
data_i_godzina |
DBTYPE_DBTIMESTAMP |
hh: mm: "rrrr mm-dd ss [.999]" SQL Server obsługuje maksymalnie trzy ułamkowe drugiej cyfry daty/godziny. |
Smalldatetime |
DBTYPE_DBTIMESTAMP |
"rrrr mm-dd gg: mm: ss" Ten typ danych ma dokładnością do jednej minuty.Składnik sekund będzie zero w danych wyjściowych i ma być zaokrąglana przez serwer na wejściu. |
data |
DBTYPE_DBDATE |
"rrrr mm-dd" |
godzina |
DBTYPE_DBTIME2 |
"hh: mm: ss [.9999999]" Opcjonalnie można określić ułamków sekund, przy użyciu do siedmiu cyfr. |
datetime2 |
DBTYPE_DBTIMESTAMP |
hh: mm: "rrrr mm-dd ss [.fffffff]" Opcjonalnie można określić ułamków sekund, przy użyciu do siedmiu cyfr. |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
"hh: mm: rrrr mm-dd ss [.fffffff] +/-hh: mm" Opcjonalnie można określić ułamków sekund, przy użyciu do siedmiu cyfr. |
SQL Server 2008 nie wprowadza żadnych zmian do sekwencje escape dla data / czas literałów.
Ułamków sekund w wynikach używać kropki (.) zamiast dwukropka (:)).
Ciąg wartości zwracanych do aplikacji będzie zawsze tej samej długości dla danej kolumna.Rok, miesiąc, dzień, godzin, minut i drugiej części ma być wypełniane z wiodącymi zerami z ich maksymalną szerokość.Będzie dokładnie jedną spację między Data i godzina oraz dokładnie jedną spację między przesunięcie czas i timezone.Przesunięcie timezone będzie zawsze być poprzedzone znakiem.Ten znak będzie znak plus (+) przesunięcie wynosi zero.Będzie nie odstępu między znak i wartością przesunięcia.Ułamków sekund ma być wypełniane z końcowe zera, jeśli to konieczne, do określonych precyzji kolumna, ale nie dalsze.W przypadku kolumn typu Data/godzina będzie trzy cyfry ułamków sekund.Dla kolumn, smalldatetime nie będzie żadnych cyfr ułamków sekund i liczbę sekund będzie zawsze równa zero.
Podczas konwersji z wartości ciągów, określonej przez aplikację będą bardziej elastyczne i pozwoli na składnik wartości mniejszej niż maksymalna szerokość.Lata mogą być 1-4 cyfry.Miesięcy, dni, godzin, minut i sekund mogą być cyfry 1 lub 2.Może to być dowolny odstęp między Data/Godzina i przesunięcie czas/timezone.Znak Przesunięcie godziny zero i zero minut może być plus lub minus.Końcowe zera są dozwolone dla ułamków sekund maksymalnie 9 cyfr.Składnik czas mogą kończyć się 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.Podjęto próbę konwersji pusty ciąg znaków do wartości data/godziny spowoduje błędy SQLState 22018 i komunikat „ Nieprawidłowy znak wartości dla specyfikacji rzutowania".
Formaty danych: Struktury danych
W strukturach specyficzne dla OLE DB opisane poniżej OLE DB jest zgodny z tych samych ograniczeń jako ODBC.Są one pobierane z kalendarza gregoriańskiego:
Miesiąc zakres wynosi od 1 do 12.
Dzień pole zakres to 1 do liczby dni w miesiącu i muszą być zgodne z pole rok i miesiąc, biorąc pod uwagę przestępnego.
Godzina zakres wynosi od 0 do 23.
Minuta zakres wynosi od 0 do 59.
Sekund do zakres od 0 do 59.Dzięki temu do dwóch sekund przestępnych zachować synchronizację z czas sideral.
Zmieniono do obsługi nowych implementacji dla następujących istniejących strukturach baz danych OLE SQL Server Data i godzina typów danych. Definicje, jednak nie zostały zmienione.
DBTYPE_DATE (jest to automatyzacji typ data.Wewnętrznie jest przedstawiany jako double.. Całe strony jest liczbą dni od 30 grudnia 1899 roku, a część ułamkowa jest część doby.Ten typ ma dokładność 1 sekundę, ma to na skuteczne skali 0.)
DBTYPE_DBDATE
DBTYPE_DBTIME
DBTYPE_DBTIMESTAMP (pole ułamek jest zdefiniowane przez OLE DB jako liczba billionths sekundy (nanosekundach) i zakresy z 0 999,999,999)
DBTYPE_FILETIME
DBTYPE_DBTIME2
Ta struktura jest nowa w SQL Server 2008 i jest wypełniane na 12 bajtów w 32-bitowe i 64-bitowych systemach operacyjnych.
typedef struct tagDBTIME2 {
USHORT hour;
USHORT minute;
USHORT second;
ULONG fraction;
} DBTIME2;
DBTYPE_ DBTIMESTAMPOFFSET
Ta struktura jest nowa w SQL Server 2008:
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 liczbą ujemną, timezone_minute musi być ujemna lub zero. Jeśli timezone_hour jest liczbą dodatnią, timezone minute musi mieć wartość dodatnią lub zerem. Jeśli timezone_hour jest równe zero, timezone minute może zawierać wartość z przedziału od-59 +59.
SSVARIANT
Struktura ta została zmodyfikowana w SQL Server 2008 Aby dołączyć nowe struktury DBTYPE_DBTIME2 i DBTIMESTAMPOFFSET DBTYPE_ i dodać 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 wyliczenia skojarzonych z SSVARIANT typ kodowania, która określa typ wyliczenia, zostanie rozszerzony 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
};
Migrowanie do aplikacji SQL Server 2008 Użycie tego sql_variant i zależy od dokładności ograniczony datetime będą musiały być aktualizowane w przypadku podstawowego schematu jest aktualizowane w taki sposób, aby korzystały z datetime2 zamiast datetime.
Makra dostępu dla SSVARIANT również zostały rozszerzone z uwzględnieniem 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żywane przez ITableDefinition::CreateTable:
Typ danych OLE DB)wType) |
SQL Server Typ danych |
Notatki |
---|---|---|
DBTYPE_DBDATE |
data |
|
DBTYPE_DBTIMESTAMP |
datetime2(p) |
The SQL Server Native klient OLE DB dostawca inspects the DBCOLUMDESC bScale element członkowski to determine the fractional seconds precision. |
DBTYPE_DBTIME2 |
time(p) |
The SQL Server Native klient OLE DB dostawca inspects the DBCOLUMDESC bScale element członkowski to determine the fractional seconds precision. |
DBTYPE_DBTIMESTAMPOFFSET |
datetimeoffset(p) |
The SQL Server Native klient OLE DB dostawca inspects the DBCOLUMDESC bScale element członkowski to determine the fractional seconds precision. |
Gdy aplikacja określa DBTYPE_DBTIMESTAMP w wType, można zastąpić, mapowanie na datetime2 przez podanie nazwy wpisz 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 zgodna z wType i pwszTypeName,DB_E_BADSCALE jest zwracany.