Преобразования, выполняемые при передаче от сервера к клиенту
В данном разделе описываются преобразования даты-времени, выполненные между SQL Server 2008 (или более поздней версией) и клиентским приложением, записанным на OLE DB собственного клиента SQL Server.
Преобразования
В следующей таблице описываются преобразования между типом, возвращенным клиенту, и типом в привязке. Если для выходных параметров был вызван ICommandWithParameters::SetParameterInfo и тип, указанный в pwszDataSourceType, не совпадает с действительным типом на сервере, сервер выполнит неявное преобразование и тип, возвращенный клиенту, будет совпадать с типом, указанным через ICommandWithParameters::SetParameterInfo. Это может привести к неожиданным результатам преобразования, если правила преобразования сервера отличаются от описанных в данном разделе. Например, когда требуется предоставить данные по умолчанию, SQL Server использует 1900-1-1, а не 1899-12-30.
К -> Из |
DATE |
DBDATE |
DBTIME |
DBTIME2 |
DBTIMESTAMP |
DBTIMESTAMPOFFSET |
FILETIME |
BYTES |
VARIANT |
SSVARIANT |
BSTR |
STR |
WSTR |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Date |
1,7 |
ОК |
- |
- |
1 |
1,3 |
1,7 |
- |
OK (VT_BSTR) |
ОК |
ОК |
4 |
4 |
Time |
5,6,7 |
- |
9 |
ОК |
6 |
3,6 |
5,6 |
- |
OK (VT_BSTR) |
ОК |
ОК |
4 |
4 |
Smalldatetime |
7 |
8 |
9,10 |
10 |
ОК |
3 |
7 |
- |
7 (VT_DATE) |
ОК |
ОК |
4 |
4 |
Datetime |
5,7 |
8 |
9,10 |
10 |
ОК |
3 |
7 |
- |
7 (VT_DATE) |
ОК |
ОК |
4 |
4 |
Datetime2 |
5,7 |
8 |
9,10 |
10 |
7 |
3 |
5,7 |
- |
OK (VT_BSTR) |
ОК |
ОК |
4 |
4 |
Datetimeoffset |
5,7,11 |
8,11 |
9,10,11 |
10,11 |
7,11 |
ОК |
5,7,11 |
- |
OK (VT_BSTR) |
ОК |
ОК |
4 |
4 |
Char, Varchar, Nchar, Nvarchar |
7, 13 |
12 |
12,9 |
12 |
12 |
12 |
7,13 |
Недоступно |
Недоступно |
Недоступно |
Недоступно |
Недоступно |
Недоступно |
Sql_variant (datetime) |
7 |
8 |
9,10 |
10 |
ОК |
3 |
7 |
- |
7 (VT_DATE) |
ОК |
ОК |
4 |
4 |
Sql_variant (smalldatetime) |
7 |
8 |
9,10 |
10 |
ОК |
3 |
7 |
- |
7 (VT_DATE) |
ОК |
ОК |
4 |
4 |
Sql_variant (date) |
1,7 |
ОК |
2 |
2 |
1 |
1,3 |
1,7 |
- |
OK (VT_BSTR) |
ОК |
ОК |
4 |
4 |
Sql_variant (time) |
5,6,7 |
2 |
6 |
ОК |
6 |
3,6 |
5,6 |
- |
OK (VT_BSTR) |
ОК |
ОК |
4 |
4 |
Sql_variant (datetime2) |
5,7 |
8 |
9,10 |
10 |
ОК |
3 |
5,7 |
- |
OK (VT_BSTR) |
ОК |
ОК |
4 |
4 |
Sql_variant (datetimeoffset) |
5,7,11 |
8,11 |
9,10,11 |
10,11 |
7,11 |
ОК |
5,7,11 |
- |
OK (VT_BSTR) |
ОК |
ОК |
4 |
4 |
Расшифровка символов
Знак |
Смысл |
|---|---|
ОК |
Никаких преобразований не требуется. |
- |
Преобразование не поддерживается. Если проверка связывания осуществляется при вызове IAccessor::CreateAccessor, то в параметре rgStatus возвращается значение DBBINDSTATUS_UPSUPPORTEDCONVERSION. Если проверка метода доступа является отложенной, то устанавливается значение DBSTATUS_E_BADACCESSOR. |
1 |
Поля времени установлены в нуль. |
2 |
Установлено значение DBSTATUS_E_CANTCONVERTVALUE. |
3 |
Часовой пояс установлен в нуль. |
4 |
Если буфер клиента недостаточно большой, устанавливается значение DBSTATUS_S_TRUNCATED. Если тип сервера включает доли секунд, то число цифр в результирующей строке точно совпадает с масштабом типа сервера. |
5 |
Усечение секунд или долей секунд игнорируется. |
6 |
Дата устанавливается на текущую, за исключением случая, когда источник является строковым литералом времени и назначение — DBTYPE_DATE. В этом случае используется 1899-12-30. |
7 |
При превышении значения устанавливается значение DBSTATUS_E_DATAOVERFLOW. |
8 |
Поля времени не учитываются. |
9 |
Поля долей секунд игнорируются. |
10 |
Компонент даты не учитывается. |
11 |
Время приводится к часовому поясу клиента. Если во время преобразования происходит ошибка, то устанавливается значение DBSTATUS_E_DATAOVERFLOW. |
12 |
Строка анализируется как литерал ISO и преобразуется в целевой тип. Если попытка оказалась неудачной, то строка анализируется как литерал даты OLE (который также содержит компоненты времени) и преобразуется из даты OLE (DBTYPE_DATE) в целевой тип. Для успешного выполнения синтаксического анализа формата ISO, строка должна соответствовать синтаксису допускаемых литералов целевого типа. Условием успешного синтаксического анализа OLE является соответствие строки синтаксису, распознаваемому OLE. Если не удалось выполнить синтаксический анализ строки, то устанавливается значение DBSTATUS_E_CANTCONVERTVALUE. Если значения каких-либо компонентов выходят за пределы диапазона, то устанавливается значение DBSTATUS_E_DATAOVERFLOW. |
13 |
Строка анализируется как литерал ISO и преобразуется в целевой тип. Если попытка оказалась неудачной, то строка анализируется как литерал даты OLE (который также содержит компоненты времени) и преобразуется из даты OLE (DBTYPE_DATE) в целевой тип. Строка должна соответствовать синтаксису литералов типа datetime, за исключением случаев, когда назначением является DBTYPE_DATE или DBTYPE_DBTIMESTAMP. В этом случае для успешного завершения синтаксического анализа формата ISO допускаются литералы типа datetime или time. Условием успешного синтаксического анализа OLE является соответствие строки синтаксису, распознаваемому OLE. Если не удалось выполнить синтаксический анализ строки, то устанавливается значение DBSTATUS_E_CANTCONVERTVALUE. Если значения каких-либо компонентов выходят за пределы диапазона, то устанавливается значение DBSTATUS_E_DATAOVERFLOW. |