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