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;

throwsValueへの割り当て。_variant_t0x80020008 Bad variable type

fieldPtr->TypeDateTimeOffset フィールドの場合は 146 です。当然のことながら、ADO 2.8 はおそらくこの列の型よりも前のものであるため、146 はDataTypeEnum. ただし、ADO 2.8 でもある従来の ASP でこれらのフィールドにアクセスできることはわかっています。

この列にアクセスするにはどうすればよいですか?

4

1 に答える 1

1

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として、 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 に答える