Поделиться через


Новые функции даты-времени с предыдущими версиями SQL (OLE DB)

В этом разделе описано ожидаемое поведение, когда клиентское приложение, использующее расширенные функции даты и времени, взаимодействует с версией SQL Server, более ранней, чем SQL Server 2008, и когда клиент, скомпилированный с версией собственного клиента SQL Server, более раннего, нежели SQL Server 2008, посылает команды серверу, поддерживающему расширенные функции даты и времени.

Работа в клиентах низкого уровня

Клиентские приложения, которые используют версию собственного клиента SQL Server, более раннего, чем SQL Server 2008, распознают новые типы даты и времени как столбцы nvarchar. Содержимое столбца представлено литералом. Дополнительные сведения см. в разделе «Форматы данных: подраздел «Строки и литералы» раздела Улучшения поддержки типов данных даты-времени OLE DB. Размер столбца — максимальная длина литерала для точности, указанной для столбца.

API-интерфейсы каталога будут возвращать метаданные, согласованные с кодом типа данных низшего уровня, возвращаемым клиенту (например, nvarchar), и связанное низкоуровневое представление (например, соответствующий формат литералов). Тем не менее будет возвращено реальное имя типа данных SQL Server 2008.

При запуске клиентского приложения низкого уровня на сервере SQL Server 2008, на котором в схеме типы даты-времени были изменены, ожидаются следующие эффекты.

Тип клиента OLE DB

Тип SQL Server 2005

Тип SQL Server 2008

Преобразование результата (сервер-клиент)

Преобразование параметра (клиент-сервер)

DBTYPE_DBDATE

Datetime

дата

ОК

ОК

DBTYPE_DBTIMESTAMP

Поля времени устанавливаются в нули.

IRowsetChange завершится ошибкой из-за усечения строки, если значение поля времени не равно нулю.

DBTYPE_DBTIME

Time(0)

ОК

ОК

DBTYPE_DBTIMESTAMP

Поля даты устанавливаются в текущую дату.

Если доли секунды не равны нулю, то IRowsetChange завершится ошибкой из-за усечения строки.

Дата не учитывается.

DBTYPE_DBTIME

Time(7)

Ошибка — недопустимый литерал времени.

ОК

DBTYPE_DBTIMESTAMP

Ошибка — недопустимый литерал времени.

ОК

DBTYPE_DBTIMESTAMP

Datetime2(3)

ОК

ОК

DBTYPE_DBTIMESTAMP

Datetime2(7)

ОК

ОК

DBTYPE_DBDATE

Smalldatetime

дата

ОК

ОК

DBTYPE_DBTIMESTAMP

Поля времени устанавливаются в нули.

IRowsetChange завершится ошибкой из-за усечения строки, если значение поля времени не равно нулю.

DBTYPE_DBTIME

Time(0)

ОК

ОК

DBTYPE_DBTIMESTAMP

Поля даты устанавливаются в текущую дату.

Если доли секунды не равны нулю, то IRowsetChange завершится ошибкой из-за усечения строки.

Дата не учитывается.

DBTYPE_DBTIMESTAMP

Datetime2(0)

ОК

ОК

ОК означает, что в случае совместимости с SQL Server 2005, должна быть обеспечена и совместимость с SQL Server 2008.

Учтены только следующие типичные изменения схемы:

  • Использование нового типа, когда логически приложению необходимо только значение даты или времени. Однако, приложение должно использовать datetime или smalldatetime, так как отдельные типы даты и времени были недоступны.

  • Использование нового типа для получения долей секунд c более высокой точностью.

  • Переход на datetime2, так как это предпочтительный тип данных для даты и времени.

