Microsoft предоставляет поддержку для клиентов нижнего уровня путем приведения DateTimeOffset к типу строки.
Это означает, что, где Provider=SQLOLEDB
, DateTimeOffset будет возвращен как строка.(Это объясняет, почему мне удалось получить доступ к полю с помощью классического ASP).
Если вы используете более новый поставщик, такой как поставщик OLE DB для собственного клиента SQL Server 10.0 (Provider=SQLNCLI10
), вы 'Понадобится другой подход.
Самый простой подход - привести к varchar в операторе SELECT:
SELECT CAST(SYSDATETIMEOFFSET() AS VARCHAR(34))
Альтернативой является использование VARIANT
для доступа к значению в виде двойного(dblVal
) и конвертировать из этого.Например:
HRESULT hRes = pRecordset.CreateInstance(__uuidof(Recordset));
FieldPtr fieldPtr = pRecordset->Fields->GetItem(bstrFieldName);
VARIANT v;
VariantInit(&v);
fieldPtr->get_Value(&v);
_bstr_t bstrTime = v.bstrVal;
VariantClear(&v);
Однако мне неизвестна библиотека, которая преобразует представление с плавающей запятой во что-то более полезное, поэтому здесь нужно выполнить дополнительную работу.