2011-07-19 4 views
1

私はVisual C++(MFC)アプリケーションを使用してMicrosoft SQL Serverデータベースにアクセスします。 DateTimeOffset列の使用を開始したいが、例外が発生する。 _variant_t0x80020008 Bad variable typeスローにValueを割り当てるVisual C++アプリケーションでMSSQL DateTimeOffset列を読み取るにはどうすればよいですか?

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

は、ここでは、コードスニペットです。

fieldPtr->Typeは、DateTimeOffsetフィールドでは146です。おそらく、ADO 2.8はおそらくこの列の型よりも前になっているので、146はDataTypeEnumにはありません。しかし、私はADO 2.8である従来のASPでこれらのフィールドにアクセスできることを知っています。

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

答えて

1

マイクロソフトでは、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)) 

代替は、二重(dblVal)としての価値にアクセスし、そこから変換するにはVARIANTを使用することです。例:

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

しかし、私は浮動小数点表現をより有用なものに変換するライブラリを認識していないので、そこでいくつかの追加作業があります。

関連する問題