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

Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)

Скачать драйвер OLE DB

В этой статье приведены сведения о следующем типе и элементах типа, связанных с усовершенствованиями даты и времени OLE DB.

  • Структура DBBINDING

  • ICommandWithParameters::GetParameterInfo

  • ICommandWithParameters::SetParameterInfo

  • IColumnsRowset::GetColumnsRowset

  • IColumnsInfo::GetColumnInfo

ICommandWithParameters::GetParameterInfo

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

Тип параметра wType ulParamSize bPrecision bScale dwFlags

DBPARAMFLAGS_SS_ISVARIABLESCALE
Дата DBTYPE_DBDATE 6 10 0 Clear
time DBTYPE_DBTIME2 10 8, 10..16 0..7 Присвойте параметру
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0 Clear
DATETIME DBTYPE_DBTIMESTAMP 16 23 3 Clear
datetime2 DBTYPE_DBTIMESTAMP 16 19, 21..27 0..7 Присвойте параметру
datetimeoffset DBTYPE_DBTIMESTAMPOFFSET 20 26, 28..34 0..7 Присвойте параметру

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

DBPARAMFLAGS_SS_ISVARIABLESCALE действителен только при подключении к серверу под управлением SQL Server 2008 (10.0.x) и более поздних версий. DBPARAMFLAGS_SS_ISVARIABLESCALE никогда не задается при соединении с серверами низкого уровня.

Метод ICommandWithParameters::SetParameterInfo и неявные типы параметров

Сведения, предоставленные в структуре DBPARAMBINDINFO, должны соответствовать следующим требованиям.

pwszDataSourceType

(зависит от поставщика)
pwszDataSourceType

(OLE DB, обычный)
ulParamSize bScale
DBTYPE_DATE 6 Не учитывается
Дата DBTYPE_DBDATE 6 Не учитывается
DBTYPE_DBTIME 10 Не учитывается
time DBTYPE_DBTIME2 10 0..7
smalldatetime 16 Не учитывается
DATETIME 16 Не учитывается
datetime2 или DBTYPE_DBTIMESTAMP DBTYPE_DBTIMESTAMP 16 0..7
datetimeoffset DBTYPE_DBTIMESTAMPOFFSET 20 0..7

Параметр bPrecision не учитывается.

Значение «DBPARAMFLAGS_SS_ISVARIABLESCALE» не учитывается при отправке данных на сервер. Приложения могут принудительно использовать унаследованные типы потоков табличных данных за счет применения имен типов "datetime" и "smalldatetime", характерных для поставщика. При подключении к серверам под управлением SQL Server 2008 (10.0.x) и более поздних версий будет использоваться формат datetime2, и при необходимости произойдет неявное преобразование сервера, если имя типа — datetime2 или DBTYPE_DBTIMESTAMP. Параметр bScale не учитывается, если используются имена типов "datetime" или "smalldatetime" для конкретного поставщика. В противном случае приложения должны следить за правильностью значений bScale. Приложения, обновленные из MDAC, и OLE DB Driver for SQL Server из SQL Server 2005 (9.x), которые используют DBTYPE_DBTIMESTAMP, не будут работать с неправильным значением параметра bScale. При подключении к экземплярам сервера, предшествующим SQL Server 2008 (10.0.x), значение bScale, отличное от 0 или 3, с DBTYPE_DBTIMESTAMP является ошибкой, и возвращается E_FAIL.

Если ICommandWithParameters::SetParameterInfo не вызывается, поставщик выводит тип сервера по типу привязки, который указан в IAccessor::CreateAccessor, как описано ниже.

Тип привязки pwszDataSourceType

(зависит от поставщика)
DBTYPE_DATE datetime2(0)
DBTYPE_DBDATE Дата
DBTYPE_DBTIME time(0)
DBTYPE_DBTIME2 time(7)
DBTYPE_DBTIMESTAMP datetime2(7)
DBTYPE_DBTIMESTAMPOFFSET datetimeoffset(7)

IColumnsRowset::GetColumnsRowset

IColumnsRowset::GetColumnsRowset возвращает следующие столбцы.