Приложения, которые используют метаданные сервера, полученные через ICommandWithParameters::GetParameterInfo или наборы строк схемы, чтобы установить сведения о типе параметра через ICommandWithParameters::SetParameterInfo, завершатся неудачей при преобразованиях клиента, в которых строковое представление исходного типа больше, чем строковое представление типа получателя. Например, если привязка клиента использует DBTYPE_DBTIMESTAMP, а столбец сервера содержит дату, собственный клиент SQL Server преобразует значение « гггг-дд-мм чч:мм:сс:fff», но метаданные сервера будут возвращены как тип nvarchar(10). Результирующее переполнение приводит к DBSTATUS_E_CATCONVERTVALUE. Аналогичные проблемы возникают при преобразовании данных и использованием IRowsetChange, так как метаданные наборов строк установлены из метаданных результирующего набора.

Метаданные параметров и наборов строк

В этом разделе описаны метаданные для параметров, столбцов результатов и наборов строк схемы для клиентов, скомпилированных с версией собственного клиента SQL Server, предшествующего SQL Server 2008.

ICommandWithParameters::GetParameterInfo

Структура DBPARAMINFO возвращает следующие данные через параметр prgParamInfo:

Тип параметра

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

Обратите внимание, что некоторые из этих диапазонов значений не непрерывны; например, 9 отсутствует в 8,10..16. Это происходит из-за добавления десятичного разделителя, когда дробная точность больше нуля.

IColumnsRowset::GetColumnsRowset

Возвращаются следующие столбцы:

Тип столбца

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

Структура DBCOLUMNINFO возвращает следующие данные:

Тип параметра

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

Наборы строк схемы

В этом разделе рассматриваются метаданные для параметров, результирующих столбцов и наборов строк схемы для новых типов данных. Эти сведения полезны, если имеется поставщик клиента, разработанный с использованием инструментов, предшествующих собственному клиенту SQL Server 2008SQL Server.

COLUMNS, набор строк

Для типов даты-времени возвращаются значения следующих столбцов.

Тип столбца

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

Для типов даты-времени возвращаются значения следующих столбцов.

Тип столбца

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

Для типов даты-времени возвращаются следующие строки:

Введите ->

столбцу.

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

ВЕРСИЯ

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

Работа сервера низкого уровня

При подключении к серверу версий, предшествующих SQL Server 2008, любая попытка использовать новые имена типов сервера (например, ICommandWithParameters::SetParameterInfo или ITableDefinition::CreateTable) приведет к DB_E_BADTYPENAME.

Если новые типы привязаны к параметрам или результатам без использования имени типа, и новый тип используется для неявного указания типа сервера или отсутствует допустимое преобразование из типа сервера к типу клиента, возвращается DB_E_ERRORSOCCURRED, а DBBINDSTATUS_UNSUPPORTED_CONVERSION устанавливается как состояние привязки для метода доступа, используемого Execute.

Если существует поддерживаемое клиентское преобразование из типа буфера к типу сервера для версии сервера, с которым установлено соединение, могут быть использованы все типы клиентского буфера. В этом контексте тип сервера означает тип, указанный ICommandWithParameters::SetParameterInfo, или определяемый по типу буфера, если не был вызван ICommandWithParameters::SetParameterInfo. Это означает, что DBTYPE_DBTIME2 и DBTYPE_DBTIMESTAMPOFFSET могут быть использованы с серверами нижнего уровня, или при DataTypeCompatibility=80, если клиентское преобразование к поддерживаемому типу сервера выполнено успешно. Конечно, если тип сервера неверный, сервер может сообщить об ошибке, если не удается выполнить неявное преобразование к фактическому типу сервера.

Поведение SSPROP_INIT_DATATYPECOMPATIBILITY

Если SSPROP_INIT_DATATYPECOMPATIBILITY установлен в значение SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, новые типы данных даты-времени и связанные метаданные представляются клиентам также, как низкоуровневым клиентам, как описано в разделе Изменения в функции массового копирования для работы с улучшенными типами даты-времени (OLE DB и ODBC).

Сравнимость для IRowsetFind

Все операторы сравнения разрешены для новых типов данных даты-времени, так как они отображаются как строковые типы, а не типы даты-времени.

См. также

Основные понятия