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


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

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

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

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

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

В ->

Из

DBDATE (date)

DBTIME (time)

DBTIME2 (time)

DBTIMESTAMP (smalldatetime)

DBTIMESTAMP (datetime)

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, строка должна соответствовать синтаксису литералов типа date, time или datetime2 либо синтаксису, распознаваемому OLE. Если строка является литералом типа date, все компоненты времени принимают нулевое значение. Если строка является литералом типа time, дата устанавливается в текущую дату.

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

10

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

Для преобразования DBTIMESTAMP (datetime) в smalldatetime собственный клиент SQL Server усекает значение секунд, не выдавая сообщения об этом, вместо вызова ошибки DBSTATUS_E_DATAOVERFLOW.

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.

См. также

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