Тип столбца DBCOLUMN_TYPE DBCOLUM_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION DBCOLUMN_FLAGS, DBCOLUMNFLAGS_SS_ISVARIABLESCALE
Дата DBTYPE_DBDATE 6 10 0 Clear
time DBTYPE_DBTIME2 10 8, 10..16 0..7 Присвойте параметру
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0 Clear
DATETIME DBTYPE_DBTIMESTAMP 16 23 3 Clear
datetime2 DBTYPE_DBTIMESTAMP 16 19, 21..27 0..7 Присвойте параметру
datetimeoffset DBTYPE_DBTIMESTAMPOFFSET 20 26, 28..34 0..7 Присвойте параметру

В DBCOLUMN_FLAGS, DBCOLUMNFLAGS_ISFIXEDLENGTH всегда имеет значение TRUE для типов даты-времени, а следующие флаги всегда имеют значение FALSE.

  • DBCOLUMNFLAGS_CACHEDEFERRED

  • DBCOLUMNFLAGS_ISBOOKMARK

  • DBCOLUMNFLAGS_ISCHAPTER

  • DBCOLUMNFLAGS_ISLONG

  • DBCOLUMNFLAGS_ISROWID

  • DBCOLUMNFLAGS_ISROWVER

  • DBCOLUMNFLAGS_MAYDEFER

Остальные флаги (DBCOLUMNFLAGS_ISNULLABLE, DBCOLUMNFLAGS_MAYBENULL, DBCOLUMNFLAGS_WRITE и DBCOLUMNFLAGS_WRITEUNKNOWN) можно задать в зависимости от того, как определен столбец, а также от фактического запроса.

В DBCOLUMN_FLAGS новый флаг DBCOLUMNFLAGS_SS_ISVARIABLESCALE внедрен, чтобы приложения могли определять тип сервера столбцов, где DBCOLUMN_TYPE является DBTYPE_DBTIMESTAMP. Также должен использоваться флаг DBCOLUMN_SCALE или DBCOLUMN_DATETIMEPRECISION для указания типа сервера.

DBCOLUMNFLAGS_SS_ISVARIABLESCALE действителен только при подключении к серверу под управлением SQL Server 2008 (10.0.x) и более поздних версий. При соединении с серверами низкого уровня флаг DBCOLUMNFLAGS_SS_ISVARIABLESCALE остается неопределенным.

IColumnsInfo::GetColumnInfo

Структура DBCOLUMNINFO возвращает следующие данные.

Тип параметра wType ulColumnSize bPrecision bScale dwFlags

DBPARAMFLAGS_SS_ISVARIABLESCALE
Дата DBTYPE_DBDATE 6 10 0 Clear
time(1..7) DBTYPE_DBTIME2 10 8, 10..16 0..7 Присвойте параметру
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0 Clear
DATETIME DBTYPE_DBTIMESTAMP 16 23 3 Clear
datetime2 DBTYPE_DBTIMESTAMP 16 19, 21..27 0..7 Присвойте параметру
datetimeoffset DBTYPE_DBTIMESTAMPOFFSET 20 26, 28..34 0..7 Присвойте параметру

В dwFlags флаг DBCOLUMNFLAGS_ISFIXEDLENGTH всегда имеет значение TRUE для типов даты и времени, а следующие флаги всегда имеют значение FALSE:

  • DBCOLUMNFLAGS_CACHEDEFERRED

  • DBCOLUMNFLAGS_ISBOOKMARK

  • DBCOLUMNFLAGS_ISCHAPTER

  • DBCOLUMNFLAGS_ISLONG

  • DBCOLUMNFLAGS_ISROWID

  • DBCOLUMNFLAGS_ISROWVER, MAYDEFER

Остальные флаги (DBCOLUMNFLAGS_ISNULLABLE, DBCOLUMNFLAGS_MAYBENULL, DBCOLUMNFLAGS_WRITE и DBCOLUMNFLAGS_WRITEUNKNOWN) можно задавать.

В dwFlags предусмотрен новый флаг DBCOLUMNFLAGS_SS_ISVARIABLESCALE, чтобы приложения могли определять тип сервера столбцов, где wType является DBTYPE_DBTIMESTAMP. Кроме того, для определения типа сервера необходимо использовать bScale.

См. также:

Улучшения поддержки типов данных даты и времени OLE DB