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


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

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

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

Клиентские приложения, использующие версию SQL Server Native Client до 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 и столбец сервера — date, SQL Server Native Client преобразует значение в "гггг-дд-мм чч:мм:сс.fff", но метаданные сервера будут возвращены как nvarchar(10). В результате переполнение приведет к ошибке DBSTATUS_E_CATCONVERTVALUE. Аналогичные проблемы возникают при преобразовании данных с помощью IRowsetChange, так как метаданные набора строк задаются из метаданных результного набора.

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

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

ICommandWithParameters::GetParameterInfo

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

Тип параметра wType ulParamSize bPrecision bScale
Дата 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
Дата 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
Дата 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 Native Client.

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

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

Тип столбца DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
Дата 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
Дата DBTYPE_WSTR 10 20 Дата
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

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

Тип — >

Столбец
Дата time smalldatetime DATETIME datetime2 datetimeoffset
TYPE_NAME Дата 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 Дата 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

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

См. также:

Улучшения функций даты и времени (OLE DB)