Новые функции даты-времени с предыдущими версиями 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
Все операторы сравнения разрешены для новых типов данных даты-времени, так как они отображаются как строковые типы, а не типы даты-времени.