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