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


Новые функции даты-времени с предыдущими версиями SQL Server (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 преобразует значение в формат «гггг-дд-мм чч:мм:сс:ттт», но метаданные сервера будут возвращены как значение типа 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

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

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 2008 SQL 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

VERSION

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

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

См. также

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