Udostępnij za pośrednictwem


Nowe funkcje daty i godziny z poprzednimi wersjami programu SQL Server (OLE DB)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

W tym temacie opisano oczekiwane zachowanie, gdy aplikacja kliencka korzystająca z rozszerzonych funkcji daty i godziny komunikuje się z wersją programu SQL Server wcześniejszą niż SQL Server 2008 (10.0.x), a gdy klient skompilowany z wersją klienta natywnego programu SQL Server starszej niż SQL Server 2008 (10.0.x) wysyła polecenia do serwera obsługującego rozszerzone funkcje daty i godziny.

zachowanie klienta Down-Level

Aplikacje klienckie korzystające z wersji klienta natywnego programu SQL Server starszej niż SQL Server 2008 (10.0.x) widzą nowe typy dat/godzin jako kolumny varchar. Zawartość kolumny to reprezentacje literału. Aby uzyskać więcej informacji, zobacz sekcję "Formaty danych: Ciągi i literały" obsługi typów danych dla ulepszeń daty i godziny OLE DB. Rozmiar kolumny to maksymalna długość literału dla dokładności określonej dla kolumny.

Interfejsy API wykazu będą zwracać metadane zgodne z kodem typu danych na poziomie dół zwróconym do klienta (na przykład nvarchar) i skojarzona reprezentacja na poziomie podrzędnym (na przykład odpowiedni format literału). Zwracana nazwa typu danych będzie jednak nazwą typu rzeczywistego programu SQL Server 2008 (10.0.x).

Gdy aplikacja kliencka na poziomie down-level działa względem serwera SQL Server 2008 (10.0.x) (lub nowszego), na którym wprowadzono zmiany schematu w typach daty/godziny, oczekiwane zachowanie jest następujące:

Typ klienta OLE DB Typ programu SQL Server 2005 Typ programu SQL Server 2008 (lub nowszego) Konwersja wyników (serwer na klienta) Konwersja parametrów (klient na serwer)
DBTYPE_DBDATE Data/godzina Data OK OK
DBTYPE_DBTIMESTAMP Pola czasu ustawione na zero. IRowsetChange zakończy się niepowodzeniem z powodu obcięcia ciągu, jeśli pole czasu jest inne niż zero.
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP Pola daty ustawione na bieżącą datę. IRowsetChange zakończy się niepowodzeniem z powodu obcinania ciągów, jeśli ułamkowe sekundy są inne niż zero.

Data jest ignorowana.
DBTYPE_DBTIME Czas (7) Niepowodzenie — nieprawidłowy literał czasu. OK
DBTYPE_DBTIMESTAMP Niepowodzenie — nieprawidłowy literał czasu. OK
DBTYPE_DBTIMESTAMP Data/godzina2(3) OK OK
DBTYPE_DBTIMESTAMP Data/godzina2(7) OK OK
DBTYPE_DBDATE Mała godzina Data OK OK
DBTYPE_DBTIMESTAMP Pola czasu ustawione na zero. IRowsetChange zakończy się niepowodzeniem z powodu obcięcia ciągu, jeśli pole czasu nie jest zerowe.
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP Pola daty ustawione na bieżącą datę. IRowsetChange zakończy się niepowodzeniem z powodu obcinania ciągów, jeśli ułamkowe sekundy są inne niż zero.

Data jest ignorowana.
DBTYPE_DBTIMESTAMP Datetime2(0) OK OK

Ok oznacza, że w przypadku pracy z programem SQL Server 2005 (9.x) należy kontynuować pracę z programem SQL Server 2008 (10.0.x) (lub nowszym).

Brano pod uwagę tylko następujące typowe zmiany schematu:

  • Użycie nowego typu, w którym aplikacja logicznie wymaga tylko wartości daty lub godziny. Jednak aplikacja została zmuszona do używania data/godzina lub smalldatetime, ponieważ oddzielne typy dat i godzin nie były dostępne.

  • Użycie nowego typu w celu uzyskania dodatkowej precyzji lub dokładności ułamkowej sekund.

  • Przełączenie na data/godzina2, ponieważ jest to preferowany typ danych dla daty i godziny.

