Sql server 如何在Visual C++应用程序中读取MSSQL DATETMEOBACK列? 我有一个Visual C++ MFC应用程序,使用ADO访问微软SQL Server数据库。我想开始使用DateTimeOffset列,但出现了一个异常

Sql server 如何在Visual C++应用程序中读取MSSQL DATETMEOBACK列? 我有一个Visual C++ MFC应用程序,使用ADO访问微软SQL Server数据库。我想开始使用DateTimeOffset列,但出现了一个异常,sql-server,visual-c++,ado,datetimeoffset,Sql Server,Visual C++,Ado,Datetimeoffset,下面是一段代码片段: HRESULT hRes = pRecordset.CreateInstance(__uuidof(Recordset)); FieldPtr fieldPtr = pRecordset->Fields->GetItem(bstrFieldName); DataTypeEnum type = fieldPtr->Type; _variant_t vFieldValue = fieldPtr->Value; 将值赋给变量会抛出0x80020008错误

下面是一段代码片段:

HRESULT hRes = pRecordset.CreateInstance(__uuidof(Recordset));
FieldPtr fieldPtr = pRecordset->Fields->GetItem(bstrFieldName);
DataTypeEnum type = fieldPtr->Type;
_variant_t vFieldValue = fieldPtr->Value;
将值赋给变量会抛出0x80020008错误的变量类型

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

如何访问此列?

Microsoft通过将DateTimeOffset强制转换为字符串类型提供

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

如果您使用的是较新的提供程序,如SQL Server Native Client 10.0 OLE DB provider 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);
但是,我不知道有哪种库可以将浮点表示转换为更有用的形式,因此还有一些额外的工作要做。

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

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

如果您使用的是较新的提供程序,如SQL Server Native Client 10.0 OLE DB provider 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);
但是,我不知道有哪一个库可以将浮点表示转换成更有用的形式,因此还有一些额外的工作要做