1

我有一个使用 ADO 访问 Microsoft SQL Server 数据库的 Visual C++ (MFC) 应用程序。我想开始使用 DateTimeOffset 列,但我遇到了一个异常。

这是一个代码片段:

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

分配Value_variant_tthrows 0x80020008 Bad variable type

fieldPtr->TypeDateTimeOffset 字段为 146。可以理解,由于 ADO 2.8 可能早于这种列类型,因此 146 不在DataTypeEnum. 但是,我知道我可以在经典的 ASP(也是 ADO 2.8)中访问这些字段。

如何访问此列?

4

1 回答 1

1

Microsoft通过将 DateTimeOffset 转换为字符串类型来为下级客户端提供支持。

这意味着 where Provider=SQLOLEDB, DateTimeOffset 将作为字符串返回。(这解释了为什么我能够使用经典 ASP 成功访问该字段)。

如果您使用的是更新的提供程序,例如 SQL Server Native Client 10.0 OLE DB 提供程序 ( Provider=SQLNCLI10),您将需要不同的方法。

最简单的方法是在 SELECT 语句中转换为 varchar:

SELECT CAST(SYSDATETIMEOFFSET() AS VARCHAR(34))

另一种方法是使用VARIANT以 double ( 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);

但是,我不知道有一个库可以将浮点表示转换为更有用的东西,所以还有一些额外的工作要做。

于 2011-10-17T19:17:49.610 回答