Aplikacje korzystające z metadanych serwera uzyskanych za pośrednictwem parametrów ICommandWithParameters::GetParameterInfo lub zestawów wierszy schematu w celu ustawienia informacji o typie parametru za pośrednictwem parametrów ICommandWithParameters::SetParameterInfo zakończy się niepowodzeniem podczas konwersji klienta, gdzie reprezentacja ciągu typu źródłowego jest większa niż reprezentacja ciągu typu docelowego. Jeśli na przykład powiązanie klienta używa DBTYPE_DBTIMESTAMP, a kolumna serwera to data, klient natywny programu SQL Server przekonwertuje wartość na "rrrr-dd-mm hh:mm:ss.fff", ale metadane serwera zostaną zwrócone jako nvarchar(10). Wynikowe przepełnienie powoduje DBSTATUS_E_CANTCONVERTVALUE. Podobne problemy występują w przypadku konwersji danych przez IRowsetChange, ponieważ metadane zestawu wierszy są ustawiane na podstawie metadanych zestawu wyników.

Metadane parametrów i zestawów wierszy

W tej sekcji opisano metadane parametrów, kolumn wyników i zestawów wierszy schematu dla klientów skompilowanych przy użyciu wersji klienta natywnego programu SQL Server starszej niż SQL Server 2008 (10.0.x).

ICommandWithParameters::GetParameterInfo

Struktura DBPARAMINFO zwraca następujące informacje za pomocą parametru prgParamInfo:

Typ parametru wType ulParamSize bPrecision bScale
data DBTYPE_WSTR 10 ~0 ~0
Godzina DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
data/godzina DBTYPE_DBTIMESTAMP 16 23 3
data/godzina2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

Zwróć uwagę, że niektóre z tych zakresów wartości nie są ciągłe; na przykład brakuje wartości 9 w 8,10..16. Jest to spowodowane dodaniu punktu dziesiętnego, gdy precyzja ułamkowa jest większa niż zero.

IColumnsRowset::GetColumnsRowset

Zwracane są następujące kolumny:

Typ kolumny DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION
data DBTYPE_WSTR 10 ZERO ZERO
Godzina DBTYPE_WSTR 8, 10..16 ZERO ZERO
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
data/godzina DBTYPE_DBTIMESTAMP 16 23 3
data/godzina2 DBTYPE_WSTR 19,21..27 ZERO ZERO
datetimeoffset DBTYPE_WSTR 26,28..34 ZERO ZERO

ColumnsInfo::GetColumnInfo

Struktura DBCOLUMNINFO zwraca następujące informacje:

Typ parametru wType ulColumnSize bPrecision bScale
data DBTYPE_WSTR 10 ~0 ~0
time(1..7) DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
data/godzina DBTYPE_DBTIMESTAMP 16 23 3
data/godzina2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

Zestawy wierszy schematu

W tej sekcji omówiono metadane parametrów, kolumn wyników i zestawów wierszy schematu dla nowych typów danych. Te informacje są przydatne w przypadku dostawcy klienta opracowanego przy użyciu narzędzi starszych niż sql Server 2008 (10.0.x) sql Server Native Client.

Zestaw wierszy KOLUMN

Następujące wartości kolumn są zwracane dla typów daty/godziny:

Typ kolumny DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
data DBTYPE_WSTR 10 20 ZERO
Godzina DBTYPE_WSTR 8, 10..16 16,20..32 ZERO
smalldatetime DBTYPE_DBTIMESTAMP ZERO ZERO 0
data/godzina DBTYPE_DBTIMESTAMP ZERO ZERO 3
data/godzina2 DBTYPE_WSTR 19,21..27 38,42..54 ZERO
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 ZERO

zestaw wierszy PROCEDURE_PARAMETERS

