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


Преобразования, выполняемые при передаче от клиента к серверу

В этом разделе объясняются преобразования даты и времени, которые выполняются между клиентским приложением, написанным с помощью поставщика OLE DB для собственного клиента SQL Server, и SQL Server 2008 (или более поздней версией).

Преобразования

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

Если не вызывается метод ICommandWithParameters::SetParameterInfo, привязки DBTYPE_DBTIMESTAMP преобразовываются, как если бы они имели тип datetime2.

К ->

Из

DBDATE (date)

DBTIME (time)

DBTIME2 (time)

DBTIMESTAMP (smalldatetime)

DBTIMESTAMP (smalldatetime)

DBTIMESTAMP (datetime2)

DBTIMESTAMPOFFSET (datetimeoffset)

STR

WSTR

SQLVARIANT

(sql_variant)

DATE

1,2

1,3,4

4,12

1,12

1,12

1,12

1,5, 12

1,12

1,12

1,12

datetime2(0)

DBDATE

1

-

-

1,6

1,6

1,6

1,5, 6

1,10

1,10

1

date

DBTIME

-

1

1

1,7

1,7

1,7

1,5, 7

1,10

1,10

1

Time(0)

DBTIME2

-

1,3

1

1,7,10,14

1,7,10,15

1,7,10

1,5,7,10

1,10,11

1,10,11

1

Time(7)

DBTIMESTAMP

1,2

1,3,4

1,4,10

1,10,14

1,10,15

1,10

1,5,10

1,10,11

1,10,11

1,10

datetime2(7)

DBTIMESTAMPOFFSET

1,2,8

1,3,4,8

1,4,8,10

1,8,10,14

1,8,10,15

1,8,10

1,10

1,10,11

1,10,11

1,10

datetimeoffset(7)

FILETIME

1,2

1,3,4

1,4,13

1,13

1,13

1,13

1,5,13

1,13

1,10

1,13

datetime2(3)

BYTES

-

-

-

-

-

-

-

Недоступно

Недоступно

Недоступно

VARIANT

1

1

1

1,10

1,10

1,10

1,10

Недоступно

Недоступно

1,10

SSVARIANT

1,16

1,16

1,16

1,10,16

1,10,16

1,10,16

1,10,16

Недоступно

Недоступно

1,16

BSTR

1,9

1,9

1,9,10

1,9,10

1,9,10

1,9,10

1,9,10

Недоступно

Недоступно

Недоступно

STR

1,9

1,9

1,9,10

1,9,10

1,9,10

1,9,10

1,9,10

Недоступно

Недоступно

Недоступно

WSTR

1,9

1,9

1,9,10

1,9,10

1,9,10

1,9,10

1,9,10

Недоступно

Недоступно

Недоступно

Расшифровка символов

Знак

Смысл

-

Преобразование не поддерживается. Если проверка связывания осуществляется при вызове IAccessor::CreateAccessor, то в параметре rgStatus возвращается значение DBBINDSTATUS_UPSUPPORTEDCONVERSION. Если проверка метода доступа является отложенной, то устанавливается значение DBSTATUS_E_BADACCESSOR.

Недоступно

Неприменимо.

1

Если поддерживаемые данные недопустимы, возвращается DBSTATUS_E_CANTCONVERTVALUE. Входные данные проверяются до применения преобразований, поэтому даже если компонент будет пропущен последующим преобразованием, он должен иметь допустимое значение, чтобы преобразование завершилось успешно.

2

Поля времени не учитываются.

3

Доли секунды должны иметь нулевое значение, иначе возвращается DBSTATUS_E_DATAOVERFLOW.

4

Компонент даты не учитывается.

5

Часовой пояс устанавливается в соответствии с часовым поясом клиента.

6

Время установлено в нуль.

7

Дата устанавливается в текущую дату.

8

Время преобразуется в формат UTC. Если во время преобразования происходит ошибка, возвращается DBSTATUS_E_CANTCONVERTVALUE.

9

Строка анализируется как литерал ISO и преобразуется в целевой тип. Если попытка оказалась неудачной, то строка анализируется как литерал даты OLE (который также содержит компоненты времени) и преобразуется из даты OLE (DBTYPE_DATE) в целевой тип.

Если целевым типом является DBTIMESTAMP, smalldatetime, datetime или datetime2, строка должна соответствовать синтаксису литералов для даты времени или datetime2 либо синтаксису, распознаваемому OLE. Если строка является литералом даты, все компоненты времени принимают нулевое значение. Если строка является литералом времени, дата устанавливается на текущую дату.

Для всех других типов строка должна соответствовать синтаксису литералов целевого типа.

10

Если усечение долей секунды происходит с потерей данных, возвращается DBSTATUS_E_DATAOVERFLOW. Проверка переполнения при преобразовании строк возможна, только если строка соответствует синтаксису ISO. Если строка является литералом даты OLE, доли секунды округляются.

11

Количество знаков долей секунды (масштаб) определяется по размеру столбца назначение согласно следующей таблице. Для размеров столбцов, превышающих диапазон в таблице, подразумевается масштаб 9. Это преобразование позволяет передавать доли секунд с точностью до девяти значащих цифр — максимум, поддерживаемый OLE DB.

Однако если исходный тип DBTIMESTAMP, а доли секунды равны нулю, не формируются ни знаки долей секунды, ни десятичная запятая. Такое поведение гарантирует обратную совместимость для приложений, использующих более старые версии поставщиков OLE DB.

Длина столбца ~0 подразумевает неограниченный размер в OLE DB (9 знаков, если для DBTIMESTAMP не применяется правило 3 знаков).

ТипДлина (в символах)Масштаб
DBTIME28, 10..180,1..9
DBTIMESTAMP19, 21..290,1..9
DBTIMESTAMPOFFSET26, 28..360,1..9

12

Поддерживается семантика преобразования версий ранее SQL Server 2008 для типа DBTYPE_DATE. Доли секунды усекаются до нуля.

13

Поддерживается семантика преобразования версий ранее SQL Server 2008 для типа DBTYPE_FILETIME. Если используется API-интерфейс Windows FileTimeToSystemTime, точность долей секунды ограничивается 1 миллисекундой.

14

Поддерживается семантика преобразования версий ранее SQL Server 2008 для типа smalldatetime. Секундам присваивается нулевое значение.

15

Поддерживается семантика преобразования версий ранее SQL Server 2008 для типа datetime. Секунды округляются до ближайшей 300-ой секунды.

16

Поведение преобразования значения (конкретного типа), встроенное в клиентскую структуру SSVARIANT, – то же, что и поведение того же значения с тем же типом, не встроенного в структуру SSVARIANT.

См. также

Основные понятия