【问题标题】:How do I read a MSSQL DateTimeOffset column in a Visual C++ application?如何在 Visual C++ 应用程序中读取 MSSQL DateTimeOffset 列?
【发布时间】:2011-07-19 15:09:02
【问题描述】:

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

这是一个代码sn-p:

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 对于 DateTimeOffset 字段是 146。可以理解,由于 ADO 2.8 可能早于这种列类型,所以 146 不在 DataTypeEnum 中。但是,我知道我可以在经典的 ASP(也是 ADO 2.8)中访问这些字段。

如何访问此列?

【问题讨论】:

    标签: sql-server visual-c++ ado datetimeoffset


    【解决方案1】:

    Microsoft 通过将 DateTimeOffset 转换为字符串类型来提供 support for downlevel clients

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多