Następujące wartości kolumn są zwracane dla typów daty/godziny:

Typ kolumny DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
data DBTYPE_WSTR 10 20 data
Godzina DBTYPE_WSTR 8, 10..16 16,20..32 Godzina
smalldatetime DBTYPE_DBTIMESTAMP ZERO ZERO smalldatetime
data/godzina DBTYPE_DBTIMESTAMP ZERO ZERO data/godzina
data/godzina2 DBTYPE_WSTR 19,21..27 38,42..54 data/godzina2
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 datetimeoffset

zestaw wierszy PROVIDER_TYPES

Następujące wiersze są zwracane dla typów daty/godziny:

Typ —>

Kolumna
data Godzina smalldatetime data/godzina data/godzina2 datetimeoffset
TYPE_NAME data Godzina smalldatetime data/godzina data/godzina2 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 ZERO ZERO ZERO ZERO ZERO ZERO
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
PRZESZUKIWANIA DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE
UNSIGNED_ATTRIBUTE ZERO ZERO ZERO ZERO ZERO ZERO
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 data Godzina smalldatetime data/godzina data/godzina2 datetimeoffset
MINIMUM_SCALE ZERO ZERO ZERO ZERO ZERO ZERO
MAXIMUM_SCALE ZERO ZERO ZERO ZERO ZERO ZERO
GUID ZERO ZERO ZERO ZERO ZERO ZERO
TYPELIB ZERO ZERO ZERO ZERO ZERO ZERO
WERSJA ZERO ZERO ZERO ZERO ZERO ZERO
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

zachowanie serwera Down-Level

Po nawiązaniu połączenia z serwerem starszej wersji niż SQL Server 2008 (10.0.x) każda próba użycia nowych nazw typów serwera (na przykład z parametrami ICommandWithParameters::SetParameterInfo lub ITableDefinition::CreateTable) spowoduje DB_E_BADTYPENAME.

Jeśli nowe typy są powiązane z parametrami lub wynikami bez użycia nazwy typu, a nowy typ jest używany do określania typu serwera niejawnie lub nie ma prawidłowej konwersji z typu serwera na typ klienta, DB_E_ERRORSOCCURRED jest zwracany, a DBBINDSTATUS_UNSUPPORTED_CONVERSION jest ustawiany jako stan powiązania dla metody dostępu używanej podczas wykonywania.

Jeśli istnieje obsługiwana konwersja klienta z typu buforu na typ serwera dla wersji serwera w połączeniu, można użyć wszystkich typów klienta. W tym kontekście typ serwera oznacza typ określony przez ICommandWithParameters::SetParameterInfo lub implikowany przez typ buforu, jeśli nie wywołano właściwości ICommandWithParameters::SetParameterInfo. Oznacza to, że DBTYPE_DBTIME2 i DBTYPE_DBTIMESTAMPOFFSET mogą być używane z serwerami na poziomie podrzędnym lub gdy parametr DataTypeCompatibility=80, jeśli konwersja klienta na obsługiwany typ serwera powiedzie się. Oczywiście jeśli typ serwera jest niepoprawny, błąd może być nadal zgłaszany przez serwer, jeśli nie może wykonać niejawnej konwersji na rzeczywisty typ serwera.

zachowanie SSPROP_INIT_DATATYPECOMPATIBILITY

Gdy SSPROP_INIT_DATATYPECOMPATIBILITY jest ustawiona na SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, nowe typy daty/godziny i skojarzone metadane są widoczne dla klientów na poziomie podrzędnym, zgodnie z opisem w zmiany kopiowania zbiorczego dla rozszerzonych typów dat i godzin (OLE DB i ODBC).

Porównywalność dla IRowsetFind

Wszystkie operatory porównania są dozwolone dla nowych typów daty/godziny, ponieważ są one wyświetlane jako typy ciągów, a nie typy daty/godziny.

Zobacz też

ulepszenia daty i godziny (OLE DB)