Udostępnij za pośrednictwem


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.