Как прочитать столбец MSSQL DateTimeOffset в приложении Visual C ++? - PullRequest
1 голос
/ 19 июля 2011

У меня есть приложение Visual C ++ (MFC), использующее ADO для доступа к базе данных Microsoft SQL Server.Я хотел бы начать использовать столбцы DateTimeOffset, но получаю исключение.

Вот фрагмент кода:

HRESULT hRes = pRecordset.CreateInstance(__uuidof(Recordset));
FieldPtr fieldPtr = pRecordset->Fields->GetItem(bstrFieldName);
DataTypeEnum type = fieldPtr->Type;
_variant_t vFieldValue = fieldPtr->Value;

Назначение Value для _variant_t бросков 0x80020008 Bad variable type.

fieldPtr->Type равно 146 для полей DateTimeOffset.Понятно, что поскольку ADO 2.8 предположительно предшествует этому типу столбца, 146 отсутствует в DataTypeEnum.Однако я знаю, что могу получить доступ к этим полям в классическом ASP, который также является ADO 2.8.

Как получить доступ к этому столбцу?

1 Ответ

1 голос
/ 17 октября 2011

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);

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

...